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 > + > +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. > + 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. > + } > + > + 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