Vulkan TOP / BOTTOM OF PIPE和ALL_COMMANDS

时间:2016-11-08 20:12:18

标签: vulkan

作为很多“初学者”,我认为使用TOP_OF_PIPELINE作为dst而BOTTOM_OF_PIPELINE作为src表示两者都是ALL_COMMANDS。

Here Nicol Bolas写道:“由于管道的顶部/底部对内存障碍毫无意义,因此使用它们可能只是完全无效。因此只对执行障碍有用。”

根据我的理解,由于TOP和BOTTOM没有对内存进行任何访问,因此将障碍放在顶部或底部不能使内存可见^^。

据我了解Nicol Bolas的含义以及我刚才所说的内存访问/可见性,当您使用bottom或top时,必须将accessMask设置为0。

如果我想呈现图像,我可以做类似的事情:

srcStage = COLOR_ATTACHMENT_OUTPUT_BIT
srcAccess = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT
oldLayout = ATTACHMENT_OPTIMAL
dstStage = BOTTOM
dstAccess = 0; // Since memory read access will be "issued" by semaphore
newLayout = PRESENT_KHR;

我们在这里使用bottom,因为我们不希望内存屏障使当前队列等待,如规范中所述:

  

当下一次访问将在不同的队列或演示引擎中完成时,VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT对于完成内存屏障和布局转换很有用;在这些情况下,同一队列中的后续命令不需要等待,但屏障或转换必须在与批处理信号关联的信号量之前完成。

所以现在,我可以说(我希望......)我知道何时使用每个阶段但TOP_OF_PIPE nop ......

所以,有我的问题: 究竟什么是执行障碍(因此没有内存障碍)?它们为什么有用? (因为可以说一个操作发生在另一个之后,但是最好可以说我们可以消耗第二个操作中第一个操作中产生的数据)。 我何时应该在管道的底部或顶部放置障碍物?

谢谢!

1 个答案:

答案 0 :(得分:3)

  

究竟什么是执行障碍(因此没有内存障碍)?

这正是规范所说的:它阻止了操作的执行,直到先前发出的操作完成。

  

为什么它们有用? (因为可以说一个操作发生在另一个之后,但是最好可以说我们可以消耗第二个操作中第一个操作中产生的数据)。

您认为消费数据是您唯一可能等待的事情。

例如,假设您正在传输一些纹理数据。好吧,在完成对该纹理的所有使用之前,您无法开始将副本执行到该纹理的内存中。但是你并没有消费那些进程正在生成的东西;你只需要等到这些过程完成。

这就是纯粹的执行障碍。

由于1.0.35澄清了管道的含义,因此TOP和BOTTOM的含义更加明确。

具体说明是,您为source& destination指定的任何管道阶段都指定该阶段及其之前/之后的所有阶段。因此,如果您将片段着色器指定为源,那么在它之前执行的所有阶段也是该障碍的一部分。如果指定顶点着色器作为目标,则它之后的所有阶段也将在该同步之后执行。

因此BOTTOM作为源意味着在先前命令的所有阶段之后。 TOP作为目标意味着在后续命令的所有阶段之前。 BOTTOM作为目的地没有任何意义,TOP也不是源。