绘制调用是否在命令缓冲区中排序?



假设我有两个VkPipelines,并且在我记录的VkCommandBuffer内...

vkCmdBeginRenderPass(cmd, /*...*/);
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline1);
vkCmdDraw(cmd, /*...*/); // [1]
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline2);
vkCmdDraw(cmd, /*...*/); // [2]
vkCmdEndRenderPass(cmd);

当命令缓冲区排队并执行时,是否在 [2] 开始执行之前完全实现了对 [1] 的帧缓冲附件的渲染操作。

即 [2] 会平局 [1] 吗?

Vulkan 中的大多数阶段都以相对于彼此的任意顺序执行。但是,对于子通道内的帧缓冲连接进程,会遵循光栅化顺序(在子通道之间,必须使用子通道依赖项,而在渲染通道之外,需要外部子通道依赖项或屏障(。每个基元相对于彼此基元进行排序,并且在执行重新排序时,实现必须遵循光栅化顺序。

以原子方式遵循光栅化顺序的阶段包括深度/模具测试、混合、写入掩码等,但它们不包括片段着色器本身。也就是说,FS 输出必须经过光栅化顺序,但 FS副作用(即:通过映像存储或 SSBO 写入(不会。

24.2 中定义了一组规则。关于单个子通道中基本图形的光栅化顺序。根据这些规则,第二个基元的混合操作和颜色写入应严格在第一个基元的混合操作和颜色写入之后进行。

最新更新