关于 Vulkan VkSubpassDependency 成员的问题

Questionst about Vulkan VkSubpassDependency members

我正在研究 Vulkan RenderPasses,出于业余爱好。

我对 VkSubpassDependency 结构的成员有以下描述。 措辞是来自来源(书籍、规范、互联网)的语言的组合,以及 我自己的文字锻造。由于我搞砸了,描述可能是错误的。

// .srcSubpass: 
//      The subpass index from which "producing" operations should be finished before the second set of "consuming" operations executes.
//      If there are no dependencies on previous subpasses(eg: first subpass), use VK_SUBPASS_EXTERNAL.
// .srcStageMask:
//      A bitmask of the pipeline stages which produce the data read by the "consuming" commands.
// .srcAccessMask:
//      The types of memory operations that occurred during the "producing" commands.
// ----------
// .dstSubpass:
//      The index of the first subpass whose operations depend the output of this subpass; or VK_SUBPASS_EXTERNAL, if 
//      there are no destination subpasses dependencies.
// .dstStageMask:
//      A bitmask of the pipeline stages which depend on the data generated by the "producing" commands.
// .dstAccessMask:
//      The types of memory operations that will be performed in "consuming" commands.

我有一些问题

假设一个 RenderPass 有 3 个子通道——S1、S2、S3——它们“逻辑上”按顺序执行,但 GPU 可能会乱序执行。




谢谢

1.1 根据定义,任何不是 impossible\invalid 的东西都是可能的。使用相同的顶点缓冲区渲染到两个独立的颜色附件可能有意义。可能会节省装箱,这只需要完成一次。

1.2 不一定。例如,子通道可能没有颜色附件,而是通过存储图像输出。因此它不需要 VK_SUBPASS_EXTERNAL 依赖性,无论是显式的还是隐式的。

1.3 不,它适用于首先使用给定附件的子通道,因为该子通道为该附件执行 LoadOp。

2.1 是的,它是一个依赖DAG,所以它可能有S1→S3,S2→S3(没有S1→S2)。

2.2 可能是 VK_SUBPASS_EXTERNAL。请注意,您可以有更多的依赖关系;一个可以是 VK_SUBPASS_EXTERNAL,另一个可以有另一个子通道。 S2 中的一个附件可能已完成并在此处具有早期 StoreOp,因此 VK_SUBPASS_EXTERNAL 适合它。

3.1 是的,在srcStageMask中使用了更符合逻辑的早期阶段,这种依赖性施加的限制更小或相等。

3.2 是的,那将是一个空操作依赖。巧合的是,这就是指定隐式子通道依赖性的方式。

4.1 是的,同样的逻辑。 `dstStageMask 中使用了更符合逻辑的后期阶段,这种依赖性施加的限制小于或等于。

4.2 这就是空操作依赖。巧合的是,这就是指定隐式子通道依赖性的方式。