首页 > 解决方案 > 在不同的队列族上重用相同的主机可见缓冲区

问题描述

考虑主机可见缓冲区(主要与流缓冲区相关,即由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 的命令时,写入主机的数据对设备可见。

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

标签: graphicsgpurendervulkan

解决方案


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

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

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

如果在不同族中的两个队列之间使用这种资源时正确表达了内存依赖关系,但没有定义所有权转移,则对于第二个队列族执行的任何读取访问,该资源的内容都是未定义的。

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

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


推荐阅读