vulkan:VkSubmitInfo 中的 pWaitDstStageMask 成员
vulkan: pWaitDstStageMask member in VkSubmitInfo
在 VkSubmitInfo
中,当 pWaitDstStageMask[0]
是 VK_PIPLINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
时,vulkan 实现执行流水线阶段而不等待 pWaitSemaphores[0]
直到它达到色依阶段。
但是,如果命令缓冲区有多个子通道和多个绘制命令,那么WaitDstStageMask
是否意味着所有绘制命令的阶段?
如果我希望vulkan
实现在到达最后一个子通道的颜色附件输出阶段时等待信号量,我应该怎么做?
在这种情况下你有(我认为)两个选择:
- 您可以拆分渲染通道 - 排除最后一个子通道并在单独的渲染通道中提交它的命令,记录在单独的命令缓冲区中,这样您就可以指定它应该等待的信号量(但这听起来不太合理) 或...
- 您可以使用事件 - 您应该在生成结果的命令之后发出事件信号.
第二种方法可能更可取(尽管您没有使用提交的 pWaitSemaphores
和 pWaitDstStageMask
字段),但它也有其限制:
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 阶段之前进行信号量等待。
在 VkSubmitInfo
中,当 pWaitDstStageMask[0]
是 VK_PIPLINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
时,vulkan 实现执行流水线阶段而不等待 pWaitSemaphores[0]
直到它达到色依阶段。
但是,如果命令缓冲区有多个子通道和多个绘制命令,那么WaitDstStageMask
是否意味着所有绘制命令的阶段?
如果我希望vulkan
实现在到达最后一个子通道的颜色附件输出阶段时等待信号量,我应该怎么做?
在这种情况下你有(我认为)两个选择:
- 您可以拆分渲染通道 - 排除最后一个子通道并在单独的渲染通道中提交它的命令,记录在单独的命令缓冲区中,这样您就可以指定它应该等待的信号量(但这听起来不太合理) 或...
- 您可以使用事件 - 您应该在生成结果的命令之后发出事件信号.
第二种方法可能更可取(尽管您没有使用提交的 pWaitSemaphores
和 pWaitDstStageMask
字段),但它也有其限制:
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 阶段之前进行信号量等待。