【问题标题】:At what stage does a pipeline use the framebuffer?管道在什么阶段使用帧缓冲区?
【发布时间】:2019-09-09 01:19:06
【问题描述】:

我试图了解管道何时开始在 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 合作,我觉得我的推理存在严重缺陷,所以如果有人能指出这一点,那就太好了。

【问题讨论】:

    标签: vulkan


    【解决方案1】:

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

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

    Depth 将在此处进行测试并可能写入。那里不能写颜色;如果没有片段着色器,你甚至不知道要写什么值。

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

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

    管道(在 API 抽象中)否;它不在乎司机是怎么做的。至于司机,他们可能会做很多事情。渲染通道主要是基于瓦片的架构所必需的。在那里,加载操作实际上与硬件匹配。附件可以按字面意思从通用内存加载到“片上内存”以处理给定的图块。

    其他架构可以在“as-if”原则下运行。请注意,在加载和存储操作之间的非附件使用中使用附件是无效的。另请注意,仅允许两个可用的存储操作写入附件。因此,如果驱动程序直接对附件的内存进行操作,它仍然是符合 Vulkan 的实现。

    以下阶段按此顺序发生

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

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

    【讨论】:

    • 所以,据我了解,如何处理一切都取决于驱动程序?它可能在渲染时使用颜色附件,但也可能只使用它来输出最终图像?
    • 好吧,不是“一切”;只有实现细节。我觉得你在概念上仍然没有抓住重点。它将在第一个图块完成并准备好进行存储操作时使用颜色附件,或者在第一个图元完成时在传统架构上使用颜色附件。并且它将继续使用它,直到所有图块\基元达到颜色写入阶段。
    • 如果STORE_OP_STORE,无论哪种方式,底层附件都可能在执行过程中被使用\流式传输。阶段顺序取决于原语,不是全局的。对于给定的像素(x,y,layer,sample),附件将在最后一个流水线阶段写入。但这可能意味着其他一些原语甚至可能没有执行第一个管道阶段。请参阅:原始顺序和光栅化顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 2010-10-19
    相关资源
    最近更新 更多