Vulkan之ExcutionBarrier

当vkCmdPipelineBarrier中的三个数组都为空的时候,这时barrier实际上就退化成为了一个Execution Barrier,实际上就是一个执行的屏障。
以下面的例子举例:

1
2
3
4
5
6
7
8
9
10
11
12
1.vkCmdDispatch(...);
2.vkCmdDispatch(...);
3.vkCmdDispatch(...);
vkCmdPipelineBarrier(
...
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, // srcStageMask
VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT, // dstStageMask
...);

4.vkCmdDispatch(...);
5.vkCmdDispatch(...);
6.vkCmdDispatch(...);

这个表明,123的顺序可以乱序执行,456的顺序也可以乱序执行,但是456一定要在123执行完毕后才开始执行。

但是Execution Barrier只能控制执行的顺序,却不能控制memory的修改顺序,先执行的command不一定能先修改完memory,这是现代复杂的缓存机制导致的。因此我们需要更加深入的控制方式。

显示 Gitment 评论