我试图了解何时管道在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合作,我觉得我的推理存在严重缺陷,因此,如果有人指出这一点,那就太好了。
答案 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)
,它们将按顺序发生。但这不是不是,这意味着驱动程序必须等待所有像素后才能将其写入内存。所以不,考虑到这一点,您不一定需要“一些中间的,自我分配的内存”。