gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:25:17 26 4
gpt4 key购买 nike

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

长话短说
为什么 vk*CreateInfo 结构有 .sType 成员?

最佳答案

他们有一个,这样 pNext 字段就可以正常工作了。

是的,API 采用具有适当 C 类型的结构,因此调用者和接收者都同意该结构的类型。但尤其是现在,许多这样的结构都有结构链表,这些结构为实现提供了额外的信息。这些扩展结构(尽管许多是 Vulkan 1.1/2 的核心)就像所有其他结构一样,具有自己的 sType 字段。

这些字段是至关重要的,因为链表是用 pNext 指针构建的……它们是 void*。他们没有设定类型。实现确定非 NULL pNext 指针指向什么的方式是检查存储在那里的前 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 版本选择合并扩展结构而不是替换现有结构。但选项就在那里。

关于c - Vulkan:vk*CreateInfo 结构中的 sType 有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36347236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com