Mesa (master): nir/opt_intrinsics: Refactor a bit

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Nov 3 23:31:09 UTC 2020


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

Author: Jason Ekstrand <jason at jlekstrand.net>
Date:   Fri Oct 23 16:05:29 2020 -0500

nir/opt_intrinsics: Refactor a bit

Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira at intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7366>

---

 src/compiler/nir/nir_opt_intrinsics.c | 96 ++++++++++++++++++++---------------
 1 file changed, 55 insertions(+), 41 deletions(-)

diff --git a/src/compiler/nir/nir_opt_intrinsics.c b/src/compiler/nir/nir_opt_intrinsics.c
index 4111a7c60fc..2b2e64c9fdd 100644
--- a/src/compiler/nir/nir_opt_intrinsics.c
+++ b/src/compiler/nir/nir_opt_intrinsics.c
@@ -28,6 +28,54 @@
  * \file nir_opt_intrinsics.c
  */
 
+static bool
+opt_intrinsics_intrin(nir_builder *b, nir_intrinsic_instr *intrin,
+                      const struct nir_shader_compiler_options *options)
+{
+   switch (intrin->intrinsic) {
+   case nir_intrinsic_load_sample_mask_in: {
+      /* Transform:
+       *   gl_SampleMaskIn == 0 ---> gl_HelperInvocation
+       *   gl_SampleMaskIn != 0 ---> !gl_HelperInvocation
+       */
+      if (!options->optimize_sample_mask_in)
+         return false;
+
+      bool progress = false;
+      nir_foreach_use_safe(use_src, &intrin->dest.ssa) {
+         if (use_src->parent_instr->type == nir_instr_type_alu) {
+            nir_alu_instr *alu = nir_instr_as_alu(use_src->parent_instr);
+
+            if (alu->op == nir_op_ieq ||
+                alu->op == nir_op_ine) {
+               /* Check for 0 in either operand. */
+               nir_const_value *const_val =
+                   nir_src_as_const_value(alu->src[0].src);
+               if (!const_val)
+                  const_val = nir_src_as_const_value(alu->src[1].src);
+               if (!const_val || const_val->i32 != 0)
+                  continue;
+
+               nir_ssa_def *new_expr = nir_load_helper_invocation(b, 1);
+
+               if (alu->op == nir_op_ine)
+                  new_expr = nir_inot(b, new_expr);
+
+               nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa,
+                                        nir_src_for_ssa(new_expr));
+               nir_instr_remove(&alu->instr);
+               progress = true;
+            }
+         }
+      }
+      return progress;
+   }
+
+   default:
+      return false;
+   }
+}
+
 static bool
 opt_intrinsics_impl(nir_function_impl *impl,
                     const struct nir_shader_compiler_options *options)
@@ -38,49 +86,15 @@ opt_intrinsics_impl(nir_function_impl *impl,
 
    nir_foreach_block(block, impl) {
       nir_foreach_instr_safe(instr, block) {
-         if (instr->type != nir_instr_type_intrinsic)
-            continue;
-
-         nir_intrinsic_instr *intrin = nir_instr_as_intrinsic(instr);
          b.cursor = nir_before_instr(instr);
 
-         switch (intrin->intrinsic) {
-         case nir_intrinsic_load_sample_mask_in:
-            /* Transform:
-             *   gl_SampleMaskIn == 0 ---> gl_HelperInvocation
-             *   gl_SampleMaskIn != 0 ---> !gl_HelperInvocation
-             */
-            if (!options->optimize_sample_mask_in)
-               continue;
-
-            nir_foreach_use_safe(use_src, &intrin->dest.ssa) {
-               if (use_src->parent_instr->type == nir_instr_type_alu) {
-                  nir_alu_instr *alu = nir_instr_as_alu(use_src->parent_instr);
-
-                  if (alu->op == nir_op_ieq ||
-                      alu->op == nir_op_ine) {
-                     /* Check for 0 in either operand. */
-                     nir_const_value *const_val =
-                         nir_src_as_const_value(alu->src[0].src);
-                     if (!const_val)
-                        const_val = nir_src_as_const_value(alu->src[1].src);
-                     if (!const_val || const_val->i32 != 0)
-                        continue;
-
-                     nir_ssa_def *new_expr = nir_load_helper_invocation(&b, 1);
-
-                     if (alu->op == nir_op_ine)
-                        new_expr = nir_inot(&b, new_expr);
-
-                     nir_ssa_def_rewrite_uses(&alu->dest.dest.ssa,
-                                              nir_src_for_ssa(new_expr));
-                     nir_instr_remove(&alu->instr);
-                     progress = true;
-                     continue;
-                  }
-               }
-            }
-            continue;
+         switch (instr->type) {
+         case nir_instr_type_intrinsic:
+            if (opt_intrinsics_intrin(&b, nir_instr_as_intrinsic(instr),
+                                      options))
+               progress = true;
+            break;
+
          default:
             break;
          }



More information about the mesa-commit mailing list