以下来自Vulkan教程的代码似乎与同步作用域的工作方式相冲突。
// <dependency> is a subpass dependency.
dependency.srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
...
dependency.dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
上面的代码试图将srcStageMask
和dstStageMask
设置为相同的管道阶段:VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT.
根据Vulkan规范:
如果一个同步命令包含一个源阶段掩码,它的第一个同步范围只包括在该掩码中指定的管道阶段的执行,…
如果一个同步命令包含一个目标阶段掩码,它的第二个同步范围只包括在该掩码中指定的管道阶段的执行,…
即srcStageMask
和dstStageMask
分别创建了具有指定阶段的第一个同步作用域和第二个同步作用域。
同时,根据以下内容:
…对于两组操作,第一组操作必须发生在第二组操作之前。
我的困惑是,由于源阶段和目标阶段是相同的,子通道依赖要求这个管道阶段必须在完全相同的阶段开始执行之前完成。
颜色附件输出阶段已经保证完成(第一个作用域)。如何指定开始再次执行相同的已完成阶段?(第二个作用域)
那么这个依赖关系想要表达什么呢?
阶段只存在于一个动作命令中,该动作命令在该阶段内执行其自身的某些部分。同步范围基于命令first。一旦定义了范围内的哪些命令,阶段掩码可以指定这些命令中的哪些阶段 受同步影响。因此,所有同步操作都定义了在同步之前发生的一组命令和在同步之后发生的一组命令。它们表示"第一个同步范围"。和"第二个同步范围"。 源阶段掩码适用于"第一个同步范围"中的命令。目标阶段掩码适用于"第二个同步范围"中的命令。一个作用域中的命令与另一个作用域中的命令是不同的集合。因此,即使你在谈论相同的管道阶段,它们也是在不同时间执行的不同命令
所以它所做的就是它所说的:它在所有从源子通道执行的颜色附件阶段(又名:"第一个同步作用域")和所有从目标子通道执行的颜色附件阶段(又名:"第二个同步作用域")之间创建了一个依赖关系。