From 23ab18e9e3bcd0d2a381f7f99bea77e567563555 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Molinari?= Date: Tue, 31 Mar 2026 18:33:22 +0200 Subject: [PATCH] panfrost: Blit with the RUN_FULLSCREEN instruction (v13) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Extend RUN_FULLSCREEN support to architecture v13. Draw call descriptor flags must now be copied to input staging registers for the tiler to avoid dereferences in the fragment pre-pass. Signed-off-by: Loïc Molinari Reviewed-by: Ashley Smith Acked-by: Boris Brezillon Part-of: --- src/gallium/drivers/panfrost/pan_blit.c | 3 +-- src/gallium/drivers/panfrost/pan_csf.c | 36 +++++++++++++++---------- src/panfrost/genxml/v13.xml | 9 +++++++ 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/gallium/drivers/panfrost/pan_blit.c b/src/gallium/drivers/panfrost/pan_blit.c index a8710e1cc04..f49504be582 100644 --- a/src/gallium/drivers/panfrost/pan_blit.c +++ b/src/gallium/drivers/panfrost/pan_blit.c @@ -25,8 +25,7 @@ panfrost_blitter_draw_rectangle(struct blitter_context *blitter, struct panfrost_context *pctx = pan_context(ctx); struct panfrost_screen *scr = pan_screen(ctx->screen); - if (scr->dev.arch <= 8 || scr->dev.arch >= 13 || depth != 0.0f || - num_instances > 1) + if (scr->dev.arch <= 8 || depth != 0.0f || num_instances > 1) goto fallback; /* Map viewport to the dest rect of the framebuffer. The tiler will then be diff --git a/src/gallium/drivers/panfrost/pan_csf.c b/src/gallium/drivers/panfrost/pan_csf.c index d060b349f9e..697dfb1d8d4 100644 --- a/src/gallium/drivers/panfrost/pan_csf.c +++ b/src/gallium/drivers/panfrost/pan_csf.c @@ -1476,23 +1476,21 @@ GENX(csf_launch_draw_indirect)(struct panfrost_batch *batch, } } -#if PAN_ARCH <= 12 static struct pan_ptr csf_emit_fullscreen_dcd(struct panfrost_batch *batch, - struct pan_ptr vertex_array, uint64_t resources) + struct pan_ptr vertex_array, uint64_t resources, + struct MALI_DCD_FLAGS_0 *dcd_flags0, + struct MALI_DCD_FLAGS_1 *dcd_flags1) { struct panfrost_context *ctx = batch->ctx; struct pan_ptr dcd = pan_pool_alloc_desc(&batch->pool.base, DRAW); - struct MALI_DCD_FLAGS_0 dcd_flags0_unpacked = { 0, }; - struct MALI_DCD_FLAGS_1 dcd_flags1_unpacked = { 0, }; - csf_emit_draw_flags(ctx, MESA_PRIM_QUADS, true, &dcd_flags0_unpacked, - &dcd_flags1_unpacked); + csf_emit_draw_flags(ctx, MESA_PRIM_QUADS, true, dcd_flags0, dcd_flags1); pan_cast_and_pack(dcd.cpu, DRAW, cfg) { /* Flags */ - cfg.flags_0 = dcd_flags0_unpacked; - cfg.flags_1 = dcd_flags1_unpacked; + cfg.flags_0 = *dcd_flags0; + cfg.flags_1 = *dcd_flags1; /* Vertex descriptor */ if (vertex_array.cpu) { @@ -1538,17 +1536,17 @@ csf_emit_fullscreen_dcd(struct panfrost_batch *batch, return dcd; } -#endif void GENX(csf_launch_draw_fullscreen)(struct panfrost_batch *batch, enum blitter_attrib_type type, const struct blitter_attrib *attrib) { -#if PAN_ARCH <= 12 PAN_TRACE_FUNC(PAN_TRACE_GL_CSF); struct cs_builder *b = batch->csf.cs.builder; + struct MALI_DCD_FLAGS_0 dcd_flags0_unpacked = { 0, }; + struct MALI_DCD_FLAGS_1 dcd_flags1_unpacked = { 0, }; if (batch->draw_count == 0) { emit_tiler_oom_context(b, batch); @@ -1559,7 +1557,9 @@ GENX(csf_launch_draw_fullscreen)(struct panfrost_batch *batch, struct pan_ptr array = panfrost_emit_fullscreen_vertex_array(batch, type, attrib); uint64_t resources = panfrost_emit_resources(batch, MESA_SHADER_FRAGMENT); - struct pan_ptr dcd = csf_emit_fullscreen_dcd(batch, array, resources); + struct pan_ptr dcd = csf_emit_fullscreen_dcd(batch, array, resources, + &dcd_flags0_unpacked, + &dcd_flags1_unpacked); struct mali_primitive_flags_packed primitive_flags; pan_pack(&primitive_flags, PRIMITIVE_FLAGS, cfg) { @@ -1574,14 +1574,22 @@ GENX(csf_launch_draw_fullscreen)(struct panfrost_batch *batch, cs_move64_to(b, cs_sr_reg64(b, FULLSCREEN, SCISSOR_BOX), *sbd); cs_move32_to(b, cs_sr_reg32(b, FULLSCREEN, TILER_FLAGS), primitive_flags.opaque[0]); +#if PAN_ARCH >= 13 + struct mali_dcd_flags_0_packed dcd_flags0; + struct mali_dcd_flags_1_packed dcd_flags1; + MALI_DCD_FLAGS_0_pack(&dcd_flags0, &dcd_flags0_unpacked); + MALI_DCD_FLAGS_1_pack(&dcd_flags1, &dcd_flags1_unpacked); + cs_move32_to(b, cs_sr_reg32(b, FULLSCREEN, TILER_DCD_FLAGS0), + dcd_flags0.opaque[0]); + cs_move32_to(b, cs_sr_reg32(b, FULLSCREEN, TILER_DCD_FLAGS1), + dcd_flags1.opaque[0]); + cs_move32_to(b, cs_sr_reg32(b, FULLSCREEN, TILER_DCD_FLAGS2), 0); +#endif /* Emit RUN_FULLSCREEN. */ struct cs_index dcd_pointer = cs_reg64(b, 64); cs_move64_to(b, dcd_pointer, dcd.gpu); cs_run_fullscreen(b, 0, dcd_pointer); -#else - UNREACHABLE("Unsupported architecture!"); -#endif } #define POSITION_FIFO_SIZE (64 * 1024) diff --git a/src/panfrost/genxml/v13.xml b/src/panfrost/genxml/v13.xml index c644d2bd49c..14d7b46d30e 100644 --- a/src/panfrost/genxml/v13.xml +++ b/src/panfrost/genxml/v13.xml @@ -1464,6 +1464,15 @@ + + + + + + + + +