C++ Vulkan:在多个命令缓冲区中排序图像内存屏障
对于资源转换,您需要知道资源的“之前”和“之后”C++ Vulkan:在多个命令缓冲区中排序图像内存屏障,c++,synchronization,vulkan,C++,Synchronization,Vulkan,对于资源转换,您需要知道资源的“之前”和“之后”VkImageLayout(例如,在传递给vkCmdPipelineBarrier的vkimagememorybrier中)。Vulkan不保证命令缓冲区的任何执行顺序,除非API文档(来自answer)中明确说明。但是,它明确指出,它在调用前后在命令缓冲区中的命令之间创建了依赖关系。因此,在单个命令缓冲区内转换图像时,可以在任何点“了解”图像的布局 但是,vkQueueSumbit不强制执行命令缓冲区的执行顺序。如果有两个命令缓冲区,每个缓冲区都
VkImageLayout
(例如,在传递给vkCmdPipelineBarrier
的vkimagememorybrier
中)。Vulkan不保证命令缓冲区的任何执行顺序,除非API文档(来自answer)中明确说明。但是,它明确指出,它在调用前后在命令缓冲区中的命令之间创建了依赖关系。因此,在单个命令缓冲区内转换图像时,可以在任何点“了解”图像的布局
但是,vkQueueSumbit
不强制执行命令缓冲区的执行顺序。如果有两个命令缓冲区,每个缓冲区都有vkCmdPipelineBarrier
调用,将相同的映像转换为不同的布局,那么这两个操作之间是否存在依赖关系,或者在这种情况下是否需要显式同步?第2.2.1节说:
相同或不同批次或提交的主命令缓冲区之间以及主命令缓冲区和辅助命令缓冲区之间的命令缓冲区边界都不会引入任何隐式排序约束。换句话说,在任何信号量或围栏操作之间提交一组命令缓冲区(可包括执行辅助命令缓冲区),将回放记录的命令,就好像它们都已记录到单个主命令缓冲区中一样,但当前状态在每个边界上重置
在第6.4节中,说明了同步命令对包括:
第一组:管道屏障前的命令
第二组:同一队列中该管道屏障之后的命令(可能限制在同一子进程内)
请注意,它表示“在同一队列中”,而不是“在同一命令缓冲区中”
这两条语句都清楚地表明,管道障碍会影响队列命令的执行。执行依赖性并不局限于单个命令缓冲区的命令。我没有完全询问我的意图,但这回答了我的问题。