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

人气:673 发布:2022-10-16 标签: graphics gpu render vulkan

问题描述

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

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

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

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

如何处理不同的队列系列?

cpu3>

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

将数据写入缓冲区。 使用队列族A复制数据 将数据写入缓冲区。 使用队列族B复制数据

为了使第4步起作用,您需要进行所有权转移。标准将这一点写在您引用的内容之前:

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

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

&Quot;Contents&Quot;表示所有内容。您在第1步和第3步中编写的文件。除非您执行队列家族所有权转移,否则所有这些文件在第4步中都未定义。

382