graphics - 在不同的队列系列上重用相同的主机可见缓冲区

标签 graphics gpu render vulkan

考虑主机可见缓冲区(主要与流缓冲区相关,即由 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT 内存支持的缓冲区),让我们想象以下使用模式:

  1. 将新数据写入主机上的映射地址(正确同步后)。
  2. 读取队列系列 A 上步骤 1 中写入的内容的缓冲区。
  3. 将新数据写入主机上的映射地址(正确同步后)。
  4. 读取队列族 B 上步骤 3 中写入的内容的缓冲区。

现在,如果我省略队列族所有权转移 (QFOT),步骤 3 中写入的数据是否无法在步骤 4 中被队列族 B 访问?

当我使用 vkQueueSubmit 提交步骤 4 的命令时,由于 host write ordering guarantee 的隐式内存依赖性,写入在主机上的数据对设备可见。 .

它如何与不同的队列系列一起使用?

最佳答案

好的,我们有了一个 CPU 可修改的缓冲区。由于某种原因,该缓冲区是在独占模式下创建的。并且您想要执行以下操作:

  1. 将数据写入缓冲区。
  2. 使用队列系列 A 复制数据。
  3. 将数据写入缓冲区。
  4. 使用队列系列 B 复制数据。

为了使步骤 4 生效,您需要进行所有权转让。该标准在您引用的内容之前阐明了这一点:

If memory dependencies are correctly expressed between uses of such a resource between two queues in different families, but no ownership transfer is defined, the contents of that resource are undefined for any read accesses performed by the second queue family.

您确实正确表达了依赖关系(我假设)。但复制数据是“读访问”。它由队列族 B 执行,与队列族 A 不同。因此,步骤 4(“读访问”)触发此子句:“该资源的内容未定义”。

“内容”是指所有内容。您在步骤 1 和步骤 3 中编写的内容。所有这些对于步骤 4 都是未定义的,除非您执行队列家族所有权转移。

关于graphics - 在不同的队列系列上重用相同的主机可见缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69439966/

相关文章:

java - 在 OpenGL 中从单个 VBO 渲染任意大小的实例

c++ - opengl 3.3 中的黑屏输出

javascript - ReactJS - 某些元素仅在刷新(F5)后呈现。为什么?

jsf - 渲染和渲染概念

list - 如何在榆树中呈现列表?

java - Swing 中的自定义绘图循环

winforms - 图形.DrawLines : Parameter is not valid

.NET 相当于 Qt 图形 View 框架吗?

c++ - OpenCL 矩阵乘法速度

c# - 在.net中创建圆形头像