compiler/lower_64bit_packing: rename the pass to be more generic
authorIago Toral Quiroga <itoral@igalia.com>
Fri, 27 Apr 2018 07:28:48 +0000 (09:28 +0200)
committerIago Toral Quiroga <itoral@igalia.com>
Thu, 3 May 2018 09:40:26 +0000 (11:40 +0200)
It can do 32-bit packing too now.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
src/amd/vulkan/radv_shader.c
src/compiler/Makefile.sources
src/compiler/nir/meson.build
src/compiler/nir/nir.h
src/compiler/nir/nir_lower_64bit_packing.c [deleted file]
src/compiler/nir/nir_lower_packing.c [new file with mode: 0644]
src/intel/compiler/brw_nir.c
src/mesa/state_tracker/st_glsl_to_nir.cpp

index 014ed78c228b24355f9389b75f56093ede719ea2..27b3fbed16dc24a5a7446e96f8a6e2520834a72d 100644 (file)
@@ -125,7 +125,7 @@ radv_optimize_nir(struct nir_shader *shader)
                 progress = false;
 
                 NIR_PASS_V(shader, nir_lower_vars_to_ssa);
-               NIR_PASS_V(shader, nir_lower_64bit_pack);
+               NIR_PASS_V(shader, nir_lower_pack);
                 NIR_PASS_V(shader, nir_lower_alu_to_scalar);
                 NIR_PASS_V(shader, nir_lower_phis_to_scalar);
 
index a219ed9f794a8a7426ecdce002fad3c7610ea1bd..80a61e507b27d45c71408b5c43d29d99adfbda1a 100644 (file)
@@ -212,7 +212,6 @@ NIR_FILES = \
        nir/nir_liveness.c \
        nir/nir_loop_analyze.c \
        nir/nir_loop_analyze.h \
-       nir/nir_lower_64bit_packing.c \
        nir/nir_lower_alpha_test.c \
        nir/nir_lower_alu_to_scalar.c \
        nir/nir_lower_atomics_to_ssbo.c \
@@ -236,6 +235,7 @@ NIR_FILES = \
        nir/nir_lower_io_to_temporaries.c \
        nir/nir_lower_io_to_scalar.c \
        nir/nir_lower_io_types.c \
+       nir/nir_lower_packing.c \
        nir/nir_lower_passthrough_edgeflags.c \
        nir/nir_lower_patch_vertices.c \
        nir/nir_lower_phis_to_scalar.c \
