From dcb77390575a127446de8cb7de840ca9149d11d3 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 (cherry picked from commit d8e1409948af46cde76de50347b6d560cd434a89) Part-of: --- .pick_status.json | 2 +- src/freedreno/ir3/ir3_compiler_nir.c | 20 ++++---------------- src/freedreno/ir3/ir3_context.h | 3 +-- 3 files changed, 6 insertions(+), 19 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index b3919964c66..d11c6d9c18f 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -994,7 +994,7 @@ "description": "ir3: don't cache driver param instructions", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "8b0b81339b9c3806981ee2ec7c08501bbd8bb7a3", "notes": null diff --git a/src/freedreno/ir3/ir3_compiler_nir.c b/src/freedreno/ir3/ir3_compiler_nir.c index 130c244a3aa..0fb4ff63ab6 100644 --- a/src/freedreno/ir3/ir3_compiler_nir.c +++ b/src/freedreno/ir3/ir3_compiler_nir.c @@ -2944,28 +2944,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 2aeed94a348..1ee8562d37b 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;