Module: Mesa
Branch: master
Commit: 6900498faa844ec7b711aa9b62b2470f6ffb8e51
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6900498faa844ec7b711aa9b62b2470f6ffb8e51

Author: Mike Blumenkrantz <[email protected]>
Date:   Mon Mar 22 13:41:12 2021 -0400

nir: add nir_lower_indirect_builtin_uniform_derefs()

this is a special version of indirect deref lowering which is used by
mesa/st to remove dynamic indexing from builtin uniforms for the lowering
pass in non-packed uniform case

Reviewed-by: Rob Clark <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9741>

---

 src/compiler/nir/nir.h                       |  2 ++
 src/compiler/nir/nir_lower_indirect_derefs.c | 34 ++++++++++++++++++++++++----
 2 files changed, 32 insertions(+), 4 deletions(-)

diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h
index cb692846104..23c61e04ea2 100644
--- a/src/compiler/nir/nir.h
+++ b/src/compiler/nir/nir.h
@@ -4319,6 +4319,8 @@ bool nir_lower_array_deref_of_vec(nir_shader *shader, 
nir_variable_mode modes,
 bool nir_lower_indirect_derefs(nir_shader *shader, nir_variable_mode modes,
                                uint32_t max_lower_array_len);
 
+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 a9784355625..a4325377538 100644
--- a/src/compiler/nir/nir_lower_indirect_derefs.c
+++ b/src/compiler/nir/nir_lower_indirect_derefs.c
@@ -114,7 +114,8 @@ emit_load_store_deref(nir_builder *b, nir_intrinsic_instr 
*orig_instr,
 static bool
 lower_indirect_derefs_block(nir_block *block, nir_builder *b,
                             nir_variable_mode modes,
-                            uint32_t max_lower_array_len)
+                            uint32_t max_lower_array_len,
+                            bool builtins_only)
 {
    bool progress = false;
 
@@ -158,6 +159,10 @@ lower_indirect_derefs_block(nir_block *block, nir_builder 
*b,
       if (!(modes & base->var->data.mode) && !base->var->data.compact)
          continue;
 
+      /* built-in's will always start with "gl_" */
+      if (builtins_only && strncmp(base->var->name, "gl_", 3))
+         continue;
+
       b->cursor = nir_instr_remove(&intrin->instr);
 
       nir_deref_path path;
@@ -185,7 +190,7 @@ lower_indirect_derefs_block(nir_block *block, nir_builder 
*b,
 
 static bool
 lower_indirects_impl(nir_function_impl *impl, nir_variable_mode modes,
-                     uint32_t max_lower_array_len)
+                     uint32_t max_lower_array_len, bool builtins_only)
 {
    nir_builder builder;
    nir_builder_init(&builder, impl);
@@ -193,7 +198,7 @@ lower_indirects_impl(nir_function_impl *impl, 
nir_variable_mode modes,
 
    nir_foreach_block_safe(block, impl) {
       progress |= lower_indirect_derefs_block(block, &builder, modes,
-                                              max_lower_array_len);
+                                              max_lower_array_len, 
builtins_only);
    }
 
    if (progress)
@@ -218,7 +223,28 @@ nir_lower_indirect_derefs(nir_shader *shader, 
nir_variable_mode modes,
    nir_foreach_function(function, shader) {
       if (function->impl) {
          progress = lower_indirects_impl(function->impl, modes,
-                                         max_lower_array_len) || progress;
+                                         max_lower_array_len, false) || 
progress;
+      }
+   }
+
+   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)
+{
+   bool progress = false;
+
+   nir_foreach_function(function, shader) {
+      if (function->impl) {
+         progress = lower_indirects_impl(function->impl, nir_var_uniform,
+                                         UINT_MAX, true) || progress;
       }
    }
 

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to