public final class EXTDescriptorIndexing extends java.lang.ObjectThis extension adds several small features which together enable applications to create large descriptor sets containing substantially all of their resources, and selecting amongst those resources with dynamic (non-uniform) indexes in the shader. There are feature enables and SPIR-V capabilities for non-uniform descriptor indexing in the shader, and non-uniform indexing in the shader requires use of a new
NonUniformEXTdecoration defined in the
SPV_EXT_descriptor_indexingSPIR-V extension. There are descriptor set layout binding creation flags enabling several features:
- Descriptors can be updated after they are bound to a command buffer, such that the execution of the command buffer reflects the most recent update to the descriptors.
- Descriptors that are not used by any pending command buffers can be updated, which enables writing new descriptors for frame N+1 while frame N is executing.
- Relax the requirement that all descriptors in a binding that is “statically used” must be valid, such that descriptors that are not accessed by a submission need not be valid and can be updated while that submission is executing.
- The final binding in a descriptor set layout can have a variable size (and unsized arrays of resources are allowed in the
Note that it is valid for multiple descriptor arrays in a shader to use the same set and binding number, as long as they are all compatible with the descriptor type in the pipeline layout. This means a single array binding in the descriptor set can serve multiple texture dimensionalities, or an array of buffer descriptors can be used with multiple different block layouts.
There are new descriptor set layout and descriptor pool creation flags that are required to opt in to the update-after-bind functionality, and there are separate
maxDescriptorSet* limits that apply to these descriptor set layouts which may be much higher than the pre-existing limits. The old limits only count descriptors in non-updateAfterBind descriptor set layouts, and the new limits count descriptors in all descriptor set layouts in the pipeline layout.
- Name String
- Extension Type
- Device extension
- Registered Extension Number
- Extension and Version Dependencies
- Jeff Bolz jeffbolznv
- Last Modified Data
- Jeff Bolz, NVIDIA
- Daniel Rakos, AMD
- Slawomir Grajewski, Intel
- Tobias Hector, Imagination Technologies
The extension specification version.
The extension name.
VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_FEATURES_EXT, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_INDEXING_PROPERTIES_EXT, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_ALLOCATE_INFO_EXT, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_VARIABLE_DESCRIPTOR_COUNT_LAYOUT_SUPPORT_EXTExtends
VK_DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXT, VK_DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXT, VK_DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXT, VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXTVkDescriptorBindingFlagBitsEXT - Bitmask specifying descriptor set layout binding properties
DESCRIPTOR_BINDING_UPDATE_AFTER_BIND_BIT_EXTindicates that if descriptors in this binding are updated between when the descriptor set is bound in a command buffer and when that command buffer is submitted to a queue, then the submission will use the most recently set descriptors for this binding and the updates do not invalidate the command buffer. Descriptor bindings created with this flag are also partially exempt from the external synchronization requirement in
UpdateDescriptorSets. They can be updated concurrently with the set being bound to a command buffer in another thread, but not concurrently with the set being reset or freed.
DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXTindicates that descriptors in this binding that are not dynamically used need not contain valid descriptors at the time the descriptors are consumed. A descriptor is dynamically used if any shader invocation executes an instruction that performs any memory access using the descriptor.
DESCRIPTOR_BINDING_UPDATE_UNUSED_WHILE_PENDING_BIT_EXTindicates that descriptors in this binding can be updated after a command buffer has bound this descriptor set, or while a command buffer that uses this descriptor set is pending execution, as long as the descriptors that are updated are not used by those command buffers. If
DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXTis also set, then descriptors can be updated as long as they are not dynamically used by any shader invocations. If
DESCRIPTOR_BINDING_PARTIALLY_BOUND_BIT_EXTis not set, then descriptors can be updated as long as they are not statically used by any shader invocations.
DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT_EXTindicates that this descriptor binding has a variable size that will be specified when a descriptor set is allocated using this layout. The value of
descriptorCountis treated as an upper bound on the size of the binding. This must only be used for the last binding in the descriptor set layout (i.e. the binding with the largest value of
binding). For the purposes of counting against limits such as
maxPerStageDescriptor*, the full value of
descriptorCountis counted , except for descriptor bindings with a descriptor type of
descriptorCountspecifies the upper bound on the byte size of the binding, thus it counts against the
maxInlineUniformBlockSizelimit instead. .