当vkCmdPipelineBarrier中的三个数组都为空的时候,这时barrier实际上就退化成为了一个Execution Barrier,实际上就是一个执行的屏障。
以下面的例子举例:1
2
3
4
5
6
7
8
9
10
11
121.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,这是现代复杂的缓存机制导致的。因此我们需要更加深入的控制方式。