我们有两个传输命令,vkCmdFillBuffer()
后跟vkCmdCopyQueryPoolResults()
。传输命令将写入重叠的缓冲区范围。
为了避免写后写的危害,在命令之间是否需要一个管道屏障?
Vulkan是否对在同一管道阶段执行的命令提供任何保证?
答案 0 :(得分:3)
当然,您几乎总是必须在Vulkan中进行同步。 Vulkan进行隐式同步的地方很少。
您对管线阶段有错误的直觉。命令毫不费力地“到达”管道阶段。所有命令都从VK_PIPELINE_STAGE_TOP_OF_PIPE
开始(它们以提交顺序“到达”)。然后(没有同步),无法确定哪个命令将进入下一个管道阶段。没有显式的同步原语就没有秩序。规范中会说“执行队列操作可能重叠或发生故障”。
因此,如果没有同步,vkCmdCopyQueryPoolResults
甚至可能会在vkCmdFillBuffer
之前发生,我认为您不希望这样做。如果它们同时发生,那就更糟了。然后,数据可能包含来自两个源(或来自两个源)的一些混乱的写入。结果将是不确定的。