HLSL Dynamic Resources#
Introduction#
HLSL Dynamic Resources is a feature introduced in Shader Model 6.6 that allows shaders to create resources from descriptors by directly indexing the CBV/SRV/UAV heap or the sampler heap. Dynamic resources are also known as bindless resources or directly indexed resources.
HLSL exposes these heaps through two built-in global objects:
ResourceDescriptorHeap and SamplerDescriptorHeap. Indexing either object
yields an intermediate value that can be converted to a resource or sampler
object. Resources created this way do not require binding locations or root
signature descriptor-table mappings.
Implementation Details#
The built-in header hlsl/hlsl_resources.h declares the global variables
ResourceDescriptorHeap and SamplerDescriptorHeap and is included by the
default header hlsl.h. Their types, resource_descriptor_heap_struct and
sampler_descriptor_heap_struct, are defined in the hlsl::__detail namespace
in hlsl/hlsl_detail.h.
Each global’s indexing operator returns a small internal struct containing the
heap index: ResourceDescriptorHeap returns heap_resource_info, while
SamplerDescriptorHeap returns heap_sampler_info. HLSLExternalSemaSource
defines both structs in the hlsl::__detail namespace. Their distinct types
allow overload resolution to reject attempts to construct a resource from the
wrong heap: sampler types accept only heap_sampler_info, while CBV/SRV/UAV
resource types accept only heap_resource_info.
Each resource class has an implicit constructor that accepts the corresponding
heap info struct and passes it to __builtin_hlsl_resource_handlefromheap to
create a concrete resource handle. This allows assignments, initializations,
and function arguments to use standard C++ implicit conversions without special
handling in Sema. For resources with counters, the constructor creates the
counter handle with the separate
__builtin_hlsl_resource_counterhandlefromheap built-in.
During code generation, each call to the built-in is lowered to target-specific intrinsics for heap resources.