对于资源转换,您需要了解“之前”和“之后”VkImageLayout
资源的(例如,在VkImageMemoryBarrier
传递给vkCmdPipelineBarrier
)。 Vulkan 不保证命令缓冲区执行的任何顺序,除非 API 文档中明确说明(来自this https://stackoverflow.com/a/35919918/3493731回答)。然而,vkCmdPipelineBarrier https://www.khronos.org/registry/vulkan/specs/1.0/man/html/vkCmdPipelineBarrier.html确实明确表示它在调用之前和之后在命令缓冲区中的命令之间创建了依赖关系。因此,当图像在单个命令缓冲区内转换时,可以随时“了解”图像的布局。
然而,vkQueueSumbit
不强制命令缓冲区的执行顺序。如果有两个命令缓冲区,每个缓冲区都有vkCmdPipelineBarrier
调用将同一图像转换为不同的布局,这两个操作之间是否存在依赖关系,或者在这种情况下是否需要显式同步?
第 2.2.1 节说:
命令缓冲区边界,无论是在相同或不同批次或提交的主命令缓冲区之间,还是在主命令缓冲区和辅助命令缓冲区之间,都不会引入任何隐式排序约束。换句话说,在任何信号量或栅栏操作之间提交命令缓冲区集(可以包括执行辅助命令缓冲区)会回放记录的命令,就好像它们已全部记录到单个主命令缓冲区中一样,除了当前状态是在每个边界上重置。
在第 6.4 节中,它指出用于同步的命令对包括:
第一组:管道屏障之前的命令。
第二组:同一队列中管道屏障之后的命令(可能仅限于同一子通道内)。
请注意,它说“在同一队列中”,而不是“在同一命令缓冲区中”。
这两个语句都清楚地表明管道屏障会影响队列的命令执行。执行依赖性不限于单个命令缓冲区的命令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)