vkGetBufferDeviceAddress
To query a 64-bit buffer device address value through which buffer memory can be accessed in a shader, call:
VkDeviceAddress vkGetBufferDeviceAddressKHR(
VkDevice device,
const VkBufferDeviceAddressInfo* pInfo);
or the equivalent command
VkDeviceAddress vkGetBufferDeviceAddressEXT(
VkDevice device,
const VkBufferDeviceAddressInfo* pInfo);
device
is the logical device that the buffer was created on.pInfo
is a pointer to a VkBufferDeviceAddressInfo structure specifying the buffer to retrieve an address for.
The 64-bit return value is an address of the start of pInfo→buffer
.
The address range starting at this value and whose size is the size of the
buffer can be used in a shader to access the memory bound to that buffer,
using the
SPV_KHR_physical_storage_buffer
extension
or the equivalent
SPV_EXT_physical_storage_buffer
extension
and the PhysicalStorageBuffer
storage class.
For example, this value can be stored in a uniform buffer, and the shader
can read the value from the uniform buffer and use it to do a dependent
read/write to this buffer.
A value of zero is reserved as a null
pointer and must not be returned
as a valid buffer device address.
All loads, stores, and atomics in a shader through
PhysicalStorageBuffer
pointers must access addresses in the address
range of some buffer.
If the buffer was created with a non-zero value of
VkBufferOpaqueCaptureAddressCreateInfo::opaqueCaptureAddress
or
VkBufferDeviceAddressCreateInfoEXT::deviceAddress
,
the return value will be the same address that was returned at capture time.
The returned address must satisfy the alignment requirement specified by
VkMemoryRequirements::alignment
for the buffer in
VkBufferDeviceAddressInfo::buffer
.
If multiple VkBuffer objects are bound to overlapping ranges of VkDeviceMemory, implementations may return address ranges which overlap. In this case, it is ambiguous which VkBuffer is associated with any given device address. For purposes of valid usage, if multiple VkBuffer objects can be attributed to a device address, a VkBuffer is selected such that valid usage passes, if it exists.
Valid Usage
VUID-vkGetBufferDeviceAddress-bufferDeviceAddress-03324
The bufferDeviceAddress
or VkPhysicalDeviceBufferDeviceAddressFeaturesEXT
::bufferDeviceAddress
feature must be enabled
VUID-vkGetBufferDeviceAddress-device-03325
If device
was created with multiple physical devices, then the
bufferDeviceAddressMultiDevice
or VkPhysicalDeviceBufferDeviceAddressFeaturesEXT
::bufferDeviceAddressMultiDevice
feature must be enabled
Valid Usage (Implicit)
VUID-vkGetBufferDeviceAddress-device-parameter
device
must be a valid VkDevice handle
VUID-vkGetBufferDeviceAddress-pInfo-parameter
pInfo
must be a valid pointer to a valid VkBufferDeviceAddressInfo structure