index 57bf90c58b1326b2d61a4c7b5007114ed742d3c9..f5a4affc8935496fb2b33ac5b956aa6ce95e0e7c 100644 (file)
@@ -103,7 +103,6 @@ files_libnir = files(
   'nir_liveness.c',
   'nir_loop_analyze.c',
   'nir_loop_analyze.h',
-  'nir_lower_64bit_packing.c',
   'nir_lower_alu_to_scalar.c',
   'nir_lower_alpha_test.c',
   'nir_lower_atomics_to_ssbo.c',
@@ -126,6 +125,7 @@ files_libnir = files(
   'nir_lower_io_to_temporaries.c',
   'nir_lower_io_to_scalar.c',
   'nir_lower_io_types.c',
+  'nir_lower_packing.c',
   'nir_lower_passthrough_edgeflags.c',
   'nir_lower_patch_vertices.c',
   'nir_lower_phis_to_scalar.c',
index a538d6981cc51cbf7a633b65bf1287c02b552e00..a379928cdcd9cecadde9f00a6d954a75ccce2c4d 100644 (file)
@@ -2786,7 +2786,7 @@ typedef enum {
 } nir_lower_doubles_options;
 
 bool nir_lower_doubles(nir_shader *shader, nir_lower_doubles_options options);
-bool nir_lower_64bit_pack(nir_shader *shader);
+bool nir_lower_pack(nir_shader *shader);
 
 bool nir_normalize_cubemap_coords(nir_shader *shader);
 
diff --git a/src/compiler/nir/nir_lower_64bit_packing.c b/src/compiler/nir/nir_lower_64bit_packing.c
deleted file mode 100644 (file)
index dd43549..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright © 2015 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- *
- */
-
-#include "nir.h"
-#include "nir_builder.h"
-
-/*
- * lowers:
- *
- * packDouble2x32(foo) -> packDouble2x32Split(foo.x, foo.y)
- * unpackDouble2x32(foo) -> vec2(unpackDouble2x32_x(foo), unpackDouble2x32_y(foo))
- * packInt2x32(foo) -> packInt2x32Split(foo.x, foo.y)
- * unpackInt2x32(foo) -> vec2(unpackInt2x32_x(foo), unpackInt2x32_y(foo))
- */
-
-static nir_ssa_def *
-lower_pack_64_from_32(nir_builder *b, nir_ssa_def *src)
-{
-   return nir_pack_64_2x32_split(b, nir_channel(b, src, 0),
-                                    nir_channel(b, src, 1));
-}
-
-static nir_ssa_def *
-lower_unpack_64_to_32(nir_builder *b, nir_ssa_def *src)
-{
-   return nir_vec2(b, nir_unpack_64_2x32_split_x(b, src),
-                      nir_unpack_64_2x32_split_y(b, src));
-}
-
-static nir_ssa_def *
-lower_pack_32_from_16(nir_builder *b, nir_ssa_def *src)
-{
-   return nir_pack_32_2x16_split(b, nir_channel(b, src, 0),
-                                    nir_channel(b, src, 1));
-}
-
-static nir_ssa_def *
-lower_unpack_32_to_16(nir_builder *b, nir_ssa_def *src)
-{
-   return nir_vec2(b, nir_unpack_32_2x16_split_x(b, src),
-                      nir_unpack_32_2x16_split_y(b, src));
-}
-
-static nir_ssa_def *
-lower_pack_64_from_16(nir_builder *b, nir_ssa_def *src)
-{
-   nir_ssa_def *xy = nir_pack_32_2x16_split(b, nir_channel(b, src, 0),
-                                               nir_channel(b, src, 1));
-
-   nir_ssa_def *zw = nir_pack_32_2x16_split(b, nir_channel(b, src, 2),
-                                               nir_channel(b, src, 3));
-
-   return nir_pack_64_2x32_split(b, xy, zw);
-}
-
-static nir_ssa_def *
-lower_unpack_64_to_16(nir_builder *b, nir_ssa_def *src)
-{
-   nir_ssa_def *xy = nir_unpack_64_2x32_split_x(b, src);
-   nir_ssa_def *zw = nir_unpack_64_2x32_split_y(b, src);
-
-   return nir_vec4(b, nir_unpack_32_2x16_split_x(b, xy),
-                      nir_unpack_32_2x16_split_y(b, xy),
-                      nir_unpack_32_2x16_split_x(b, zw),
-                      nir_unpack_32_2x16_split_y(b, zw));
-}
-
-static bool
-lower_64bit_pack_impl(nir_function_impl *impl)
-{
-   nir_builder b;
-   nir_builder_init(&b, impl);
-   bool progress = false;
-
-   nir_foreach_block(block, impl) {
-      nir_foreach_instr_safe(instr, block) {
-         if (instr->type != nir_instr_type_alu)
-            continue;
-
-         nir_alu_instr *alu_instr = (nir_alu_instr *) instr;
-
-         if (alu_instr->op != nir_op_pack_64_2x32 &&
-             alu_instr->op != nir_op_unpack_64_2x32 &&
-             alu_instr->op != nir_op_pack_64_4x16 &&
-             alu_instr->op != nir_op_unpack_64_4x16 &&
-             alu_instr->op != nir_op_pack_32_2x16 &&
-             alu_instr->op != nir_op_unpack_32_2x16)
-            continue;
-
-         b.cursor = nir_before_instr(&alu_instr->instr);
-
-         nir_ssa_def *src = nir_ssa_for_alu_src(&b, alu_instr, 0);
-         nir_ssa_def *dest;
-
-         switch (alu_instr->op) {
-         case nir_op_pack_64_2x32:
-            dest = lower_pack_64_from_32(&b, src);
-            break;
-         case nir_op_unpack_64_2x32:
-            dest = lower_unpack_64_to_32(&b, src);
-            break;
-         case nir_op_pack_64_4x16:
-            dest = lower_pack_64_from_16(&b, src);
-            break;
-         case nir_op_unpack_64_4x16:
-            dest = lower_unpack_64_to_16(&b, src);
-            break;
-         case nir_op_pack_32_2x16:
-            dest = lower_pack_32_from_16(&b, src);
-            break;
-         case nir_op_unpack_32_2x16:
-            dest = lower_unpack_32_to_16(&b, src);
-            break;
-         default:
-            unreachable("Impossible opcode");
-         }
-
-         nir_ssa_def_rewrite_uses(&alu_instr->dest.dest.ssa, nir_src_for_ssa(dest));
-         nir_instr_remove(&alu_instr->instr);
-         nir_metadata_preserve(impl, nir_metadata_block_index |
-                                     nir_metadata_dominance);
-         progress = true;
-      }
-   }
-
-   return progress;
-}
-
-bool
-nir_lower_64bit_pack(nir_shader *shader)
-{
-   bool progress = false;
-
-   nir_foreach_function(function, shader) {
-      if (function->impl)
-         progress |= lower_64bit_pack_impl(function->impl);
-   }
-
-   return false;
-}
diff --git a/src/compiler/nir/nir_lower_packing.c b/src/compiler/nir/nir_lower_packing.c
new file mode 100644 (file)
index 0000000..ba9f4bc
--- /dev/null
@@ -0,0 +1,161 @@
+/*
+ * Copyright © 2015 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#include "nir.h"
+#include "nir_builder.h"
+
+/*
+ * lowers:
+ *
+ * packDouble2x32(foo) -> packDouble2x32Split(foo.x, foo.y)
+ * unpackDouble2x32(foo) -> vec2(unpackDouble2x32_x(foo), unpackDouble2x32_y(foo))
+ * packInt2x32(foo) -> packInt2x32Split(foo.x, foo.y)
+ * unpackInt2x32(foo) -> vec2(unpackInt2x32_x(foo), unpackInt2x32_y(foo))
+ */
+
+static nir_ssa_def *
+lower_pack_64_from_32(nir_builder *b, nir_ssa_def *src)
+{
+   return nir_pack_64_2x32_split(b, nir_channel(b, src, 0),
+                                    nir_channel(b, src, 1));
+}
+
+static nir_ssa_def *
+lower_unpack_64_to_32(nir_builder *b, nir_ssa_def *src)
+{
+   return nir_vec2(b, nir_unpack_64_2x32_split_x(b, src),
+                      nir_unpack_64_2x32_split_y(b, src));
+}
+
+static nir_ssa_def *
+lower_pack_32_from_16(nir_builder *b, nir_ssa_def *src)
+{
+   return nir_pack_32_2x16_split(b, nir_channel(b, src, 0),
+                                    nir_channel(b, src, 1));
+}
+
+static nir_ssa_def *
+lower_unpack_32_to_16(nir_builder *b, nir_ssa_def *src)
+{
+   return nir_vec2(b, nir_unpack_32_2x16_split_x(b, src),
+                      nir_unpack_32_2x16_split_y(b, src));
+}
+
+static nir_ssa_def *
+lower_pack_64_from_16(nir_builder *b, nir_ssa_def *src)
+{
+   nir_ssa_def *xy = nir_pack_32_2x16_split(b, nir_channel(b, src, 0),
+                                               nir_channel(b, src, 1));
+
+   nir_ssa_def *zw = nir_pack_32_2x16_split(b, nir_channel(b, src, 2),
+                                               nir_channel(b, src, 3));
+
+   return nir_pack_64_2x32_split(b, xy, zw);
+}
+
+static nir_ssa_def *
+lower_unpack_64_to_16(nir_builder *b, nir_ssa_def *src)
+{
+   nir_ssa_def *xy = nir_unpack_64_2x32_split_x(b, src);
+   nir_ssa_def *zw = nir_unpack_64_2x32_split_y(b, src);
+
+   return nir_vec4(b, nir_unpack_32_2x16_split_x(b, xy),
+                      nir_unpack_32_2x16_split_y(b, xy),
+                      nir_unpack_32_2x16_split_x(b, zw),
+                      nir_unpack_32_2x16_split_y(b, zw));
+}
+
+static bool
+lower_pack_impl(nir_function_impl *impl)
+{
+   nir_builder b;
+   nir_builder_init(&b, impl);
+   bool progress = false;
+
+   nir_foreach_block(block, impl) {
+      nir_foreach_instr_safe(instr, block) {
+         if (instr->type != nir_instr_type_alu)
+            continue;
+
+         nir_alu_instr *alu_instr = (nir_alu_instr *) instr;
+
+         if (alu_instr->op != nir_op_pack_64_2x32 &&
+             alu_instr->op != nir_op_unpack_64_2x32 &&
+             alu_instr->op != nir_op_pack_64_4x16 &&
+             alu_instr->op != nir_op_unpack_64_4x16 &&
+             alu_instr->op != nir_op_pack_32_2x16 &&
+             alu_instr->op != nir_op_unpack_32_2x16)
+            continue;
+
+         b.cursor = nir_before_instr(&alu_instr->instr);
+
+         nir_ssa_def *src = nir_ssa_for_alu_src(&b, alu_instr, 0);
+         nir_ssa_def *dest;
+
+         switch (alu_instr->op) {
+         case nir_op_pack_64_2x32:
+            dest = lower_pack_64_from_32(&b, src);
+            break;
+         case nir_op_unpack_64_2x32:
+            dest = lower_unpack_64_to_32(&b, src);
+            break;
+         case nir_op_pack_64_4x16:
+            dest = lower_pack_64_from_16(&b, src);
+            break;
+         case nir_op_unpack_64_4x16:
+            dest = lower_unpack_64_to_16(&b, src);
+            break;
+         case nir_op_pack_32_2x16:
+            dest = lower_pack_32_from_16(&b, src);
+            break;
+         case nir_op_unpack_32_2x16:
+            dest = lower_unpack_32_to_16(&b, src);
+            break;
+         default:
+            unreachable("Impossible opcode");
+         }
+
+         nir_ssa_def_rewrite_uses(&alu_instr->dest.dest.ssa, nir_src_for_ssa(dest));
+         nir_instr_remove(&alu_instr->instr);
+         nir_metadata_preserve(impl, nir_metadata_block_index |
+                                     nir_metadata_dominance);
+         progress = true;
+      }
+   }
+
+   return progress;
+}
+
+bool
+nir_lower_pack(nir_shader *shader)
+{
+   bool progress = false;
+
+   nir_foreach_function(function, shader) {
+      if (function->impl)
+         progress |= lower_pack_impl(function->impl);
+   }
+
+   return false;
+}
index 97d28db88e1437944f18aa4ac85bc9a79a4feb8f..dfeea73b06ac3a0d33343aff6bafaa20a30d25a8 100644 (file)
@@ -586,7 +586,7 @@ brw_nir_optimize(nir_shader *nir, const struct brw_compiler *compiler,
                              nir_lower_dfract |
                              nir_lower_dround_even |
                              nir_lower_dmod);
-      OPT(nir_lower_64bit_pack);
+      OPT(nir_lower_pack);
    } while (progress);
 
    return nir;
index 8d80c8cae228b4ff8fc2e1a74ac038733c895027..3b261cf1b2cea9dae61fc0414758f93621228294 100644 (file)
@@ -325,7 +325,7 @@ st_nir_opts(nir_shader *nir)
       NIR_PASS_V(nir, nir_lower_alu_to_scalar);
       NIR_PASS_V(nir, nir_lower_phis_to_scalar);
 
-      NIR_PASS_V(nir, nir_lower_64bit_pack);
+      NIR_PASS_V(nir, nir_lower_pack);
       NIR_PASS(progress, nir, nir_copy_prop);
       NIR_PASS(progress, nir, nir_opt_remove_phis);
       NIR_PASS(progress, nir, nir_opt_dce);