管道在什么阶段使用帧缓冲区?

At what stage does a pipeline use the framebuffer?

我试图了解管道何时开始在 Vulkan 中使用帧缓冲区附件。根据规范,对于图元着色管线,以下阶段按顺序发生:

VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT
VK_PIPELINE_STAGE_DRAW_INDIRECT_BIT
VK_PIPELINE_STAGE_VERTEX_INPUT_BIT
VK_PIPELINE_STAGE_VERTEX_SHADER_BIT
VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT
VK_PIPELINE_STAGE_TESSELLATION_EVALUATION_SHADER_BIT
VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT
VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT
VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV
VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT
VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT
VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT
VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT

据我所知,当只使用一个附件时(没有多重采样,只有一个颜色附件),管道应该在光栅化阶段开始写入帧缓冲区附件(所以在 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT).但是,根据规范,这应该要到 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 阶段才会发生。那么,管道是否使用一些中间的、自分配的内存来完成所有的片段操作,并仅在 COLOR_ATTACHMENT_OUTPUT 阶段开始写入交换链图像?我大约两周前才开始使用 Vulkan,我觉得我的推理有一些严重的缺陷,所以如果有人能指出来就太好了。

管道开始在第一个子通道中使用颜色附件,在 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT 中使用它,在 VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT 中使用深度 and\or 模板。这是由加载操作(loadOp)给出的。

[...] start writing to the framebuffer attachment at the rasterisation stage (so around somewhere before VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT)

深度将被测试并可能写入那里。那里不能写颜色;如果没有片段着色器,你甚至不知道要写什么值。

但是AIS,渲染通道实例中首先使用的是加载操作,而不是实际的深度测试和写入。

So, do pipelines use some intermediate, self-allocated memory to do all the fragment operations, and start writing to a swapchain image only at the COLOR_ATTACHMENT_OUTPUT stage?

管道(如 API 抽象)否;它不关心 driver 是如何做到的。至于 drivers 他们可能会做很多事情。 tile-based 架构大多需要 Render Pass。在那里,加载操作实际上与硬件匹配。附件可以直接从通用内存加载到 "on-chip memory" 以处理给定的图块。

其他架构可能会在 "as-if" 原则下运行。请注意,在加载和存储操作之间使用 non-attachment 中的附件是无效的。另请注意,只有两个可用的存储操作被允许写入附件。因此,如果 driver 直接对附件的内存进行操作,它仍然是一个符合要求的 Vulkan 实现。

following stages occur in this order

我也明白你认为这意味着更多。

这是"logical order"。这与图元顺序和光栅化顺序有关。是的,对于给定的像素 (x, y),它们会按顺序发生。但这确实 而不是 意味着 driver 在将它们写入内存之前必须等待所有像素。所以不,考虑到这一点,您不一定需要 "some intermediate, self-allocated memory".