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

Reusing the same host-visible buffer on different queue families

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

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

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

由于 host write ordering guarantee 的隐式内存依赖性,当我使用 vkQueueSubmit 提交第 4 步的命令时,设备可以看到写入主机的数据。

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

好的,所以我们有一个 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.

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

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