Vulkan:vk * CreateInfo结构中的sType有什么意义?

在新的Vulkan API中的所有创建信息结构( vk*CreateInfo )中,总是有一个.sType成员。 如果价值只能是一件事,为什么会这样? 此外,Vulkan规范非常明确,您只能使用vk*CreateInfo结构作为其相应vkCreate*函数的参数。 这似乎有点多余。 我可以看到,如果驱动程序将此结构直接传递给GPU,您可能需要它(我确实注意到它始终是第一个成员)。 但对于应用程序而言,这似乎是一个非常糟糕的想法,因为如果驱动程序这样做,应用程序将更不容易出错,并且在结构中添加int似乎不是一个计算效率极低的操作。 我只是不明白为什么它存在。

TL; DR
为什么vk*CreateInfo结构具有.sType成员?

这样可以在不破坏向后兼容性的情况下更改API。

如果Vulkan的1.1版想要扩展,例如,命令缓冲池的创建,它将如何做到这一点? 好吧,他们可以添加一个全新的入口点: vkCreateCommandPool2 。 但是这个函数几乎与vkCreateCommandPool具有完全相同的签名; 唯一的区别是它们采用不同的pCreateInfo结构。

因此,您需要做的就是声明一个VkCommandPoolCreateInfo2结构。 然后声明vkCreateCommandPool可以采用其中之一。 如何实现告诉您传入的是哪一个?

因为任何这种结构的前4个字节都是sType 。 他们可以测试这个价值。 如果值为VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO ,那么它是旧结构。 如果它是VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO_2 ,那么它就是新的。

这也使扩展更容易完全覆盖CreateInfo结构。 pNext字段用于使用其他参数扩充API。 使用sType ,扩展可以更改现有参数。