【问题标题】:Vulkan: Is the rendering pipeline executed once per subpass?Vulkan:渲染管道是否每个子通道执行一次?
【发布时间】:2020-11-30 18:30:03
【问题描述】:

考虑具有多个子通道的 RenderPass:

多个子通道是否意味着整个渲染管道在每个子通道中执行一次? 并且假设正确的子通道依赖关系,后续子通道可以访问先前子通道的图像输出? (规定读取先前的图像数据发生在相同的像素位置,用于平铺 gpu 优化) 我知道硬件可能会优化事情;这更像是一种思考多子通道处理如何发生的方式。

将此扩展到多个渲染通道,那么它与子通道相同吗?除了可以在任何位置访问来自先前渲染通道的图像数据,并且渲染通道之间的同步使用子通道之间的不同机制。

【问题讨论】:

    标签: vulkan


    【解决方案1】:

    管道未“执行”。管道只是存在。这就是为什么它被称为管道而不是状态机的原因。队列操作是被执行的东西。

    借助 Vulkan 的渲染通道,了解基于 tile 的架构如何工作是一件好事。首先,他们需要将所有内容分类为图块;这意味着他们需要预先知道所有东西的位置。因此,几何处理(顶点着色器、几何着色器、曲面细分着色器和所有相关的固定功能阶段)需要在像素处理(片段着色器、帧缓冲区写入和其他固定功能阶段)之前完成所有队列操作) 开始于其中任何一个。

    由此导出子通道限制:

    如果srcSubpass 等于dstSubpass 并且不是srcStageMaskdstStageMask 中的所有阶段都是帧缓冲区空间阶段,则srcStageMask 中的逻辑上最新管道阶段必须逻辑上早于或等于dstStageMask中逻辑上最早的流水线阶段

    即您不能让顶点着色器依赖项等待先前操作的片段着色器输出。但是你可以有“帧缓冲空间”的依赖;例如片段着色器正在等待先前操作的片段着色器。

    【讨论】:

    • 我觉得这是一个很好的答案,但是对于一个不同的问题;依赖项之一。好的,所以管道没有“执行”。但是,人们不是可以将 gpu 视为执行流水线中描述的操作,按照它们显示的顺序,并且步骤中具有可编程性,因此 gpu 充当......状态机?我知道它可以优化步骤等等。但是,我试图建立一个多子通道渲染通道如何在逻辑上执行的心理模型。即:它们在逻辑上每个子通道执行一次所有管道步骤,可能是并行的。
    • @Dess:当您在绑定子通道时渲染某些东西,管道被“执行”。必须为特定子通道创建管道,但这与它在该子通道中使用的频率(或何时使用)无关。
    • @NicolBolas:我想我现在是在挑剔,但你的意思是什么?:管道被“执行”一次,每个绘制命令,或者每个子通道一次(即:每个 vkCmd{Begin/ End}RenderPass,每个 vkCmdNextSubpass)
    • @Dess:如果不重复我所说的话,我不知道我怎么可能更清楚。当我说“与该子通道中使用它的频率无关”时,我不知道您如何获得“每个子通道一次”。
    • @NicolBolas:我明白你说的很清楚。但是,其他人必须解释你的话,他们并不总是清楚。例如,“render something”:这可能意味着,调用 draw cmd,或者可能“render something”作为子通道的完成,一旦数据已经提交到任何渲染目标。
    【解决方案2】:

    子通道依赖项只是 Vulkan API 的另一个抽象,它说明了如何表达不同命令之间的同步(每个命令都可以通过多个管道阶段运行)。 W.r.t.渲染通道,子通道依赖有两个目的:

    1. 表达在不同渲染通道中提交的命令之间的同步(即使用VK_SUBPASS_EXTERNAL subpass-id 时,请参阅VkSubpassDependency
    2. 表示在相同或不同子通道内提交的命令之间的同步。在这种情况下,为 srcSubpassdstSubpass 分别指定一对 (00) 或 (01) 等。

    给定正确的同步范围,后续子通道可以读取前一个子通道的渲染结果。可以通过 输入附件 传递帧缓冲区附件,这些附件在 VkSubpassDescription 中指定。从43:28 开始,您可以在此lecture 中对此进行概述。

    关于“渲染管道被执行”的事情:上面提到的lecture解释了命令以及它们是如何执行的 从22:29 开始,详细了解流水线阶段。它应该使事情变得更加清晰。

    关于平铺的 GPU:如果您指的是 VK_DEPENDENCY_BY_REGION_BITVkSubpassDependency::dependencyFlags,规范说明如下:

    VK_DEPENDENCY_BY_REGION_BIT 指定依赖将是帧缓冲区本地的。

    这意味着,您只能使用带有该标志的以下管道阶段:

    • VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
    • VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
    • VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
    • VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT

    krOoze 在other answer 中已经提供了有关基于图块的架构的宝贵信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多