他们有一个,因此该pNext
领域确实有效。
是的,API 采用具有适当 C 类型的结构,因此调用者和接收者都同意该结构的类型。但特别是现在,许多这样的结构都有结构的链接列表,这些结构为实现提供了额外的信息。这些扩展结构(尽管许多是 Vulkan 1.1/2 中的核心)就像所有其他结构一样,都有自己的sType
领域。
这些字段至关重要,因为链表是用pNext
指针构建的……它们是void*
s。它们没有固定类型。实现确定非 NULLpNext
指针指向什么的方式是检查存储在那里的前 4 个字节。这是sType
领域;它允许实现知道将指针转换为什么类型。
当然,API 采用的主要结构并不严格需要sType
字段,因为它的类型是 API 本身的一部分。但是,这样做有一个假设的原因(它还没有在 Vulkan 版本中推出)。
更高版本的 Vulkan 可以扩展创建命令缓冲池等功能。但它会怎么做呢?好吧,他们可以添加一个全新的入口点:vkCreateCommandPool2
. vkCreateCommandPool
但是这个函数的签名几乎与;完全相同。唯一的区别是它们采用不同的pCreateInfo
结构。
因此,您所要做的就是声明一个VkCommandPoolCreateInfo2
结构。然后声明vkCreateCommandPool
可以取其中任何一个。实现如何告诉你传入的是哪一个?
因为任何此类结构的前 4 个字节都是sType
. 他们可以测试该值。如果值为VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO
,则它是旧结构。如果是VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO_2
,那就是新的。
当然,如前所述,这还没有成功。1.0 后的 Vulkan 版本选择合并扩展结构而不是替换现有的结构。但是选择就在那里。