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

Are draw calls sequenced in command buffers?

假设我有两个 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);

当command buffer排队执行时,是不是就好像在[2]开始执行之前对[1]的framebuffer attachments的渲染操作已经完全实现了。

即 [2] 会超过 [1] 吗?

Vulkan 中的大多数阶段以相对于彼此的任意顺序执行。但是,rasterization order 在子通道内的帧缓冲区附加过程方面受到尊重(在子通道之间,您必须使用子通道依赖项,而在渲染通道之外,您将需要外部子通道依赖项或屏障)。每个图元都是相对于其他图元排序的,并且实现在进行重新排序时必须遵守光栅化顺序。

原子地遵循光栅化顺序的阶段包括 depth/stencil 测试、混合、写掩码等,但它们 包括片段着色器本身。也就是说,FS 输出必须经过光栅化顺序,但 FS 副作用(即:通过图像存储或 SSBO 写入)不需要。

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