VK_KHR_buffer_device_address
Other Extension Metadata
Last Modified Date
2019-06-24
IP Status
No known IP claims.
Interactions and External Dependencies
- This extension provides API support for
GL_EXT_buffer_reference
andGL_EXT_buffer_reference2
andGL_EXT_buffer_reference_uvec2
Contributors
- Jeff Bolz, NVIDIA
- Neil Henning, AMD
- Tobias Hector, AMD
- Faith Ekstrand, Intel
- Baldur Karlsson, Valve
- Jan-Harald Fredriksen, Arm
Description
This extension allows the application to query a 64-bit buffer device
address value for a buffer, which can be used to access the buffer memory
via the PhysicalStorageBuffer
storage class in the
GL_EXT_buffer_reference
GLSL extension and
SPV_KHR_physical_storage_buffer
SPIR-V extension.
Another way to describe this extension is that it adds pointers to buffer memory in shaders
.
By calling vkGetBufferDeviceAddress with a VkBuffer
, it will
return a VkDeviceAddress value which represents the address of the
start of the buffer.
vkGetBufferOpaqueCaptureAddress and
vkGetDeviceMemoryOpaqueCaptureAddress allow opaque addresses for
buffers and memory objects to be queried for the current process.
A trace capture and replay tool can then supply these addresses to be used
at replay time to match the addresses used when the trace was captured.
To enable tools to insert these queries, new memory allocation flags must be
specified for memory objects that will be bound to buffers accessed via the
PhysicalStorageBuffer
storage class.
Note that this mechanism is intended only to support capture/replay tools,
and is not recommended for use in other applications.
Promotion to Vulkan 1.2
All functionality in this extension is included in core Vulkan 1.2, with the
KHR suffix omitted.
However, if Vulkan 1.2 is supported and this extension is not, the
bufferDeviceAddress
feature is optional.
The original type, enum, and command names are still available as aliases of
the core functionality.
Promotion to Vulkan 1.3
Support for the bufferDeviceAddress
feature is mandatory in Vulkan 1.3,
regardless of whether this extension is supported.
New Commands
- vkGetBufferDeviceAddressKHR
- vkGetBufferOpaqueCaptureAddressKHR
- vkGetDeviceMemoryOpaqueCaptureAddressKHR
New Structures
- VkBufferDeviceAddressInfoKHR
- VkDeviceMemoryOpaqueCaptureAddressInfoKHR
- Extending VkBufferCreateInfo:
- Extending VkMemoryAllocateInfo:
- Extending VkPhysicalDeviceFeatures2, VkDeviceCreateInfo:
New Enum Constants
VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME
VK_KHR_BUFFER_DEVICE_ADDRESS_SPEC_VERSION
- Extending VkBufferCreateFlagBits:
VK_BUFFER_CREATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR
- Extending VkBufferUsageFlagBits:
VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT_KHR
- Extending VkMemoryAllocateFlagBits:
VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT_KHR
VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_CAPTURE_REPLAY_BIT_KHR
- Extending VkResult:
VK_ERROR_INVALID_OPAQUE_CAPTURE_ADDRESS_KHR
- Extending VkStructureType:
VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO_KHR
VK_STRUCTURE_TYPE_BUFFER_OPAQUE_CAPTURE_ADDRESS_CREATE_INFO_KHR
VK_STRUCTURE_TYPE_DEVICE_MEMORY_OPAQUE_CAPTURE_ADDRESS_INFO_KHR
VK_STRUCTURE_TYPE_MEMORY_OPAQUE_CAPTURE_ADDRESS_ALLOCATE_INFO_KHR
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BUFFER_DEVICE_ADDRESS_FEATURES_KHR
New SPIR-V Capabilities
Examples
There are various use cases this extensions is designed for. It is required for ray tracing, useful for DX12 portability, and it allows storing buffer addresses in memory (enabling creating more complex data structures).
This extension can also be used to hardcode a dedicated debug channel into all shaders without impacting other descriptor limits by querying a buffer device address at startup and pushing that into shaders as a runtime constant (e.g. specialization constant).
There are examples of usage in the
GL_EXT_buffer_reference
spec for how to use this in a high-level shading language such as GLSL.
The
GL_EXT_buffer_reference2
and
GL_EXT_buffer_reference_uvec2
extensions were added to help cover a few edge cases missed by the original
GL_EXT_buffer_reference
.
Version History
- Revision 1, 2019-06-24 (Jan-Harald Fredriksen)
- Internal revisions based on VK_EXT_buffer_device_address