Buffer Device Address (GPU Pointers)¶
This example shows how to use buffer device addresses (also called "GPU pointers") to access buffers directly in shaders without descriptor sets. Traditional Vulkan requires binding buffers through descriptor sets. Buffer device address allows querying a 64-bit GPU virtual address and passing it to shaders via push constants or other buffers. This enables advanced techniques like GPU-driven rendering, dynamic resource selection, and raytracing acceleration structures.
The example uses the KDGpuExample helper API for simplified setup.
Overview¶
What this example demonstrates:
- Enabling VK_KHR_buffer_device_address feature
- Querying 64-bit GPU addresses for buffers
- Passing addresses to shaders via push constants
- Using GLSL buffer reference syntax for pointer dereferencing
- Accessing buffer data without descriptor sets
Use cases:
- GPU-driven rendering (indirect draws with GPU-selected resources)
- Ray tracing (acceleration structure references)
- Mesh shading (direct vertex/index buffer access)
- Sparse data structures (linked lists, trees on GPU)
- Dynamic resource selection without descriptor indexing
Vulkan Requirements¶
- Vulkan Version: 1.2+ (buffer device address promoted to core)
- Extensions: VK_KHR_buffer_device_address (core in 1.2)
- Features:
bufferDeviceAddress - Shader: SPIR-V 1.5+ or GLSL 460+ with
GL_EXT_buffer_reference
Key Concepts¶
Traditional Buffer Access:
1 2 3 | |
1 2 3 4 5 6 | |
Limitations:
- Fixed number of bindings per set
- Descriptor set updates required
- Cannot dynamically select buffers at runtime
Buffer Device Address:
1 2 3 4 5 6 | |
1 2 3 4 5 6 7 8 9 10 | |
Benefits:
- No descriptor set needed
- Unlimited buffer references
- Runtime buffer selection
- Required for ray tracing
Spec: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VK_KHR_buffer_device_address.html
Buffer Reference Syntax:
GLSL buffer references are similar to C pointers:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
buffer_reference: Declares a buffer reference type (pointer type)scalar: Use scalar layout (C-like, no padding)buffer_reference_align: Minimum alignment (typically 16 bytes)
Safety Considerations:
Buffer device addresses are raw pointers:
- No bounds checking - accessing out of bounds is undefined behavior
- No lifetime tracking - using freed buffer address crashes
- No validation - driver cannot catch errors easily
- Programmer responsible for correctness
Implementation¶
Feature Check:
1 2 3 4 5 6 | |
Filename: buffer_reference/buffer_reference.cpp
Always verify feature support before use. Missing feature causes validation errors or crashes.
Creating Addressable Buffer:
1 2 3 4 5 6 7 8 9 10 | |
Filename: buffer_reference/buffer_reference.cpp
The ShaderDeviceAddressBit flag enables address queries. Without this flag, getDeviceAddress() returns error.
Querying GPU Address:
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Filename: buffer_reference/buffer_reference.cpp
Returns a 64-bit virtual GPU address. This address is valid for the buffer's lifetime.
Push Constants with Address:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
Filename: buffer_reference/buffer_reference.cpp
Push constants are ideal for passing addresses (8 bytes). The render function queries the buffer device address and passes it to the shader via this push constant. No descriptor set binding is needed - the address is passed directly.
Performance Notes¶
Benefits:
- CPU: Eliminates descriptor set creation/updates for dynamic buffers
- CPU: Reduces driver overhead for frequent buffer changes
- Memory: No descriptor pool memory needed
Costs:
- GPU: Pointer dereferencing may have small overhead vs. descriptors
- Cache: Random access patterns may reduce cache efficiency
Best Practices:
- Align buffer data to 16 bytes for best performance
- Keep hot data tightly packed (cache-friendly)
- Validate addresses in debug builds
- Use for dynamic selection; descriptors still good for static bindings
Ray Tracing Requirement:
- Acceleration structures require buffer device address
- Shader binding table uses device addresses
- Essential feature for ray tracing
See Also¶
- Descriptor Indexing with Bindless Rendering - Alternative: descriptor indexing
- Hello Triangle Ray Tracing - Ray tracing using buffer device address
- Hello Sphere Ray Tracing - More ray tracing examples
- VK_KHR_buffer_device_address - Official spec
- GL_EXT_buffer_reference - GLSL extension
Further Reading¶
- GPU-Driven Rendering - Using device addresses
- Ray Tracing Tutorial - Acceleration structures
- Vulkan Memory Model - Memory safety considerations
Updated on 2026-03-31 at 00:02:07 +0000