From: Iago Toral Quiroga Date: Fri, 27 Apr 2018 07:28:48 +0000 (+0200) Subject: compiler/lower_64bit_packing: rename the pass to be more generic X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2d648e5ba38d8924c8dcd99d18ab2480d7903c0e;p=mesa.git compiler/lower_64bit_packing: rename the pass to be more generic It can do 32-bit packing too now. Reviewed-by: Jason Ekstrand --- diff --git a/src/amd/vulkan/radv_shader.c b/src/amd/vulkan/radv_shader.c index 014ed78c228..27b3fbed16d 100644 --- a/src/amd/vulkan/radv_shader.c +++ b/src/amd/vulkan/radv_shader.c @@ -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); diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources index a219ed9f794..80a61e507b2 100644 --- a/src/compiler/Makefile.sources +++ b/src/compiler/Makefile.sources @@ -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 \ diff --git a/src/compiler/nir/meson.build b/src/compiler/nir/meson.build index 57bf90c58b1..f5a4affc893 100644 --- a/src/compiler/nir/meson.build +++ b/src/compiler/nir/meson.build @@ -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', diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h index a538d6981cc..a379928cdcd 100644 --- a/src/compiler/nir/nir.h +++ b/src/compiler/nir/nir.h @@ -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 index dd435490e3d..00000000000 --- a/src/compiler/nir/nir_lower_64bit_packing.c +++ /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 index 00000000000..ba9f4bc040a --- /dev/null +++ b/src/compiler/nir/nir_lower_packing.c @@ -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; +} diff --git a/src/intel/compiler/brw_nir.c b/src/intel/compiler/brw_nir.c index 97d28db88e1..dfeea73b06a 100644 --- a/src/intel/compiler/brw_nir.c +++ b/src/intel/compiler/brw_nir.c @@ -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; diff --git a/src/mesa/state_tracker/st_glsl_to_nir.cpp b/src/mesa/state_tracker/st_glsl_to_nir.cpp index 8d80c8cae22..3b261cf1b2c 100644 --- a/src/mesa/state_tracker/st_glsl_to_nir.cpp +++ b/src/mesa/state_tracker/st_glsl_to_nir.cpp @@ -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);