微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以通过 pWaitDstStageMask=TOP_OF_PIPE 将自动布局转换与交换链图像采集同步?

如何解决是否可以通过 pWaitDstStageMask=TOP_OF_PIPE 将自动布局转换与交换链图像采集同步?

有必要将渲染通道执行的自动布局转换与通过 vkAcquireNextimageKHR 中提供的信号量获取交换链图像同步。 Vulkan Tutorial states,“我们可以将 imageAvailableSemaphore 的 waitStages 更改为 VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT 以确保渲染通道在图像可用之前不会开始”(上下文:waitStagesVkPipelinestageFlags 的数组作为 pWaitDstStageMask 提供给 VkSubmitInfo 用于执行渲染过程的队列提交,因此,自动布局转换)。然后它选择替代(通用)解决方案,即使用外部子通道依赖项。

事实上,我见过这样的同步是通过 subpass 依赖完成的;我从来没有见过有人通过为 pWaitDstStageMask=TOP_OF_PIPE 设置 VkSubmitInfo 来实现它,该 VkSubmitInfo 对应于执行自动布局转换的队列提交,我不确定为什么这会起作用。规范提供了 certain guarantees 关于与子通道依赖项同步的自动布局转换,所以我理解它们为什么会起作用,但是为了通过等待 pWaitDstStageMask=TOP_OF_PIPE 中的信号量来进行这种同步,它是首先需要图像布局转换甚至 管道阶段开始。我不知道图像布局转换经过的任何管道阶段;我认为它们完全是原子操作,发生在内存依赖项(例如子通道依赖项、内存屏障等)中的源可用操作和目标可见操作之间,如规范所述。

自动图像布局转换是否经过流水线阶段?如果是这样,他们经历了哪些阶段(也许我在规范中遗漏了一些东西)?如果没有,在等待图像获取信号量的 VkSubmitInfo 中设置 KeyError: "... not in index" 如何对自动图像布局转换产生任何同步影响?

解决方法

您可能误解了教程的内容。

布局转换不会在流水线阶段发生。它们,就像执行依赖的所有方面一样,发生在 管道阶段之间。依赖项表示,在源阶段完成后但在目标阶段开始之前,将发生依赖项的操作。

因此,如果传入的外部 subpass 依赖项的目标阶段是管道的顶部,则表示作为依赖项的一部分的布局转换将在目标 subpass 中的任何管道阶段执行之前发生。

>

请记住,每个附件的默认外部子通道依赖项都将管道顶部作为其源范围。如果信号量等待依赖的目标阶段是管道的顶部,则外部子通道依赖的源范围在信号量等待的目标范围内。因此,外部子通道依赖发生在信号量等待依赖之后。

而且,如前所述,布局转换发生在源作用域和目标作用域之间。因此,在源范围以及它所依赖的一切完成执行之前,布局转换不会发生。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。