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_t or 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_BIT on memory allocation
    • Buffer creation succeeds but vkGetBufferDeviceAddress returns 0
  • Not enabling bufferDeviceAddress feature in VkPhysicalDeviceVulkan12Features
    VkPhysicalDeviceVulkan12Features features12{};
    features12.bufferDeviceAddress = VK_TRUE;
  • Using device address after buffer is destroyed
    • Address becomes invalid — GPU will read garbage or crash