From 5410f4ee898c57c921ea5537861e28ef5c8170bb Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Thu, 12 May 2022 14:10:32 -0500 Subject: [PATCH] mesa/st: Use lower_indirect_var_derefs in st_nir_lower_builtin Instead of having a special NIR helper for GL stuff, we can now use the more generic helper and do so directly. Reviewed-by: Lionel Landwerlin Part-of: --- src/compiler/nir/nir.h | 2 -- src/compiler/nir/nir_lower_indirect_derefs.c | 24 ---------------- src/mesa/state_tracker/st_glsl_to_nir.cpp | 9 +----- src/mesa/state_tracker/st_nir_lower_builtin.c | 28 ++++++++++++++++--- 4 files changed, 25 insertions(+), 38 deletions(-) diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index ff2de990959..88a2c0626c2 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -4469,8 +4469,6 @@ bool nir_lower_indirect_derefs(nir_shader *shader, nir_variable_mode modes, bool nir_lower_indirect_var_derefs(nir_shader *shader, const struct set *vars); -bool nir_lower_indirect_builtin_uniform_derefs(nir_shader *shader); - bool nir_lower_locals_to_regs(nir_shader *shader); void nir_lower_io_to_temporaries(nir_shader *shader, diff --git a/src/compiler/nir/nir_lower_indirect_derefs.c b/src/compiler/nir/nir_lower_indirect_derefs.c index 68c86f3fa92..93be7372528 100644 --- a/src/compiler/nir/nir_lower_indirect_derefs.c +++ b/src/compiler/nir/nir_lower_indirect_derefs.c @@ -244,27 +244,3 @@ nir_lower_indirect_var_derefs(nir_shader *shader, const struct set *vars) return progress; } - -/** Lowers indirect variable loads/stores to direct loads/stores. - * - * The pass works by replacing any indirect load or store with an if-ladder - * that does a binary search on the array index. It only changes uniform variable builtins, - * e.g., gl_LightSource - */ -bool -nir_lower_indirect_builtin_uniform_derefs(nir_shader *shader) -{ - struct set *vars = _mesa_pointer_set_create(NULL); - - nir_foreach_uniform_variable(var, shader) { - /* built-in's will always start with "gl_" */ - if (strncmp(var->name, "gl_", 3) == 0) - _mesa_set_add(vars, var); - } - - bool progress = nir_lower_indirect_var_derefs(shader, vars); - - _mesa_set_destroy(vars, NULL); - - return progress; -} diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 0c87103ed70..10df319593d 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -481,15 +481,8 @@ st_glsl_to_nir_post_opts(struct st_context *st, struct gl_program *prog, * storage don't need to lower builtins. */ if (!shader_program->data->spirv && - !st->ctx->Const.PackedDriverUniformStorage) { - /* at this point, array uniforms have been split into separate - * nir_variable structs where possible. this codepath can't handle dynamic - * array indexing, however, so all indirect uniform derefs - * must be eliminated beforehand to avoid trying to lower one of those builtins - */ - NIR_PASS_V(nir, nir_lower_indirect_builtin_uniform_derefs); + !st->ctx->Const.PackedDriverUniformStorage) NIR_PASS_V(nir, st_nir_lower_builtin); - } if (!screen->get_param(screen, PIPE_CAP_NIR_ATOMICS_AS_DEREF)) NIR_PASS_V(nir, gl_nir_lower_atomics, shader_program, true); diff --git a/src/mesa/state_tracker/st_nir_lower_builtin.c b/src/mesa/state_tracker/st_nir_lower_builtin.c index 87a16040ae6..d5b94680c62 100644 --- a/src/mesa/state_tracker/st_nir_lower_builtin.c +++ b/src/mesa/state_tracker/st_nir_lower_builtin.c @@ -232,8 +232,28 @@ lower_builtin_instr(nir_builder *b, nir_instr *instr, UNUSED void *_data) void st_nir_lower_builtin(nir_shader *shader) { - if (nir_shader_instructions_pass(shader, lower_builtin_instr, - nir_metadata_block_index | - nir_metadata_dominance, NULL)) - nir_remove_dead_derefs(shader); + struct set *vars = _mesa_pointer_set_create(NULL); + + nir_foreach_uniform_variable(var, shader) { + /* built-in's will always start with "gl_" */ + if (strncmp(var->name, "gl_", 3) == 0) + _mesa_set_add(vars, var); + } + + if (vars->entries > 0) { + /* at this point, array uniforms have been split into separate + * nir_variable structs where possible. this codepath can't handle + * dynamic array indexing, however, so all indirect uniform derefs must + * be eliminated beforehand to avoid trying to lower one of those + * builtins + */ + nir_lower_indirect_var_derefs(shader, vars); + + if (nir_shader_instructions_pass(shader, lower_builtin_instr, + nir_metadata_block_index | + nir_metadata_dominance, NULL)) + nir_remove_dead_derefs(shader); + } + + _mesa_set_destroy(vars, NULL); }