Mesa (main): mesa/st: Use lower_indirect_var_derefs in st_nir_lower_builtin

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Fri May 13 23:17:31 UTC 2022


Module: Mesa
Branch: main
Commit: 5410f4ee898c57c921ea5537861e28ef5c8170bb
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=5410f4ee898c57c921ea5537861e28ef5c8170bb

Author: Jason Ekstrand <jason.ekstrand at collabora.com>
Date:   Thu May 12 14:10:32 2022 -0500

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 <lionel.g.landwerlin at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16482>

---

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



More information about the mesa-commit mailing list