Confusion about VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BI



当我阅读Vulkan Specs forVK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT时,它说:

VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT指定混合后的管道阶段....此阶段还包括子通道加载和存储操作,....

我真的很困惑,为什么这个阶段可以包括子通道加载和存储操作。

根据我的理解,在一个子通道中,在一个颜色附件上执行绘图:

  • Subpass load操作在提交顺序中首先发生。
  • 然后是随后提交的图形管线(vkCmdDraw)。在所有这些图形管道阶段中,有在颜色混合之后的最后颜色输出阶段。这一阶段被称为VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
  • 最后进行子通道存储操作。

既然这三个阶段都是非常不同的阶段,都有自己的目的,为什么它们都可以在一个VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT中指定呢?

如果将此阶段放在dstStageMask中,则是等待srcStageMask的子通道加载操作或等待srcStageMask的图形管道的颜色输出阶段。

同样,如果我把这个阶段放在srcStageMask中,Vulkan是否等待前一个子通道执行存储操作而不是图形管道中的颜色输出阶段?

我真的很困惑,为什么这个阶段可以包括子通道加载和存储操作。

"can"用命令去做;它这样做是因为标准它这样做。

所有这些东西都是一个抽象,一个概念GPU的模型,不一定存在于任何特定的硬件中。Vulkan实现的工作是将这个抽象转换为它们特定的硬件。

子通道加载/存储操作对于任何特定的硬件来说可能是也可能不是一个不同的事情。有些硬件有;

如果这些进程对于特定的GPU是不同的,并且用户通过颜色输出阶段指定了依赖项,那么实现的工作就是包括任何必要的东西来使该依赖项与通常的颜色输出子通道加载/存储硬件一起工作。也就是说,如果两个操作(以某种方式)有单独的缓存,则实现必须处理两组缓存。

所以这个问题的答案是:

如果将此阶段放在dstStageMask中,则是等待srcStageMask的子通道加载操作或等待srcStageMask的图形管道的颜色输出阶段。

。如果在一个特定的GPU上这是两个独立的进程,实现必须使它们看起来好像它们是相同的进程。

也就是说,附件加载只发生在使用附件的第一个子传递之前,附件存储只发生在使用附件的最后一个子传递之后。所以这不是一个影响每个依赖的大问题。

相关内容

最新更新