考虑主机可见缓冲区(主要与流缓冲区相关,即由VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
内存),让我们想象一下以下使用模式:
- 将新数据写入主机上的映射地址(正确同步后)。
- 读取队列族 A 上步骤 1 中写入的内容的缓冲区。
- 将新数据写入主机上的映射地址(正确同步后)。
- 读取队列族 B 上步骤 3 中写入的内容的缓冲区。
现在,如果我省略队列族所有权转移 (QFOT),则步骤 3 中写入的数据是否无法在步骤 4 中被队列族 B 访问?
当我使用以下命令提交步骤 4 的命令时,写入在主机上的数据对设备可见vkQueueSubmit
,由于隐式内存依赖性主机写订购保证 https://khronos.org/registry/vulkan/specs/1.2-khr-extensions/html/chap7.html#synchronization-submission-host-writes.
它如何与不同的队列系列一起使用?
好的,我们有了一个 CPU 可修改的缓冲区。由于某种原因,该缓冲区是在独占模式下创建的。并且您想要执行以下操作:
- 将数据写入缓冲区。
- 使用队列系列 A 复制数据。
- 将数据写入缓冲区。
- 使用队列族 B 复制数据。
为了使步骤 4 发挥作用,您需要required进行所有权转让。该标准在您引用的内容之前阐明了这一点:
如果在不同系列中的两个队列之间使用此类资源之间正确表达内存依赖性,但未定义所有权转移,则对于第二个队列系列执行的任何读取访问,该资源的内容都未定义。
您确实正确表达了依赖关系(我假设)。但复制数据是“读访问”。它由队列族 B 执行,与队列族 A 不同。因此,步骤 4(“读访问”)触发此子句:“该资源的内容未定义”。
“内容”是指all的内容。您在步骤 1 中写的内容and步骤 3。所有这些对于步骤 4 都是未定义的,除非您进行队列族所有权转移。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)