vulkan:VkSubmitInfo 中的 pWaitDstStageMask 成员

vulkan: pWaitDstStageMask member in VkSubmitInfo

VkSubmitInfo 中,当 pWaitDstStageMask[0]VK_PIPLINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 时,vulkan 实现执行流水线阶段而不等待 pWaitSemaphores[0] 直到它达到色依阶段。

但是,如果命令缓冲区有多个子通道和多个绘制命令,那么WaitDstStageMask是否意味着所有绘制命令的阶段?

如果我希望vulkan实现在到达最后一个子通道的颜色附件输出阶段时等待信号量,我应该怎么做?

在这种情况下你有(我认为)两个选择:

  • 您可以拆分渲染通道 - 排除最后一个子通道并在单独的渲染通道中提交它的命令,记录在单独的命令缓冲区中,这样您就可以指定它应该等待的信号量(但这听起来不太合理) 或...
  • 您可以使用事件 - 您应该在生成结果的命令之后发出事件信号.

第二种方法可能更可取(尽管您没有使用提交的 pWaitSemaphorespWaitDstStageMask 字段),但它也有其限制:

vkCmdWaitEvents must not be used to wait on event signal operations occuring on other queues.

我不确定,但也许 subpass 依赖项也可以帮助你。提交的 pWaitSemaphores 和渲染通道的子通道依赖项的巧妙定义可能足以完成这项工作。但是我对解释 subpass 依赖关系不太自信(我不确定我是否完全理解它们)所以不要依赖这个。也许有人可以证实这一点。 Bot 上面两个选项绝对可以解决问题。

您可能实际上并不想这样做。在受益于 multi-subpass renderpasses 的硬件上,整个 renderpass 的片段工作将作为一个单一的整体工作块进行调度和执行。例如。在对某些其他像素 (x,y) 区域执行任何子通道之前,所有子通道将针对某些像素 (x,y) 区域执行。因此,说在两个子通道之间的外部事件上插入一个同步屏障是没有意义的。因此,您需要考虑您的 renderpass 正在做什么,以及它是否真的对它们设计的各种优化开放。

如果不是,那么将子通道(或至少最后一个)视为独立的渲染通道无论如何都不会造成损失,因此您不妨将其放在单独的提交批次中的单独渲染通道中, 并把信号量放在它前面。

如果是这样,那么您只想在整个渲染通道的 COLOR_ATTACHMENT 阶段之前进行信号量等待。