Jer*_*ov2 23 c specifications vulkan
在vk*CreateInfo新的Vulkan API中的所有create info structs()中,总有一个.sType成员.如果价值只能是一件事,为什么会这样?此外,Vulkan规范非常明确,您只能将vk*CreateInfo结构用作其相应vkCreate*函数的参数.这似乎有点多余.我可以看到,如果驱动程序将此结构直接传递给GPU,您可能需要它(我确实注意到它始终是第一个成员).但对于应用程序而言,这似乎是一个非常糟糕的想法,因为如果驱动程序这样做,应用程序将更不容易出错,并且在结构中添加int似乎不是一个计算效率极低的操作.我只是不明白为什么它存在.
TL; DR
为什么vk*CreateInfo结构有.sType成员?
Nic*_*las 31
这样可以在不破坏向后兼容性的情况下更改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,扩展可以更改现有参数.