- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在新 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/
我想知道为什么可以在 VkPipelineLayoutCreateInfo 中指定多个描述符集布局,因为一个已经包含所有绑定(bind)。 最佳答案 描述符集布局描述了单个描述符集的布局。但是一个管道
我试图了解整个 L1/L2 冲洗是如何工作的。假设我有一个像这样的计算着色器 layout(std430, set = 0, binding = 2) buffer Particles{ Pa
Vulkan 旨在为用户提供精简和明确的内容,但队列是此规则的一个很大异常(exception):队列可能由驱动程序复用,并且使用一个系列的多个队列是否会提高性能并不总是很明显。 在驱动程序更新之一之
来自与 vkCmdPipelineBarrier 相关的规范: If no memory barriers are specified, then the first access scope inc
Vulkan 是否提供绘制基本图元的功能?点、线、矩形、实心矩形、圆角矩形、实心圆角矩形、圆、实心圆等。 ? 我认为没有任何 VkCmdDraw* 命令可以提供此功能。如果这是真的,需要做些什么来绘制
我正在尝试进行一个模拟,该模拟涉及渲染前的两个计算步骤。我目前有一个计算基础物理的计算管道,然后是一个图形管道。我希望能够添加第二个计算着色器以在第一个计算着色器之后运行。 首先,Vulkan 中是否
取消映射后可以刷新内存范围吗? 乍一看好像不对,因为函数叫vkFlushMappedMemoryRanges() ,但是 the documentation似乎暗示内存已准备好刷新,即使在未映射之后:
Vulkan 是否支持保存流水线阶段的顶点输出?我一直在寻找,但找不到任何示例或引用资料,也许其他人不知道? 最佳答案 Transform Feedback 在最初的 Vulkan 版本中没有被削减,
我有多个具有不同纹理/管道构造的网格,例如深度测试/混合函数以使用 vulkan 进行渲染。在性能方面呈现它们的最佳实践是什么。 一种选择是为 n 个网格创建 n 个具有 n 个线程的命令缓冲区,它们
我正在开发一个使用 Vulkan 的 C++ 应用程序。我如何获得支持的扩展集? 像std::set get_supported_extensions()这样的签名会很理想。 最佳答案 vkEnume
我正在开发一个使用 Vulkan 的 C++ 应用程序。我如何获得支持的扩展集? 像std::set get_supported_extensions()这样的签名会很理想。 最佳答案 vkEnume
正在处理 Vulkan 三角形渲染代码,我想将渲染图像保存到文件而不是渲染到窗口。 那么我应该什么时候读取帧缓冲区以及如何编写在文件中。我想需要将原始 RGBA 格式的像素转换为某种已知的 BMP 或
Vulkan 规范(1.0.12)在第 2.4 节介绍了 VkDeviceSize: With few exceptions, Vulkan uses the standard C types for
即使实例在 Vulkan 中创建失败,我是否应该销毁它? 哪个是正确的: 1: VkResult Result = vkCreateInstance( info, NULL, instance );
我开始学习 Vulkan,想知道 VkCreate[...] 函数是否将结构中指向的资源复制到他自己的缓冲区中。 为了澄清我的问题,在这段代码中我加载了 斯皮尔 将着色器放入我自己的 mkShader
Khronos 刚刚发布了他们的新内存模型扩展,但还没有进行非正式讨论、示例实现等,所以我对基本细节感到困惑。 https://www.khronos.org/blog/vulkan-has-just
SubpassInput 由片段着色器隐式寻址。我想用我自己的纹理坐标来处理输入。类似于 texture(sampler, texCoord) 最佳答案 这是不可能的。如果您想在着色器内对图像进行采样
有没有办法从实例中获取对象类型枚举器(vk::ObjectType dor vulkan.hpp 和 VkObjectType for vulkan)? 例如假设我们有 3 个对象: vk::Devi
我的着色器索引到采样器和图像,但是当我从图像中采样时(如果我在着色器中采样,我只会得到错误)我得到一个错误: Descriptor in binding #0 index 0 requires FLO
我想到了以下场景,但我不知道它是否有效: 在程序的开头创建一个VkCommandPool,并从中分配一个VkCommandBuffer。 在渲染循环中,将命令记录到 VkCommandBuffer(隐
我是一名优秀的程序员,十分优秀!