管道在哪个阶段使用帧缓冲区?

时间:2019-09-08 09:20:14

标签: vulkan

我试图了解何时管道在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

据我所知,当仅使用一个附件(不进行多次采样,仅使用一个彩色附件)时,管线应在光栅化阶段开始写入帧缓冲区附件(因此{{1之前}}。但是,根据规范,这应该直到VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT阶段才发生。因此,管道是否使用一些中间的,自我分配的内存来执行所有片段操作,并仅在VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT阶段才开始写入交换链映像?我大约两周前才开始与Vulkan合作,我觉得我的推理存在严重缺陷,因此,如果有人指出这一点,那就太好了。

1 个答案:

答案 0 :(得分:2)

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

  

[...]在光栅化阶段开始写帧缓冲附件(所以在VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT之前的某个地方)

深度将被测试,并可能在其中写入。颜色不能写在那里;您甚至都不知道没有片段着色器时要写入什么值。

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

  

那么,管道是否使用一些自我分配的中间内存来执行所有片段操作,并仅在COLOR_ATTACHMENT_OUTPUT阶段才开始写入交换链映像?

管道(如API抽象中一样)否;它不在乎驱动程序如何执行。至于司机,他们可能做很多事情。基于图块的体系结构主要需要“渲染通道”。在那里,“加载操作”实际上与硬件匹配。附件可以从字面上从通用存储器加载到“片上存储器”,以处理给定的图块。

其他体系结构可能会按照“假设”原则运行。请注意,在加载和存储操作之间的非附件使用中使用附件无效。另请注意,只允许两个可用的存储操作写入附件。因此,如果驱动程序直接在附件的内存上运行,它将仍然是符合要求的Vulkan实现。

  

以下阶段按此顺序

我还得到一个想法,即您认为这意味着更多。

这是“逻辑顺序”。这涉及原始顺序和栅格化顺序。是的,对于给定的像素(x, y),它们将按顺序发生。但这不是不是,这意味着驱动程序必须等待所有像素后才能将其写入内存。所以不,考虑到这一点,您不一定需要“一些中间的,自我分配的内存”。