mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-15 11:40:39 +01:00
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:
parent
3da857d7c5
commit
79f0060618
5 changed files with 30 additions and 14 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue