描述符索引:2个相似字段之间的差异

descriptor indexing: difference between 2 similar fields

通常,在使用常规描述符集时,字段VkDescriptorSetLayoutBinding::descriptorCount 表示绑定的数组计数。 https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDescriptorSetLayoutBinding.html

当使用 DescriptorIndexing 功能时,对于可变大小数组,字段 VkDescriptorSetVariableDescriptorCountAllocateInfo::pDescriptorCounts 表示“相应描述符集布局中变量计数描述符绑定中的描述符数量”。 https://www.khronos.org/registry/vulkan/specs/1.2-extensions/man/html/VkDescriptorSetVariableDescriptorCountAllocateInfo.html

所以,当使用 DescriptorIndexing 时,似乎 VkDescriptorSetLayoutBinding::descriptorCount 和 VkDescriptorSetVariableDescriptorCountAllocateInfo::pDescriptorCounts 都做了类似的事情。

在后一种情况下,这两个字段之间有什么区别?

描述符索引功能允许(如果实现允许)将描述符集布局中编号最高的描述符绑定指定为“可变大小的描述符”。这是由提供给 VkDescriptorSetLayoutCreateInfoVkDescriptorSetLayoutBindingFlagsCreateInfo 结构提供的标志数组指定的。为最高描述符提供 VK_DESCRIPTOR_BINDING_VARIABLE_DESCRIPTOR_COUNT_BIT 标志可激活此功能。请注意,这意味着对于任何给定的描述符集,将恰好有一个具有可变布局的描述符:最后一个。

可变大小的描述符是这样工作的。在描述符集分配时,您将使用 VkDescriptorSetVariableDescriptorCountAllocateInfo 结构和 VkDescriptorSetAllocateInfo 为分配的每个集提供描述符的实际数量。该结构包含一组描述符计数,每个条目对应您正在分配的每个集合。由于每个集合最多只能有一个可变大小的描述符,因此 pDescriptorCounts 包含每个集合的一个计数(如果该集合有一个可变大小的描述符)。

可变大小描述符的 descriptorCount 仍然很重要。它定义了变量描述符的上限:您将分配的描述符的最大数量。

此功能的要点是考虑到您可能在一个数组中有 1,000 个采样器的情况,但您知道目前您只需要 250 个。因此,与其分配一堆采样器,不如分配一堆采样器需要时,您分配 250 个。当您需要更多时,您将不得不分配一个全新的描述符集(可能来自更大的池)来满足此需求。