我正在使用 and 创建描述符池,poolSizeCount == 0
并且pPoolSizes == nullptr
我仍然可以分配各种数量的任何类型的描述符。Linux 上没有验证错误,只有 Windows 上有(但代码可以工作)。
另一种情况:我只为 VkDescriptorPoolSize 提供 1 个 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER,但可以分配更多的 VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER 甚至其他类型的描述符(在这种情况下,Linux 和 Windows 上都不会发生错误)。
为什么会发生这种情况?
一般来说,超出池限制在技术上并不是无效的使用:
如果调用
vkAllocateDescriptorSets
会导致从池中分配的描述符集总数超过vkDescriptorPoolCreateInfo::maxSets
用于 create的值pAllocateInfo->descriptorPool
,则分配可能会由于描述符池中空间不足而失败。同样,如果调用将导致任何给定描述符类型的数量超过每个元素的所有成员的总和(其中成员等于该类型),则分配可能会因空间不足而失败。vkAllocateDescriptorSets
descriptorCount
VkDescriptorPoolCreateInfo::pPoolSizes
请注意“可能”一词的使用,它允许实现失败,但并不要求它们这样做。这意味着你应该保持在这些限制之内,但如果你超出了这些限制并侥幸逃脱,没有人会阻止你。
现在,根本不传递任何大小是违反有效用法的:
poolSizeCount
必须大于 0
适当的层应该抓住这一点。但在层之外,您只会实现未定义的行为。这可以是“似乎有效”。