| // Copyright 2016-2021 The Khronos Group, Inc. |
| // |
| // SPDX-License-Identifier: CC-BY-4.0 |
| |
| include::{generated}/meta/{refprefix}VK_KHR_buffer_device_address.txt[] |
| |
| === Other Extension Metadata |
| |
| *Last Modified Date*:: |
| 2019-06-24 |
| *IP Status*:: |
| No known IP claims. |
| *Interactions and External Dependencies*:: |
| - Promoted to Vulkan 1.2 Core |
| - This extension requires |
| {spirv}/KHR/SPV_KHR_physical_storage_buffer.html[`SPV_KHR_physical_storage_buffer`] |
| - This extension provides API support for |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`] |
| and |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference2.txt[`GL_EXT_buffer_reference2`] |
| and |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference_uvec2.txt[`GL_EXT_buffer_reference_uvec2`] |
| *Contributors*:: |
| - Jeff Bolz, NVIDIA |
| - Neil Henning, AMD |
| - Tobias Hector, AMD |
| - Jason 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 code:PhysicalStorageBuffer storage class in the |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`] |
| GLSL extension and |
| {spirv}/KHR/SPV_KHR_physical_storage_buffer.html[`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 flink:vkGetBufferDeviceAddress with a sname:VkBuffer, it will |
| return a basetype:VkDeviceAddress value which represents the address of the |
| start of the buffer. |
| |
| flink:vkGetBufferOpaqueCaptureAddress and |
| flink: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 |
| code:PhysicalStorageBuffer storage class. |
| Note that this mechanism is intended only to support capture/replay tools, |
| and is not recommended for use in other applications. |
| |
| There are various use cases this extension is designed for. |
| It is required for ray tracing, useful for DX12 portability, and by allowing |
| buffer addresses to be stored in memory it enables more complex data |
| structures to be created. |
| |
| This extension can also be used to hardcode a dedicated debug channel into |
| all shaders by querying a pointer at startup and pushing that into shaders |
| as a run-time constant (e.g. specialization constant) that avoids impacting |
| other descriptor limits. |
| |
| There are examples of usage in the |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`] |
| spec for how to use this in a high-level shading language such as GLSL. |
| The |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference2.txt[`GL_EXT_buffer_reference2`] |
| and |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference_uvec2.txt[`GL_EXT_buffer_reference_uvec2`] |
| extensions were also added to help cover a few additional edge cases. |
| |
| === 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 |
| code:bufferDeviceAddress capability is optional. |
| The original type, enum and command names are still available as aliases of |
| the core functionality. |
| |
| include::{generated}/interfaces/VK_KHR_buffer_device_address.txt[] |
| |
| === New SPIR-V Capabilities |
| |
| * <<spirvenv-capabilities-table-PhysicalStorageBufferAddresses,code:PhysicalStorageBufferAddresses>> |
| |
| === Version History |
| |
| * Revision 1, 2019-06-24 (Jan-Harald Fredriksen) |
| - Internal revisions based on VK_EXT_buffer_device_address |
| |
| ifdef::isrefpage[] |
| |
| === 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 |
| strcutures). |
| |
| 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 run-time |
| constant (e.g. specialization constant). |
| |
| There are examples of usage in the |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference.txt[`GL_EXT_buffer_reference`] |
| spec for how to use this in a high-level shading language such as GLSL. |
| The |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference2.txt[`GL_EXT_buffer_reference2`] |
| and |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/ext/GLSL_EXT_buffer_reference_uvec2.txt[`GL_EXT_buffer_reference_uvec2`] |
| extensions were added to help cover a few edge cases missed by the original |
| `GL_EXT_buffer_reference`. |
| |
| It is important to also be aware that the capture/replay mechanisms are |
| meant for capture/replay tools, and should not be used general application |
| usage. |
| |
| endif::isrefpage[] |