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

Den*_*lov 2 vulkan

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

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

为什么会发生这种情况?

Nic*_*las 5

一般来说,超出池限制在技术上并不是无效的使用:

如果调用vkAllocateDescriptorSets会导致从池中分配的描述符集总数超过vkDescriptorPoolCreateInfo::maxSets用于 create的值pAllocateInfo->descriptorPool,则分配可能会由于描述符池中空间不足而失败。同样,如果调用将导致任何给定描述符类型的数量超过每个元素的所有成员的总和(其中成员等于该类型),则分配可能会因空间不足而失败。vkAllocateDescriptorSetsdescriptorCountVkDescriptorPoolCreateInfo::pPoolSizes

请注意“可能”一词的使用,它允许实现失败,但并不要求它们这样做。这意味着你应该保持在这些限制之内,但如果你超出了这些限制并侥幸逃脱,没有人会阻止你。

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

poolSizeCount必须大于 0

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

  • @DenisBelov将来,此类问题可能会通过[最佳实践验证](https://vulkan.lunarg.com/doc/view/1.1.126.0/windows/best_practices.html)进行检查,尽管针对此特定的验证检查问题[尚未实现](https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/24)。 (2认同)