From d8e1409948af46cde76de50347b6d560cd434a89 Mon Sep 17 00:00:00 2001 From: Job Noorman Date: Mon, 11 May 2026 15:51:50 +0200 Subject: [PATCH] ir3: don't cache driver param instructions We create driver param instructions once we encounter their first use and cache them for further uses. This creates problems when the first use occurs in a block that doesn't dominate all further uses. This was hit in practice with a driver param that was used both in the preamble and in the main shader. Fix this by simply not caching driver params. Since they are simply movs from const regs, ir3_cp or ir3_cse should clean up most cases of multiple uses. Signed-off-by: Job Noorman Fixes: 8b0b81339b9 ("freedreno/ir3: add NIR compiler") Closes: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/15418 Part-of: --- src/freedreno/ir3/ir3_compiler_nir.c | 20 ++++---------------- src/freedreno/ir3/ir3_context.h | 3 +-- 2 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index fb451354163..d490ce04bf4 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -3028,28 +3028,16 @@ emit_intrinsic(struct ir3_context *ctx, nir_intrinsic_instr *intr) break; case nir_intrinsic_load_base_vertex: case nir_intrinsic_load_first_vertex: - if (!ctx->basevertex) { - ctx->basevertex = create_driver_param(ctx, IR3_DP_VS(vtxid_base)); - } - dst[0] = ctx->basevertex; + dst[0] = create_driver_param(ctx, IR3_DP_VS(vtxid_base)); break; case nir_intrinsic_load_is_indexed_draw: - if (!ctx->is_indexed_draw) { - ctx->is_indexed_draw = create_driver_param(ctx, IR3_DP_VS(is_indexed_draw)); - } - dst[0] = ctx->is_indexed_draw; + dst[0] = create_driver_param(ctx, IR3_DP_VS(is_indexed_draw)); break; case nir_intrinsic_load_draw_id: - if (!ctx->draw_id) { - ctx->draw_id = create_driver_param(ctx, IR3_DP_VS(draw_id)); - } - dst[0] = ctx->draw_id; + dst[0] = create_driver_param(ctx, IR3_DP_VS(draw_id)); break; case nir_intrinsic_load_base_instance: - if (!ctx->base_instance) { - ctx->base_instance = create_driver_param(ctx, IR3_DP_VS(instid_base)); - } - dst[0] = ctx->base_instance; + dst[0] = create_driver_param(ctx, IR3_DP_VS(instid_base)); break; case nir_intrinsic_load_view_index: if (!ctx->view_index) { diff --git a/src/freedreno/ir3/ir3_context.h b/src/freedreno/ir3/ir3_context.h index f8da951f8b4..82a63e87278 100644 --- a/src/freedreno/ir3/ir3_context.h +++ b/src/freedreno/ir3/ir3_context.h @@ -67,8 +67,7 @@ struct ir3_context { struct ir3_instruction *frag_face, *frag_coord; /* For vertex shaders, keep track of the system values sources */ - struct ir3_instruction *vertex_id, *basevertex, *instance_id, *base_instance, - *draw_id, *view_index, *is_indexed_draw; + struct ir3_instruction *vertex_id, *instance_id, *view_index; /* For fragment shaders: */ struct ir3_instruction *samp_id, *samp_mask_in;