From 79f0060618675f2bcef1ae76da81f34a4e0ef4e8 Mon Sep 17 00:00:00 2001 From: Timothy Arceri Date: Fri, 29 Aug 2025 12:21:23 +1000 Subject: [PATCH] st/glsl: fix packed uniform handling in st_nir_lower_fog() This previously worked because the driver locations would later be overwritten when st_nir_assign_uniform_locations() was called for a second time but we will be skipping the extra call in a later patch. Reviewed-by: Mike Blumenkrantz Part-of: --- src/mesa/main/ff_fragment_shader.c | 10 ++++++---- src/mesa/program/prog_to_nir.c | 6 ++++-- src/mesa/state_tracker/st_nir.h | 3 ++- src/mesa/state_tracker/st_nir_lower_fog.c | 22 ++++++++++++++++------ src/mesa/state_tracker/st_program.c | 3 ++- 5 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/mesa/main/ff_fragment_shader.c b/src/mesa/main/ff_fragment_shader.c index 1fb75fce1a8..235ab7e0aaa 100644 --- a/src/mesa/main/ff_fragment_shader.c +++ b/src/mesa/main/ff_fragment_shader.c @@ -925,7 +925,7 @@ emit_instructions(struct texenv_fragment_program *p) * current texture env/combine mode. */ static nir_shader * -create_new_program(struct state_key *key, +create_new_program(struct gl_context *ctx, struct state_key *key, struct gl_program *program, const nir_shader_compiler_options *options) { @@ -954,8 +954,10 @@ create_new_program(struct state_key *key, nir_validate_shader(b.shader, "after generating ff-vertex shader"); - if (key->fog_mode) - NIR_PASS(_, b.shader, st_nir_lower_fog, key->fog_mode, p.state_params); + if (key->fog_mode) { + NIR_PASS(_, b.shader, st_nir_lower_fog, key->fog_mode, p.state_params, + ctx->Const.PackedDriverUniformStorage); + } _mesa_add_separate_state_parameters(program, p.state_params); _mesa_free_parameter_list(p.state_params); @@ -989,7 +991,7 @@ _mesa_get_fixed_func_fragment_program(struct gl_context *ctx) ctx->screen->nir_options[MESA_SHADER_FRAGMENT]; nir_shader *s = - create_new_program(&key, prog, options); + create_new_program(ctx, &key, prog, options); prog->state.type = PIPE_SHADER_IR_NIR; prog->nir = s; diff --git a/src/mesa/program/prog_to_nir.c b/src/mesa/program/prog_to_nir.c index 6b80acf2cff..ecf088d615a 100644 --- a/src/mesa/program/prog_to_nir.c +++ b/src/mesa/program/prog_to_nir.c @@ -862,8 +862,10 @@ prog_to_nir(const struct gl_context *ctx, const struct gl_program *prog) } /* Add OPTION ARB_fog_exp code */ - if (prog->arb.Fog) - NIR_PASS(_, s, st_nir_lower_fog, prog->arb.Fog, prog->Parameters); + if (prog->arb.Fog) { + NIR_PASS(_, s, st_nir_lower_fog, prog->arb.Fog, prog->Parameters, + ctx->Const.PackedDriverUniformStorage); + } fail: if (c->error) { diff --git a/src/mesa/state_tracker/st_nir.h b/src/mesa/state_tracker/st_nir.h index b4d90631a20..42264559f00 100644 --- a/src/mesa/state_tracker/st_nir.h +++ b/src/mesa/state_tracker/st_nir.h @@ -79,7 +79,8 @@ st_nir_state_variable_create(struct nir_shader *shader, bool packed_driver_uniform_storage); bool st_nir_lower_fog(struct nir_shader *s, enum gl_fog_mode fog_mode, - struct gl_program_parameter_list *paramList); + struct gl_program_parameter_list *paramList, + bool packed_driver_uniform_storage); bool st_nir_lower_position_invariant(struct nir_shader *s, struct gl_program_parameter_list *paramList); diff --git a/src/mesa/state_tracker/st_nir_lower_fog.c b/src/mesa/state_tracker/st_nir_lower_fog.c index d303de61515..f400048c6b1 100644 --- a/src/mesa/state_tracker/st_nir_lower_fog.c +++ b/src/mesa/state_tracker/st_nir_lower_fog.c @@ -7,8 +7,11 @@ #include "nir_builtin_builder.h" #include "st_nir.h" + static nir_def * -fog_result(nir_builder *b, nir_def *color, enum gl_fog_mode fog_mode, struct gl_program_parameter_list *paramList) +fog_result(nir_builder *b, nir_def *color, enum gl_fog_mode fog_mode, + struct gl_program_parameter_list *paramList, + bool packed_driver_uniform_storage) { nir_shader *s = b->shader; nir_def *baryc = nir_load_barycentric_pixel(b, 32, @@ -20,11 +23,13 @@ fog_result(nir_builder *b, nir_def *color, enum gl_fog_mode fog_mode, struct gl_ static const gl_state_index16 fog_color_tokens[STATE_LENGTH] = {STATE_FOG_COLOR}; nir_variable *fog_params_var = - st_nir_state_variable_create(s, glsl_vec4_type(), paramList, fog_params_tokens, NULL, false); + st_nir_state_variable_create(s, glsl_vec4_type(), paramList, fog_params_tokens, + NULL, packed_driver_uniform_storage); nir_def *params = nir_load_var(b, fog_params_var); nir_variable *fog_color_var = - st_nir_state_variable_create(s, glsl_vec4_type(), paramList, fog_color_tokens, NULL, false); + st_nir_state_variable_create(s, glsl_vec4_type(), paramList, fog_color_tokens, + NULL, packed_driver_uniform_storage); nir_def *fog_color = nir_load_var(b, fog_color_var); /* compute the 1 component fog factor f */ @@ -75,6 +80,7 @@ fog_result(nir_builder *b, nir_def *color, enum gl_fog_mode fog_mode, struct gl_ struct lower_fog_state { enum gl_fog_mode fog_mode; struct gl_program_parameter_list *paramList; + bool packed_driver_uniform_storage; }; static bool @@ -97,7 +103,8 @@ st_nir_lower_fog_instr(nir_builder *b, nir_instr *instr, void *_state) nir_def *color = intr->src[0].ssa; color = nir_resize_vector(b, color, 4); - nir_def *fog = fog_result(b, color, state->fog_mode, state->paramList); + nir_def *fog = fog_result(b, color, state->fog_mode, state->paramList, + state->packed_driver_uniform_storage); /* retain the non-fog-blended alpha value for color */ color = nir_vector_insert_imm(b, fog, nir_channel(b, color, 3), 3); @@ -109,13 +116,16 @@ st_nir_lower_fog_instr(nir_builder *b, nir_instr *instr, void *_state) } bool -st_nir_lower_fog(nir_shader *s, enum gl_fog_mode fog_mode, struct gl_program_parameter_list *paramList) +st_nir_lower_fog(nir_shader *s, enum gl_fog_mode fog_mode, + struct gl_program_parameter_list *paramList, + bool packed_driver_uniform_storage) { assert(s->info.io_lowered); struct lower_fog_state state = { .fog_mode = fog_mode, - .paramList = paramList, + .paramList = paramList, + .packed_driver_uniform_storage = packed_driver_uniform_storage, }; return nir_shader_instructions_pass(s, st_nir_lower_fog_instr, nir_metadata_control_flow, diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 24e49dbb4c4..e59185cbdd4 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -1062,7 +1062,8 @@ st_create_fp_variant(struct st_context *st, if (fp->ati_fs) { if (key->fog) { - NIR_PASS(_, state.ir.nir, st_nir_lower_fog, key->fog, fp->Parameters); + NIR_PASS(_, state.ir.nir, st_nir_lower_fog, key->fog, fp->Parameters, + st->ctx->Const.PackedDriverUniformStorage); } NIR_PASS(_, state.ir.nir, st_nir_lower_atifs_samplers, key->texture_index);