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 <jnoorman@igalia.com>
Fixes: 8b0b81339b ("freedreno/ir3: add NIR compiler")
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/work_items/15418
(cherry picked from commit d8e1409948)

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41540>
This commit is contained in:
Job Noorman 2026-05-11 15:51:50 +02:00 committed by Eric Engestrom
parent d5a8b1aba9
commit dcb7739057
3 changed files with 6 additions and 19 deletions

View file

@ -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

View file

@ -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) {

View file

@ -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;