Mesa (main): microsoft/clc: use nir_shader_instructions_pass in clc_nir_dedupe_const_samplers

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Aug 11 11:56:54 UTC 2021


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

Author: Marcin Ślusarz <marcin.slusarz at intel.com>
Date:   Tue Aug 10 13:03:51 2021 +0200

microsoft/clc: use nir_shader_instructions_pass in clc_nir_dedupe_const_samplers

Changes:
- nir_metadata_preserve(..., nir_metadata_all) is called when pass doesn't
  make progress

v2: fix build

Signed-off-by: Marcin Ślusarz <marcin.slusarz at intel.com>
Reviewed-by: Jesse Natalie <jenatali at microsoft.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/12324>

---

 src/microsoft/clc/clc_nir.c | 76 +++++++++++++++++++++------------------------
 1 file changed, 36 insertions(+), 40 deletions(-)

diff --git a/src/microsoft/clc/clc_nir.c b/src/microsoft/clc/clc_nir.c
index dcb3994356e..b9fe1008a56 100644
--- a/src/microsoft/clc/clc_nir.c
+++ b/src/microsoft/clc/clc_nir.c
@@ -302,53 +302,49 @@ find_identical_const_sampler(nir_shader *nir, nir_variable *sampler)
    unreachable("Should have at least found the input sampler");
 }
 
-bool
-clc_nir_dedupe_const_samplers(nir_shader *nir)
+static bool
+clc_nir_dedupe_const_samplers_instr(nir_builder *b,
+                                    nir_instr *instr,
+                                    void *cb_data)
 {
-   bool progress = false;
-   nir_foreach_function(func, nir) {
-      if (!func->impl)
-         continue;
+   nir_shader *nir = cb_data;
+   if (instr->type != nir_instr_type_tex)
+      return false;
 
-      nir_builder b;
-      nir_builder_init(&b, func->impl);
+   nir_tex_instr *tex = nir_instr_as_tex(instr);
+   int sampler_idx = nir_tex_instr_src_index(tex, nir_tex_src_sampler_deref);
+   if (sampler_idx == -1)
+      return false;
 
-      nir_foreach_block(block, func->impl) {
-         nir_foreach_instr_safe(instr, block) {
-            if (instr->type != nir_instr_type_tex)
-               continue;
+   nir_deref_instr *deref = nir_src_as_deref(tex->src[sampler_idx].src);
+   nir_variable *sampler = nir_deref_instr_get_variable(deref);
+   if (!sampler)
+      return false;
 
-            nir_tex_instr *tex = nir_instr_as_tex(instr);
-            int sampler_idx = nir_tex_instr_src_index(tex, nir_tex_src_sampler_deref);
-            if (sampler_idx == -1)
-               continue;
+   assert(sampler->data.mode == nir_var_uniform);
 
-            nir_deref_instr *deref = nir_src_as_deref(tex->src[sampler_idx].src);
-            nir_variable *sampler = nir_deref_instr_get_variable(deref);
-            if (!sampler)
-               continue;
+   if (!sampler->data.sampler.is_inline_sampler)
+      return false;
 
-            assert(sampler->data.mode == nir_var_uniform);
+   nir_variable *replacement = find_identical_const_sampler(nir, sampler);
+   if (replacement == sampler)
+      return false;
 
-            if (!sampler->data.sampler.is_inline_sampler)
-               continue;
+   b->cursor = nir_before_instr(&tex->instr);
+   nir_deref_instr *replacement_deref = nir_build_deref_var(b, replacement);
+   nir_instr_rewrite_src(&tex->instr, &tex->src[sampler_idx].src,
+                         nir_src_for_ssa(&replacement_deref->dest.ssa));
+   nir_deref_instr_remove_if_unused(deref);
 
-            nir_variable *replacement = find_identical_const_sampler(nir, sampler);
-            if (replacement == sampler)
-               continue;
-
-            b.cursor = nir_before_instr(&tex->instr);
-            nir_deref_instr *replacement_deref = nir_build_deref_var(&b, replacement);
-            nir_instr_rewrite_src(&tex->instr, &tex->src[sampler_idx].src,
-                                  nir_src_for_ssa(&replacement_deref->dest.ssa));
-            nir_deref_instr_remove_if_unused(deref);
-            progress = true;
-         }
-      }
+   return true;
+}
 
-      if (progress) {
-         nir_metadata_preserve(func->impl, nir_metadata_block_index | nir_metadata_dominance);
-      }
-   }
-   return progress;
+bool
+clc_nir_dedupe_const_samplers(nir_shader *nir)
+{
+   return nir_shader_instructions_pass(nir,
+                                       clc_nir_dedupe_const_samplers_instr,
+                                       nir_metadata_block_index |
+                                       nir_metadata_dominance,
+                                       nir);
 }



More information about the mesa-commit mailing list