From 25248fae8392151997e6f84e80142c705b2f1960 Mon Sep 17 00:00:00 2001 From: Mary Guillemard Date: Mon, 9 Sep 2024 17:06:53 +0200 Subject: [PATCH] panvk: Take rasterization samples into account in draw We were ignoring rasterization samples count before. This fix "dEQP-VK.query_pool.occlusion_query.no_attachments_multisample" failure. Signed-off-by: Mary Guillemard Reviewed-by: Boris Brezillon Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 16 ++++++++++++++++ src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 14 ++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index c22ae9a0d4f..5fa85b4ab3e 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -1391,6 +1391,22 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) cmdbuf->state.gfx.fs.required = fs_required(&cmdbuf->state.gfx, &cmdbuf->vk.dynamic_graphics_state); + if (!cmdbuf->vk.dynamic_graphics_state.rs.rasterizer_discard_enable) { + struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info; + uint32_t rasterization_samples = + cmdbuf->vk.dynamic_graphics_state.ms.rasterization_samples; + + /* If there's no attachment, we patch nr_samples to match + * rasterization_samples, otherwise, we make sure those two numbers match. + */ + if (!cmdbuf->state.gfx.render.bound_attachments) { + assert(rasterization_samples > 0); + fbinfo->nr_samples = rasterization_samples; + } else { + assert(rasterization_samples == fbinfo->nr_samples); + } + } + result = prepare_draw(cmdbuf, draw); if (result != VK_SUCCESS) return; diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index 930da0d8134..038bbf02dbb 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -1226,6 +1226,20 @@ panvk_cmd_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) bool needs_tiling = !rs->rasterizer_discard_enable; if (!rs->rasterizer_discard_enable) { + struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info; + uint32_t rasterization_samples = + cmdbuf->vk.dynamic_graphics_state.ms.rasterization_samples; + + /* If there's no attachment, and the FB descriptor hasn't been allocated + * yet, we patch nr_samples to match rasterization_samples, otherwise, we + * make sure those two numbers match. */ + if (!batch->fb.desc.gpu && !cmdbuf->state.gfx.render.bound_attachments) { + assert(rasterization_samples > 0); + fbinfo->nr_samples = rasterization_samples; + } else { + assert(rasterization_samples == fbinfo->nr_samples); + } + result = panvk_per_arch(cmd_alloc_fb_desc)(cmdbuf); if (result != VK_SUCCESS) return;