On 01/04/16 21:30, Jason Ekstrand wrote: > On Thu, Mar 31, 2016 at 3:00 AM, Samuel Iglesias Gonsálvez < > sigles...@igalia.com> wrote: > >> From: Connor Abbott <connor.w.abb...@intel.com> >> >> v2: Undo unintended change to the signature of >> nir_normalize_cubemap_coords (Iago). >> >> v3: Move to compiler/nir (Iago) >> >> v4: Remove Authors from copyright header (Michael Schellenberger) >> >> Signed-off-by: Iago Toral Quiroga <ito...@igalia.com> >> --- >> src/compiler/Makefile.sources | 1 + >> src/compiler/glsl/Makefile.sources | 1 + >> src/compiler/nir/Makefile.sources | 1 + >> src/compiler/nir/nir.h | 2 + >> src/compiler/nir/nir_lower_double_packing.c | 106 >> ++++++++++++++++++++++++++++ >> 5 files changed, 111 insertions(+) >> create mode 100644 src/compiler/nir/nir_lower_double_packing.c >> >> diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources >> index 0aee200..adb7caa 100644 >> --- a/src/compiler/Makefile.sources >> +++ b/src/compiler/Makefile.sources >> @@ -186,6 +186,7 @@ NIR_FILES = \ >> nir/nir_lower_alu_to_scalar.c \ >> nir/nir_lower_atomics.c \ >> nir/nir_lower_clip.c \ >> + nir/nir_lower_double_packing.c \ >> nir/nir_lower_global_vars_to_local.c \ >> nir/nir_lower_gs_intrinsics.c \ >> nir/nir_lower_load_const_to_scalar.c \ >> diff --git a/src/compiler/glsl/Makefile.sources >> b/src/compiler/glsl/Makefile.sources >> index 538196a..fadfab8 100644 >> --- a/src/compiler/glsl/Makefile.sources >> +++ b/src/compiler/glsl/Makefile.sources >> @@ -38,6 +38,7 @@ NIR_FILES = \ >> nir/nir_lower_alu_to_scalar.c \ >> nir/nir_lower_atomics.c \ >> nir/nir_lower_clip.c \ >> + nir/nir_lower_double_packing.c \ >> nir/nir_lower_global_vars_to_local.c \ >> nir/nir_lower_gs_intrinsics.c \ >> nir/nir_lower_load_const_to_scalar.c \ >> diff --git a/src/compiler/nir/Makefile.sources >> b/src/compiler/nir/Makefile.sources >> index 3474302..488040d 100644 >> --- a/src/compiler/nir/Makefile.sources >> +++ b/src/compiler/nir/Makefile.sources >> @@ -29,6 +29,7 @@ NIR_FILES = \ >> nir_lower_alu_to_scalar.c \ >> nir_lower_atomics.c \ >> nir_lower_clip.c \ >> + nir_lower_double_packing.c \ >> nir_lower_global_vars_to_local.c \ >> nir_lower_gs_intrinsics.c \ >> nir_lower_load_const_to_scalar.c \ >> diff --git a/src/compiler/nir/nir.h b/src/compiler/nir/nir.h >> index ac709d5..4c9c16a 100644 >> --- a/src/compiler/nir/nir.h >> +++ b/src/compiler/nir/nir.h >> @@ -2278,6 +2278,8 @@ void nir_lower_to_source_mods(nir_shader *shader); >> >> bool nir_lower_gs_intrinsics(nir_shader *shader); >> >> +void nir_lower_double_pack(nir_shader *shader); >> + >> bool nir_normalize_cubemap_coords(nir_shader *shader); >> >> void nir_live_ssa_defs_impl(nir_function_impl *impl); >> diff --git a/src/compiler/nir/nir_lower_double_packing.c >> b/src/compiler/nir/nir_lower_double_packing.c >> new file mode 100644 >> index 0000000..7d8a4de >> --- /dev/null >> +++ b/src/compiler/nir/nir_lower_double_packing.c >> @@ -0,0 +1,106 @@ >> +/* >> + * 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)) >> + */ >> + >> +static nir_ssa_def * >> +component(nir_builder *b, nir_ssa_def *src, unsigned component) >> +{ >> + return nir_swizzle(b, src, (unsigned[]) {component}, 1, true); >> +} >> > > This already exists in nir_builder. It's called nir_channel >
OK > >> + >> +static nir_ssa_def * >> +lower_pack_double(nir_builder *b, nir_ssa_def *src) >> +{ >> + return nir_pack_double_2x32_split(b, component(b, src, 0), >> + component(b, src, 1)); >> +} >> + >> +static nir_ssa_def * >> +lower_unpack_double(nir_builder *b, nir_ssa_def *src) >> +{ >> + return nir_vec2(b, nir_unpack_double_2x32_split_x(b, src), >> + nir_unpack_double_2x32_split_y(b, src)); >> +} >> + >> +static void >> +lower_double_pack_instr(nir_alu_instr *instr) >> +{ >> + if (instr->op != nir_op_pack_double_2x32 && >> + instr->op != nir_op_unpack_double_2x32) >> + return; >> + >> + nir_builder b; >> + nir_builder_init(&b, >> nir_cf_node_get_function(&instr->instr.block->cf_node)); >> + b.cursor = nir_before_instr(&instr->instr); >> + >> + nir_ssa_def *src = nir_fmov_alu(&b, instr->src[0], >> + >> nir_op_infos[instr->op].input_sizes[0]); >> > > nir_ssa_for_src in nir_builder does this. > Actually nir_ssa_for_alu_src. I will change it. > >> + nir_ssa_def *dest = >> + instr->op == nir_op_pack_double_2x32 ? >> + lower_pack_double(&b, src) : >> + lower_unpack_double(&b, src); >> + >> + nir_ssa_def_rewrite_uses(&instr->dest.dest.ssa, nir_src_for_ssa(dest)); >> + nir_instr_remove(&instr->instr); >> +} >> + >> +static bool >> +lower_double_pack_block(nir_block *block, void *ctx) >> +{ >> + (void) ctx; >> + >> + nir_foreach_instr_safe(block, instr) { >> + if (instr->type != nir_instr_type_alu) >> + continue; >> + >> + lower_double_pack_instr(nir_instr_as_alu(instr)); >> > > Personally, I'd just inline this. The helper isn't really doing anything. > > If you did, you could init the builder at the top or, for that matter, init > it in lower_pack_impl and pass it in. Does't much matter in the end. > OK Thanks! Sam > >> + } >> + >> + return true; >> +} >> + >> +static void >> +lower_double_pack_impl(nir_function_impl *impl) >> +{ >> + nir_foreach_block(impl, lower_double_pack_block, NULL); >> +} >> + >> +void >> +nir_lower_double_pack(nir_shader *shader) >> +{ >> + nir_foreach_function(shader, function) { >> + if (function->impl) >> + lower_double_pack_impl(function->impl); >> + } >> +} >> + >> -- >> 2.5.0 >> >> _______________________________________________ >> mesa-dev mailing list >> mesa-dev@lists.freedesktop.org >> https://lists.freedesktop.org/mailman/listinfo/mesa-dev >> > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev