Vulkan Memory Allocator
|
Device extensions VK_EXT_buffer_device_address / VK_KHR_buffer_device_address allow to fetch raw GPU pointer to a buffer and pass it for usage in a shader code. They are promoted to core Vulkan 1.2.
If you want to use this feature in connection with VMA, follow these steps:
1) (For Vulkan version < 1.2) Call vkEnumerateDeviceExtensionProperties
for the physical device. Check if the extension is supported - if returned array of VkExtensionProperties
contains "VK_EXT_buffer_device_address" or "VK_KHR_buffer_device_address".
2) Call vkGetPhysicalDeviceFeatures2
for the physical device instead of old vkGetPhysicalDeviceFeatures
. Attach additional structure VkPhysicalDeviceBufferDeviceAddressFeatures*
to VkPhysicalDeviceFeatures2::pNext
to be returned. Check if the device feature is really supported - check if VkPhysicalDeviceBufferDeviceAddressFeatures*::bufferDeviceAddress
is true.
3) (For Vulkan version < 1.2) While creating device with vkCreateDevice
, enable this extension - add "VK_EXT_buffer_device_address" or "VK_KHR_buffer_device_address" to the list passed as VkDeviceCreateInfo::ppEnabledExtensionNames
.
4) While creating the device, also don't set VkDeviceCreateInfo::pEnabledFeatures
. Fill in VkPhysicalDeviceFeatures2
structure instead and pass it as VkDeviceCreateInfo::pNext
. Enable this device feature - attach additional structure VkPhysicalDeviceBufferDeviceAddressFeatures*
to VkPhysicalDeviceFeatures2::pNext
and set its member bufferDeviceAddress
to VK_TRUE
.
5) While creating VmaAllocator with vmaCreateAllocator() inform VMA that you have enabled this feature - add VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT to VmaAllocatorCreateInfo::flags.
After following steps described above, you can create buffers with VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT
using VMA. The library automatically adds VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR
to allocated memory blocks wherever it might be needed.
Please note that the library supports only VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT
. The second part of this functionality related to "capture and replay" is not supported, as it is intended for usage in debugging tools like RenderDoc, not in everyday Vulkan usage.
To learn more about this extension, see VK_KHR_buffer_device_address in Vulkan specification
Example use of this extension can be found in the code of the sample and test suite accompanying this library.