Vulkan 使用多个管道渲染到同一附件集

问题描述 投票:0回答:1

鉴于我有两个不同的着色器,因此我有两个不同的

VkPipeline
。它们将共同渲染相同的颜色附件和深度附件。 (我使用动态渲染,所以这里没有渲染通道/子通道)。第二个管道可能依赖于第一个管道的输出。

我当前的

renderFrame
记录命令缓冲区如下:

vkCmdBeginRendering (with attachments load op = clear, store op = ?)
vkCmdBindPipeline - bind the first pipeline
vkBindVertexBuffers
vkCmdDraw
vkCmdEndRendering

vkCmdBeginRendering (with same attachments, load op = ?, store op = store/don't care)
vkCmdBindPipeline - bind the second pipeline
vkBindVertexBuffers
vkCmdDraw
vkCmdEndRendering

这是我的问题:

  • 两个管道之间是否需要某种同步/屏障?我自己上网查了一下,找到了这个帖子,但是两个回复好像很矛盾。
  • 第一个
    storeOp
    我应该使用什么
    vkCmdBeginRendering
    ,第二个
    loadOp
    我应该使用什么
    vkCmdBeginRendering

到现在为止我

  • 不使用任何同步/障碍
  • 颜色附件
    storeOp
    =
    VK_ATTACHMENT_STORE_OP_STORE
    ,深度附件
    storeOp
    =
    VK_ATTACHMENT_STORE_OP_DONT_CARE
    第一个
    vkCmdBeginRendering
  • 颜色附件
    loadOp
    =
    VK_ATTACHMENT_LOAD_OP_LOAD
    ,深度附件
    loadOp
    =
    VK_ATTACHMENT_LOAD_OP_DONT_CARE
    第二个
    vkCmdBeginRendering

这适用于我的平台(Windows 10/Linux + AMD GPU),验证层不会抱怨任何事情。但我想在这里安全,所以发布这个问题。

我原来的项目有点大,技术堆栈有点奇怪,所以我不会在这里发布真正的代码。


编辑1:我发现我实际上并不需要多个

vkCmdBeginRendering
来使用多个管道:

vkCmdBeginRendering
vkCmdBindPipeline - bind the first pipeline
vkBindVertexBuffers
vkCmdDraw

vkCmdBindPipeline - bind the second pipeline
vkBindVertexBuffers
vkCmdDraw
vkCmdEndRendering

多个

vkCmdDraw
系列命令之间的“同步”问题已经在这里这里进行了详细阐述。无需同步。

但是我仍然想知道原始问题的答案,因为管道可以写入多个附件,并且两个管道可能只共享一些输出附件(尽管我还没有实际的示例)

vulkan
1个回答
0
投票

两个管道之间是否需要某种同步/屏障?

作为一般经验法则,即使使用动态渲染,您也需要自己管理同步。当 2 个渲染通道(动态或正常)写入同一附件时,或者一个写入一个读取同一附件时,您需要管道和内存屏障来同步使用。 2 个同时读取不需要此操作。在编辑中,您在第一遍结束时删除了 vkCmdEndRendering 和 vkCmdBeginRendering,因此您不再需要同步。但是,这意味着您无法从第二个管道读取第一个管道的结果。因为他们现在是同一个通行证。

第一个 vkCmdBeginRendering 我应该使用什么 storeOp,以及什么 我应该将 loadOp 用于第二个 vkCmdBeginRendering

您提到您的第二遍可能依赖于第一个管道的输出。因此,您可以在第一遍中使用 storeOp Store,并在第二遍中使用 loadOp 加载。

我希望这对你有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.