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 <michael.blumenkrantz@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37037>
This commit is contained in:
Timothy Arceri 2025-08-29 12:21:23 +10:00 committed by Marge Bot
parent 3da857d7c5
commit 79f0060618
5 changed files with 30 additions and 14 deletions

View file

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

View file

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

View file

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

View file

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

View file

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