我已经阅读了Google几乎所有有关该主题的内容,但未能得出令人满意的结论。从本质上讲,这是一个后续问题:
Moving image layouts with barrier or renderpasses
假设我有一个颜色附件,该颜色附件将在一次渲染过程中写入,并在第二次渲染过程中进行采样。在两个渲染过程中都只有一个子过程。处理布局过渡和相关性的一种方法是在两个渲染通道之间添加障碍,从而将布局从VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL更改为VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL。
但是Vulkan还提供隐式布局转换(vkAttachmentDescription,initialLayout和finalLayout)。我猜想使用它们在性能上有优势,因此让我们简单地尝试摆脱障碍。我们在vkAttachmentDescription结构中设置了initialLayout和finalLayout字段并删除了障碍。问题是,我们丢失了屏障提供的同步,因此我们需要通过其他方式来恢复同步。这是混乱开始的地方,引发了我的问题:
1)在两个渲染过程之间同步附件的推荐方法是什么?显然,我可以简单地重新添加障碍,而不必更改布局,但这是否会破坏整个练习的目的,即通过使用隐式布局转换并摆脱障碍来获得更好的性能?还是应该从渲染过程1的单个子过程添加子过程依赖项到VK_SUBPASS_EXTERNAL?在性能上使用VK_SUBPASS_EXTERNAL有什么警告吗?
2)如何向后同步附件?将附件转换为正确的初始布局是应用程序的责任,这显然可以通过障碍来完成。是否可以替换此障碍以获得性能优势?我能想到的唯一方法是使用从VK_SUBPASS_EXTERNAL到渲染通道1的单个子通道的子通道依赖关系来执行依赖关系部分,并使用“快速”屏障(一个不同步的屏障)来完成布局更改。这有意义吗?这个障碍看起来如何?还是在这种情况下不可避免的是“完全”障碍?
我的问题的简短版本很简单:其他人如何与隐式布局转换一起执行附件同步?
答案 0 :(得分:4)
通常来说,当Vulkan或类似的低级API为您提供可以实现所需功能的多种工具时,您应该优先考虑能够解决问题的大多数特定工具(无需从根本上重新构建代码或从根本上影响您的设计。
在您的情况下,您有2个选择:障碍或渲染通过机制(子通过依赖关系和布局转换)。障碍与任何事物都起作用;他们不在乎图像的来源,用途或去向。渲染过程机制仅适用于渲染过程中发生的事情,并且主要处理附加到渲染过程中的图像(隐式布局转换仅对附件有效)。
渲染过程机制更具体,因此,如果它们满足您的需求,您应该更喜欢使用这些工具。
这也是为什么如果您有两个可以在同一渲染过程中进行的“单独”渲染操作(如果从附件中读取内容的方式可以在限制范围内生存)输入附件),则您最好将它们放在同一渲染通道中。
答案 1 :(得分:1)
我的问题的简短版本很简单:其他人如何与隐式布局转换一起执行附件同步?
渲染通道依赖项是您要寻找的。如果进行两次渲染,则需要使用上述的VK_SUBPASS_EXTERNAL
值。
将附件转换为正确的初始布局是应用程序的责任,这显然可以通过障碍来完成。可以替代此障碍以获得性能优势吗?
但是,您执行布局转换并不重要。您有责任将图像的布局转移到指定为初始布局的布局。但是我认为最好的方法是再次使用渲染过程提供的隐式布局转换。如果您已经在使用它们,则应该可以通过以下方式进行设置:第一个渲染过程将图像转换为与第二个渲染过程的初始布局以及第二个渲染过程的最终布局相同的布局pass与第一次渲染过程的初始布局相同。