Concept: VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT
What It Is
- A Vulkan buffer usage flag that enables GPU-side pointer access
- Allows shaders to access buffer data via a raw 64-bit GPU address
- Required for: Shader Binding Table, AS input buffers, AS scratch buffers
- Extension:
VK_KHR_buffer_device_address(core in Vulkan 1.2)
Why It’s Needed for Ray Tracing
- Acceleration structure build inputs must be specified as device addresses
- SBT entries contain shader handles accessed via device address
- Allows the GPU to follow pointers — enables complex data structures on GPU
- Without it: can’t build BLAS/TLAS or create SBT
How to Use
- Buffer creation
VkBufferCreateInfo bufferInfo{}; bufferInfo.usage = VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR; // ... create buffer ... - Memory allocation — must enable device address feature
VkMemoryAllocateFlagsInfo flagsInfo{}; flagsInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_FLAGS_INFO; flagsInfo.flags = VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BIT; // chain into VkMemoryAllocateInfo.pNext - Getting the device address
VkBufferDeviceAddressInfo addressInfo{}; addressInfo.sType = VK_STRUCTURE_TYPE_BUFFER_DEVICE_ADDRESS_INFO; addressInfo.buffer = myBuffer; VkDeviceAddress address = vkGetBufferDeviceAddress(device, &addressInfo); - Using in AS build
geometry.geometry.triangles.vertexData.deviceAddress = vertexBufferAddress; geometry.geometry.triangles.indexData.deviceAddress = indexBufferAddress;
Device Address in Shaders
- GLSL: use
uint64_tor buffer reference extension GL_EXT_buffer_reference— typed pointer to buffer#extension GL_EXT_buffer_reference : require layout(buffer_reference, scalar) buffer VertexBuffer { Vertex vertices[]; }; // In shader: VertexBuffer vb = VertexBuffer(instanceData[gl_InstanceCustomIndexEXT].vertexAddress); Vertex v = vb.vertices[gl_PrimitiveID * 3 + 0];- This is how NVPathtracer accesses per-instance vertex data in closest-hit shader
Common Mistakes
- Forgetting
VK_MEMORY_ALLOCATE_DEVICE_ADDRESS_BITon memory allocation- Buffer creation succeeds but
vkGetBufferDeviceAddressreturns 0
- Buffer creation succeeds but
- Not enabling
bufferDeviceAddressfeature inVkPhysicalDeviceVulkan12FeaturesVkPhysicalDeviceVulkan12Features features12{}; features12.bufferDeviceAddress = VK_TRUE; - Using device address after buffer is destroyed
- Address becomes invalid — GPU will read garbage or crash