是否有任何限制添加子通道依赖项?

时间:2018-01-19 12:59:18

标签: vulkan

我有以下设置:一个renderpass绘制到纹理,第二个renderpass绘制到不同的纹理并读取第一个。

为了避免工件,我在第一个渲染过程中添加了一个子通道依赖: (C#SharpVulkan代码)

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
<input placeholder="Search…" type="search" data-bind="value: query, valueUpdate: 'keyup'" autocomplete="off">
<ul id="myUL" data-bind="foreach: filteredItems">
  <li>
    <a onclick="log(this)" data-bind="visible: true, text: $data">
    </a>
  </li>
</ul>

这表示依赖关系&#34;以下renderpass的片段着色器等待,直到当前渲染过程完成渲染。&#34;

如果我试图以相反的方式建模相同的依赖关系&#34;当前渲染过程的片段着色器等待,直到前一个渲染过程完成渲染&#34;同步失败,我在最终图像中有工件。

SubpassDependency subpassDependency = new SubpassDependency()
{
    SourceSubpass = 0,
    DestinationSubpass = (~0U),//aka VK_SUBPASS_EXTERNAL
    SourceAccessMask = AccessFlags.ColorAttachmentWrite,
    SourceStageMask = PipelineStageFlags.ColorAttachmentOutput,
    DestinationAccessMask = AccessFlags.ShaderRead,
    DestinationStageMask = PipelineStageFlags.FragmentShader,
    DependencyFlags = DependencyFlags.ByRegion,
};

引自规范:

  

如果srcSubpass等于VK_SUBPASS_EXTERNAL,则第一个同步范围包括在渲染传递实例开始之前提交给队列的命令。

我不明白为什么第二种方法不起作用以及子通道依赖关系工作的限制是什么。我错过了规范中的某些内容吗?

1 个答案:

答案 0 :(得分:1)

如果跳过第一个renderpass中的外部依赖项,则会提供默认值。它有dstStageMask VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT。自动转移到finalLayout只能保证在外部依赖项的可见性操作之前发生(因此,在BOTTOM_OF_PIPE之前)。

在第二个渲染通道中,您指定了srcStageMask的{​​{1}},因此我认为在转移到VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT和第一次使用第二个渲染通道之间存在竞争条件。