10

对于资源转换,您需要知道资源的“之前”和“之后” VkImageLayout(例如,在VkImageMemoryBarrier传递到 中vkCmdPipelineBarrier)。Vulkan 不保证命令缓冲区的任何执行顺序,除非在 API 文档中明确说明(来自答案)。但是,vkCmdPipelineBarrier确实明确表示它在调用之前和之后的命令缓冲区中的命令之间创建了依赖关系。因此,当图像在单个命令缓冲区中转换时,可以随时“了解”图像的布局。

但是,vkQueueSumbit不强制命令缓冲区的执行顺序。如果有两个命令缓冲区,每个都vkCmdPipelineBarrier调用将相同的图像转换到不同的布局,这两个操作之间是否存在依赖关系,或者在这种情况下需要显式同步?

4

1 回答 1

8

第 2.2.1 节说:

命令缓冲区边界,在相同或不同批次或提交的主要命令缓冲区之间以及主要和次要命令缓冲区之间,不引入任何隐式排序约束。换句话说,在任何信号量或栅栏操作之间提交命令缓冲区集(可以包括执行辅助命令缓冲区)会回放记录的命令,就好像它们已全部记录到单个主命令缓冲区中一样,除了当前状态是在每个边界上重置。

在第 6.4 节中,它指出用于同步的命令对包括:

第一组:管道屏障之前的命令。

第二组:同一队列中该管道屏障之后的命令(可能限于同一子通道内)。

请注意,它说的是“在同一个队列中”,而不是“在同一个命令缓冲区中”。

这两个陈述都清楚地表明管道障碍会影响队列的命令执行。执行依赖不限于单个命令缓冲区的命令。

于 2016-04-13T15:08:56.577 回答