C Specification
The VkDescriptorMappingSourceIndirectIndexArrayEXT structure is
defined as:
// Provided by VK_EXT_descriptor_heap
typedef struct VkDescriptorMappingSourceIndirectIndexArrayEXT {
uint32_t heapOffset;
uint32_t pushOffset;
uint32_t addressOffset;
uint32_t heapIndexStride;
const VkSamplerCreateInfo* pEmbeddedSampler;
VkBool32 useCombinedImageSamplerIndex;
uint32_t samplerHeapOffset;
uint32_t samplerPushOffset;
uint32_t samplerAddressOffset;
uint32_t samplerHeapIndexStride;
} VkDescriptorMappingSourceIndirectIndexArrayEXT;
Members
-
heapOffsetis a constant byte offset added to the heap address for the mapped resource or sampler. -
pushOffsetis an offset into push data where an the indirect address will be. -
addressOffsetis an index into the address in push data where an index into the heap for the mapped resource will be retrieved. -
heapIndexStrideis a constant byte stride that multiplies the index in indirect data. -
pEmbeddedSampleris an optional VkSamplerCreateInfo structure specifying a sampler to embed into the shader, in place of looking the sampler up in a heap. -
useCombinedImageSamplerIndexspecifies whether the generated index value will be decoded as two packed indices if the mapped resource is anOpTypeSampledImage. -
samplerHeapOffsetis used only when mapping a combined image sampler, used in place ofheapOffsetto retrieve the sampler. -
samplerPushOffsetis used only when mapping a combined image sampler, used in place ofpushOffsetto retrieve the sampler. -
samplerAddressOffsetis used only when mapping a combined image sampler, used in place ofaddressOffsetto retrieve the sampler. -
samplerHeapIndexStrideis used only when mapping a combined image sampler, used in place ofheapIndexStrideto retrieve the sampler.
Description
Resources using this mapping will be backed by a descriptor in the heap, at an offset calculated as
-
uint32_t *indirectAddress = ((VkDeviceAddress*)pPushData)[pushOffset/8]
-
shaderIndex = (Binding - firstBinding) + arrayIndex
-
indirectIndex = indirectAddress[(addressOffset / 4) + shaderIndex]
-
offset = heapOffset + (indirectIndex × heapIndexStride)
where Binding is the binding value in the shader, arrayIndex is the index into the array if the shader binding is declared as an array, and pPushData is the total set of push data specified by vkCmdPushDataEXT. The value of the address in push data must be a multiple of 4. Index reads through indirectAddress are performed as non-volatile uniform buffer reads, and can be synchronized using VK_ACCESS_2_UNIFORM_READ_BIT. The value in memory must remain static while any shader invocation using this mapping is in flight to avoid a data race.
If the mapped resource is a OpTypeSampledImage, offset is instead
calculated for the sampler as
-
uint32_t *samplerIndirectAddress = ((VkDeviceAddress*)pPushData)[samplerPushOffset/8]
-
samplerIndirectIndex = samplerAddr[(samplerAddressOffset / 4) + shaderIndex]
-
offset = samplerHeapOffset + (samplerIndirectIndex × samplerHeapIndexStride)
If useCombinedImageSamplerIndex is VK_TRUE, and the mapped
resource is a OpTypeSampledImage, indirectIndex and
samplerIndirectIndex in the above equations are instead calculated as
-
indirectIndex = indirectAddress[addressOffset/4 + shaderIndex] & 0xFFFFF
-
samplerIndirectIndex = indirectAddress[addressOffset/4 + shaderIndex] >> 20) & 0xFFF
If the mapped resource is a OpTypeSampler or OpTypeSampledImage,
and pEmbeddedSampler is not NULL, the specified embedded sampler
will be used rather than accessing the sampler heap.
Document Notes
For more information, see the Vulkan Specification.
This page is extracted from the Vulkan Specification. Fixes and changes should be made to the Specification, not directly.