From c6ebf3cc59ad2e9bc857d439fc53956f48ed1076 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Fri, 23 Jan 2026 02:49:32 -0500 Subject: [PATCH] panvk: Use the new FB code for tile size selection The only functional change is that the new code doesn't reserve space for dummy allocations. However, the old code never actually took dummy allocations into account when placing RTs so they end up overlapping anyway and it's not causing problems. Also, we set rt_count when there are no attachments and that doesn't reserve dummy space so clearly running with zero attachments is fine. Reviewed-by: Lars-Ivar Hesselberg Simonsen Acked-by: Boris Brezillon Acked-by: Eric R. Smith Part-of: --- src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c | 6 +++--- src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c | 6 +++--- src/panfrost/vulkan/panvk_vX_cmd_draw.c | 19 +++++++++++++------ 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c index 3c688323a56..6a7184f33e0 100644 --- a/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/csf/panvk_vX_cmd_draw.c @@ -2337,7 +2337,7 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) return result; if (!cmdbuf->vk.dynamic_graphics_state.rs.rasterizer_discard_enable) { - const struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info; + const struct pan_fb_layout *fb = &cmdbuf->state.gfx.render.fb.layout; uint32_t *nr_samples = &cmdbuf->state.gfx.render.fb.nr_samples; uint32_t rasterization_samples = cmdbuf->vk.dynamic_graphics_state.ms.rasterization_samples; @@ -2357,8 +2357,8 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_info *draw) * XXX: This currently can happen in case we resume a render pass with no * attachements and without any draw as the FBD is emitted when suspending. */ - assert(fbinfo->nr_samples == 0 || - fbinfo->nr_samples == cmdbuf->state.gfx.render.fb.nr_samples); + assert(fb->sample_count == 0 || + fb->sample_count == cmdbuf->state.gfx.render.fb.nr_samples); } if (!inherits_render_ctx(cmdbuf)) { diff --git a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c index f7bbfd8c53c..c5d0a722b95 100644 --- a/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/jm/panvk_vX_cmd_draw.c @@ -1298,7 +1298,7 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_data *draw) } if (!rs->rasterizer_discard_enable) { - const struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info; + const struct pan_fb_layout *fb = &cmdbuf->state.gfx.render.fb.layout; uint32_t *nr_samples = &cmdbuf->state.gfx.render.fb.nr_samples; uint32_t rasterization_samples = cmdbuf->vk.dynamic_graphics_state.ms.rasterization_samples; @@ -1318,8 +1318,8 @@ prepare_draw(struct panvk_cmd_buffer *cmdbuf, struct panvk_draw_data *draw) * XXX: This currently can happen in case we resume a render pass with no * attachements and without any draw as the FBD is emitted when suspending. */ - assert(fbinfo->nr_samples == 0 || - fbinfo->nr_samples == cmdbuf->state.gfx.render.fb.nr_samples); + assert(fb->sample_count == 0 || + fb->sample_count == cmdbuf->state.gfx.render.fb.nr_samples); result = panvk_per_arch(cmd_alloc_fb_desc)(cmdbuf); if (result != VK_SUCCESS) diff --git a/src/panfrost/vulkan/panvk_vX_cmd_draw.c b/src/panfrost/vulkan/panvk_vX_cmd_draw.c index 02d29a2ebb6..b128f70f15e 100644 --- a/src/panfrost/vulkan/panvk_vX_cmd_draw.c +++ b/src/panfrost/vulkan/panvk_vX_cmd_draw.c @@ -553,24 +553,31 @@ panvk_per_arch(cmd_init_render_state)(struct panvk_cmd_buffer *cmdbuf, void panvk_per_arch(cmd_select_tile_size)(struct panvk_cmd_buffer *cmdbuf) { - struct pan_fb_info *fbinfo = &cmdbuf->state.gfx.render.fb.info; + struct panvk_rendering_state *render = &cmdbuf->state.gfx.render; + struct pan_fb_layout *fb = &render->fb.layout; /* In case we never emitted tiler/framebuffer descriptors, we emit the * current sample count and compute tile size */ - if (fbinfo->nr_samples == 0) { - fbinfo->nr_samples = cmdbuf->state.gfx.render.fb.nr_samples; - GENX(pan_select_tile_size)(fbinfo); + assert(fb->sample_count == render->fb.info.nr_samples); + if (fb->sample_count == 0) { + fb->sample_count = render->fb.nr_samples; + render->fb.info.nr_samples = render->fb.nr_samples; + + GENX(pan_select_fb_tile_size)(fb); #if PAN_ARCH != 6 - if (fbinfo->cbuf_allocation > fbinfo->tile_buf_budget) { + if (fb->tile_rt_alloc_B > fb->tile_rt_budget_B) { vk_perf(VK_LOG_OBJS(&cmdbuf->vk.base), "Using too much tile-memory, disabling pipelining"); } #endif + + render->fb.info.tile_size = fb->tile_size_px; + render->fb.info.cbuf_allocation = fb->tile_rt_alloc_B; } else { /* In case we already emitted tiler/framebuffer descriptors, we ensure * that the sample count didn't change (this should never happen) */ - assert(fbinfo->nr_samples == cmdbuf->state.gfx.render.fb.nr_samples); + assert(fb->sample_count == render->fb.nr_samples); } }