【问题标题】:Vulkan - what "stages" exist out of a render pass for setting in vkCmdPipelineBarrier commandVulkan - 在 vkCmdPipelineBarrier 命令中设置的渲染通道中存在哪些“阶段”
【发布时间】:2021-08-29 07:30:19
【问题描述】:

当从渲染通道提交vkCmdPipelineBarrier 时,可以为srcStageMask/dstStageMask 设置哪些阶段,因为在这种情况下没有子通道绑定点到图形管道?

在 subpass 中提交 vkCmdPipelineBarrier 时同样的问题,该子通道具有与计算管道的绑定点,我猜该计算管道没有像 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT 这样的阶段,可能还有更多。

谢谢

编辑

首先,感谢@Nicol Bolas 的评论,计算着色器无法在子通道中间调度

我想澄清一下我的问题:

假设我有一个图像,在渲染通道之后将具有 VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL 的布局。

渲染通道之后,我想用新数据更新图像并希望将其布局更改为 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL。

因此,在记录 vkCmdEndRenderPass 之后,我记录了一个 vkCmdPipelineBarrier 命令,如下所示:

const VkImageMemoryBarrier imageMemoryBarrier =
{
    VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,     
    nullptr,                                    
    VK_ACCESS_SHADER_READ_BIT,                  // srcAccessMask
    VK_ACCESS_TRANSFER_WRITE_BIT,               // dstAccessMask
    VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL,   // oldLayout
    VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,       // newLayout
    VK_QUEUE_FAMILY_IGNORED,                    
    VK_QUEUE_FAMILY_IGNORED,                    
    image,                                      
    {                                           // subresourceRange
        VK_IMAGE_ASPECT_COLOR_BIT,              // aspectMask
        0,                                      // baseMipLevel
        VK_REMAINING_MIP_LEVELS,                // levelCount
        0,                                      // baseArrayLayer
        VK_REMAINING_ARRAY_LAYERS               // layerCount
    }
};

vkCmdPipelineBarrier(currentCommandBuffer,
                     VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
                     VK_PIPELINE_STAGE_TRANSFER_BIT,
                     0,
                     0, nullptr,
                     0, nullptr,
                     1, &imageMemoryBarrier);

这确保了只要 renderpass 中的前一个命令仍未穿过片段着色器阶段,过渡就会等待。

但是如果 vulkan 在 renderpass 执行完成后执行 vkCmdPipelineBarrier 怎么办?现在没有绑定管道,没有阶段 - 这是否意味着屏障将进入无休止的等待,直到新的渲染通道开始并且片段着色器阶段将发生?

【问题讨论】:

  • 您不能在子通道中间分派计算着色器。所以这个问题没有实际意义。此外,使用哪些阶段取决于您正在执行的同步类型。写入和消费操作是什么。
  • 谢谢@NicolBolas,我编辑并澄清了这个问题。我想念一些东西。

标签: pipeline vulkan barrier


【解决方案1】:

只需检查Valid Usage

所有这些都是允许的,除了在整个设备上禁用其功能的那些(例如几何着色器),或者队列系列不支持的那些。

对于子通道依赖项,仅允许 pipelineBindPoint 管道支持的那些(即当前只是图形)。


我认为让你深感困惑的主要问题是你认为管道是一个有限状态机。但管道不是 FSM,它是管道(顾名思义)。它始终存在(就像它的所有阶段一样),即使当前没有任何东西流过管道。

具体来说,你的屏障用英文简单地说:“在我开始复制到此图像之后记录的任何命令之前,请确保在我完成将此图像读取为纹理之前记录的所有命令。”

当阶段“存在”不是一个有效的问题时(如上所述);存在和不存在并不是他们真正拥有的属性。正如你在屏障的语义中看到的那样,改变它的含义甚至都没有关系。

某些阶段被有效用法所禁止,但这比任何事情都更能减少混淆。即使他们没有被禁止,也不会改变任何事情。这些阶段的障碍将只是无操作,或者会转化为逻辑上的早期或后期阶段。

【讨论】:

  • @krOooze - 谢谢,编辑并澄清了这个问题。有一些我想念的东西
  • @audi02 试图在更新中解决其中的一些问题。
【解决方案2】:

如果我一切正常,那么您要同步的内容如下:
您希望确保在之前的渲染过程完成读取图像之前,图像不会被新数据覆盖。

为此,您设置了同步的障碍

Execution:   FRAGMENT_SHADER            ->   TRANSFER
Memory:      SHADER_READ                ->   TRANSFER_WRITE
Layout:      SHADER_READ_ONLY_OPTIMAL   ->   TRANSFER_DST_OPTIMAL

虽然这些同步参数确保了正确性,但它们实际上有点多余。 srcAccessMask用于需要“可用”的内存,也就是~转入L2内存,以便之后可以访问。

这是屏障中不需要的部分,因为内存已经可用(在 L2 内存中),否则无法正确读取。

即最佳障碍如下:

Execution:   FRAGMENT_SHADER            ->   TRANSFER
Memory:      0                          ->   TRANSFER_WRITE
Layout:      SHADER_READ_ONLY_OPTIMAL   ->   TRANSFER_DST_OPTIMAL

现在是关于

的问题

但是如果 vulkan 在 renderpass 执行完成后执行 vkCmdPipelineBarrier 怎么办?

上面记录的障碍告诉您的 GPU 如下:

  • 在当前队列中,等待具有FRAGMENT_SHADER 阶段的所有先前命令完成其FRAGMENT_SHADER 阶段,然后继续其TRANSFER 阶段中​​的后续命令。

这也意味着:

  • 如果队列中没有先前的命令,则屏障的要求已经满足,可以立即继续执行进一步的命令。
  • 如果队列中有可能不会通过FRAGMENT_SHADER 阶段的命令,我们不会等待它们。
  • 屏障适用于曾经提交到队列的每个命令。 (但大多数命令将不再“运行中”,而是已经被删除,因为它们已完成执行。)屏障的 src 依赖关系从不引用可能在未来,仅适用于之前提交的内容。

如果您在这些方面有困难,您可能想看看Introduction to Vulkan 讲座,该讲座涵盖了从22:28 开始的此类同步主题。

【讨论】:

  • 是什么让您的屏障更优化?听起来只是代码风格的问题...
  • 感谢@joohi,该视频也提供了很多信息。这真的不是直观的主题!
  • @krOoze 可以说“我的”屏障更优化有两个原因:1)编译器 w.r.t. 毫无疑问。 src 访问,即很明显在这种情况下没有可用的内存。现在,如果您反对没有编译器会在这种情况下表现得如此愚蠢并提供内存,我会完全同意。但仍然:2) 通过指出没有READ 访问标志对srcAccessMask 参数有意义。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多