创建描述符池时是否真的需要VkDescriptorPoolSize结构?

问题描述

我正在使用poolSizeCount == 0pPoolSizes == nullptr创建描述符池,并且我仍然可以分配任意数量的各种类型的描述符。在Linux上没有验证错误,仅在Windows上(但代码有效)。

另一种情况:我只为VkDescriptorPoolSize提供1个VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,但可以分配更多的VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER甚至其他类型的描述符(在这种情况下,Linux和Windows均不会发生错误)。

为什么会这样?

解决方法

通常,超过池限制在技术上不是无效的使用

如果对vkAllocateDescriptorSets的调用将导致从池中分配的描述符集总数超过用于创建vkDescriptorPoolCreateInfo::maxSets的{​​{1}}的值,则分配可能由于描述符池中空间不足而失败。同样,如果对pAllocateInfo->descriptorPool的调用将导致任何给定描述符类型的数量超过该对象的所有vkAllocateDescriptorSets成员之和,则分配可能由于空间不足而失败。 descriptorCount的每个元素都具有与该类型相同的成员。

请注意使用单词“ 可能”,它使实现失败,但又不需要。这意味着您应该保持在这些限制之内,但是如果您超出这些限制并逃之get,没有人会阻止您。

现在, 违反了有效用法,根本不传递任何大小:

VkDescriptorPoolCreateInfo::pPoolSizes必须大于0

并且适当的层应该抓住这一点。但是在层之外,您只是实现未定义的行为。可以是“似乎可以工作”。