vkCmdPipelineBarrier对renderpass同步作用域的说明



在被之前的修订版本弄糊涂之后,查看vulkan规范,我看到了以下对vkCmdPipelineBarrier的更新澄清:

如果CCD_ 2被记录在渲染过程实例之外,第一个同步作用域包括发生的所有命令提交顺序中较早的如果记录了vkCmdPipelineBarrier在呈现过程实例中,第一个同步作用域仅包括在中提交顺序较早出现的命令相同的子段落无论哪种情况,第一个同步作用域都是仅限于源确定的管道级上的操作由CCD_ 4指定的阶段掩码。

如果vkCmdPipelineBarrier记录在渲染过程实例之外,则第二个同步作用域包括出现在提交顺序的后面如果记录了vkCmdPipelineBarrier在呈现过程实例中,第二个同步作用域仅包括在相同的子段落无论哪种情况,第二个同步范围都是仅限于由CCD_ 7指定的目的阶段掩码。

如果我理解正确,这些语句是说:

  • 第一个同步作用域是可能用于在(源(之前进行同步的命令

  • 第二个同步范围是在(目的地(之后可以考虑同步的可能命令

并且唯一改变的是,当在renderpass中使用管道屏障时,其他子路径中的命令不被考虑用于任何同步范围。

我感到困惑的是,它的措辞方式让我认为,甚至在渲染过程之前的以前的命令都没有被考虑用于第一个同步范围。(第二次与之后相同(

这些同步示例正确吗?

如果在渲染过程之外,我会执行以下操作:

1. transfer;
2. computeDispatch;
3. beginRenderPass;
...
endRenderPass;
pipelineBarrier(...);
4. computeDispatch;
5. beginRenderPass;
...
endRenderPass;

命令1、2和3将在流水线载波中被考虑用于在第一同步范围之前进行同步,并且命令4和5将在之后被考虑,即第二同步范围。

如果我有以下命令列表:

1. transfer;
2. computeDispatch;
3. beginRenderPass;
3.1 next subpass;
3.1.1 bindPipeline;
3.1.2 bindDescriptor;
3.1.3 bindVertexBuffer;
pipelineBarrier(...);
3.1.4 bindIndexBuffer;
3.1.5 drawIndexed;
endRenderPass;
4. computeDispatch;
5. beginRenderPass;
...
endRenderPass;

命令1、2、3.1.1、3.1.2和3.1.3将在第一个同步范围内,3.1.4和3.1.5、4、5将在第二个同步范围。

最后,文本的粗体部分是说,如果我做以下操作:

1. transfer;
2. computeDispatch;
3. beginRenderPass;
3.1 first subpass;
3.1.1 bindPipeline;
3.1.2 bindDescriptors;
3.1.3 bindVertexBuffer;
3.1.4 draw;
3.2 next subpass;
3.2.1 bindPipeline;
3.2.2 bindDescriptor;
3.2.3 bindVertexBuffer;
pipelineBarrier(...);
3.2.4 bindIndexBuffer;
3.2.5 drawIndexed;
3.3 next subpass;
3.3.1 bindPipeline;
3.3.2 bindDescriptors;
3.3.4 draw;
endRenderPass;
4. computeDispatch;
5. beginRenderPass;
...
endRenderPass;

命令1,2、3.2.1、3.2.2和3.2.3将在第一个同步范围内,命令3.2.4、3.2.5、4和5将在第二个同步范围,对吗?换句话说,渲染过程中使用的管道屏障的同步作用域不考虑其他子过程?只有当前子通道?

我感到困惑的是,它的措辞方式让我认为,甚至在渲染过程之前的以前的命令都没有被考虑用于第一个同步作用域。

它们不被考虑直接

子通道中的管道屏障将在子通道内的命令之间创建依赖关系。子进程依赖关系创建子进程之间的依赖关系。外部子路径依赖关系在子路径和渲染过程之前/之后的命令之间创建依赖关系。

如果子路径1在子路径0完成之前无法开始执行(因此,它们之间存在依赖关系(,则子路径1中的任何命令都可以假设子路径0已经完成。这包括障碍。因此,这使得依赖项具有传递性;子段落1中屏障之后的东西可以假设子段落0已经完成,因为子段落1的所有都可以做出这种假设。类似地,子通道中的命令(如屏障(将取决于子通道直接或间接依赖的任何外部依赖项

现在,因为依赖关系是基于特定阶段的,所以只有当依赖关系链包括实际相互依赖的阶段时,传递性才适用。

最新更新