一些VkSubpassDependency 問題,關於 Sascha Willems 的螢幕外渲染彎版



在 Sascha Willems 的屏幕外渲染示例中,主渲染通道有 2 个 VkSubpassDependency 和 2 个屏幕外渲染通道。 首先,我经常看到成对的VkSubpassDependency,不明白为什么。

VkSubpass主渲染通道的依赖关系:

dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
dependencies[0].dstSubpass = 0;
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[0].srcAccessMask = VK_ACCESS_MEMORY_READ_BIT;
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
dependencies[1].srcSubpass = 0;
dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT;
dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[1].dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;

VkSubpassoffScreen renderPass的依赖关系:

dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
dependencies[0].dstSubpass = 0;
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[0].srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;
dependencies[1].srcSubpass = 0;
dependencies[1].dstSubpass = VK_SUBPASS_EXTERNAL;
dependencies[1].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[1].dstStageMask = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
dependencies[1].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[1].dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
dependencies[1].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;

在主渲染传递中,第二个 VkSubpassDependency (dependencies[1]( 是否仅用于呈现给交换链?是强制性的吗?

对于 offScreen renderPass,一般来说,我不明白依赖点[0]:

由于我们只需要写入帧缓冲区,并在完成后告诉主渲染传递,在我看来,这就是依赖项[1]的作用。

dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL是什么意思;因为在屏幕外渲染传递之前没有涉及其他传递。是否只是让屏幕外渲染通道等待主渲染通道完成演示文稿到交换链中?

我的最后一个问题更具体:如果我使用这 4 个 VkSubpassDependency,就像 Sasha 在本示例中所做的那样,所以为了执行屏幕外渲染传递,我有一个验证错误"必须指定依赖关系图,以便早期的传递不能依赖于以后的传递。我在互联网上找不到有关此错误的任何信息。我刚刚发现触发此错误是因为:dependency.srcSubpass> dependency.dstSubpass。知道吗?

以下是 Sascha Willems 的屏幕外渲染示例的链接: https://github.com/SaschaWillems/Vulkan/blob/master/examples/offscreen/offscreen.cpp

这个问题类似于使用子通道依赖关系的操作顺序命令?,是相同的代码库。

这些例子有点过时,正如我在SaschaWillems/Vulkan#665中所说。从那时起,规范得到了大量澄清。因此,偶尔会有一些不必要的混乱论点。


主渲染传递,依赖[1]

是的,当它后面跟着信号量信号时,这种依赖性是典型的。 例如,向交换链演示。

现在,带有dstStageMask = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT的 dst 外部依赖项不会执行任何操作。 或者,它与隐式依赖关系相同。尽管如此,无论如何,在这种情况下明确是美学选择。

VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT没有访问权限,所以dstAccessMask应该只是0

VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT对上次访问是哪个访问权限有点困惑。对颜色附件的最后一次访问是storeOp,它只是VK_ACCESS_COLOR_ATTACHMENT_WRITE_BITSTOREDONT_CARE


offScreen renderPass, dependencies[0]

依赖关系的dst方面应该是显而易见的。它只是颜色缓冲区访问。它应该匹配loadOp,在CLEAR颜色缓冲区的情况下是VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BITVK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT

现在,srcVK_ACCESS_SHADER_READ_BITVK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT.这是在片段着色器中作为纹理访问的图像。似乎只有一个屏幕外帧缓冲区。因此,在不过多研究示例的情况下,我会假设此依赖项可确保"主渲染传递"在屏幕外渲染传递再次写入之前完成对屏幕外缓冲区的读取。


dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL是什么意思;因为在屏幕外渲染传递之前没有涉及其他传递。

当然有。它是这样的:屏幕外,主,屏幕外,主屏幕外,主屏幕外,屏幕外,主要,...因此,除非是第一帧,否则在给定的渲染通道之前总会有一些东西


我刚刚发现触发此错误是因为:dependency.srcSubpass> dependency.dstSubpass。知道吗?

没错。看来你想通了?

srcSubpassdstSubpass必须VK_SUBPASS_EXTERNAL,或者srcSubpass必须小于dstSubpass,以免意外地在依赖 DAG 中创建循环和死锁。

最新更新