Jason Ekstrand <ja...@jlekstrand.net> writes: > --- > src/mesa/drivers/dri/i965/Makefile.sources | 1 + > src/mesa/drivers/dri/i965/brw_nir.h | 2 + > .../drivers/dri/i965/brw_nir_cubemap_normalize.c | 111 > +++++++++++++++++++++ > 3 files changed, 114 insertions(+) > create mode 100644 src/mesa/drivers/dri/i965/brw_nir_cubemap_normalize.c
Could this go in src/glsl/nir? vc4 also lowers cubemaps the same way, so I might want to use it. (Probably won't immediately, due to the same "do I really want to make my rcp that accurate for this operation? probably not." concern as for txp). > diff --git a/src/mesa/drivers/dri/i965/brw_nir_cubemap_normalize.c > b/src/mesa/drivers/dri/i965/brw_nir_cubemap_normalize.c > new file mode 100644 > index 0000000..6464f41 > --- /dev/null > +++ b/src/mesa/drivers/dri/i965/brw_nir_cubemap_normalize.c > @@ -0,0 +1,111 @@ > +/* > + * 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. > + * > + * Authors: > + * Jason Ekstrand <ja...@jlekstrand.net> > + */ > + > +#include "brw_nir.h" > +#include "glsl/nir/nir_builder.h" > + > +/** > + * This file implements a NIR lowering pass to perform the normalization of > + * the cubemap coordinates to have the largest magnitude component be -1.0 > + * or 1.0. This is based on the old GLSL IR based pass by Eric. > + */ > + > +static nir_ssa_def * > +channel(nir_builder *b, nir_ssa_def *def, int c) > +{ > + return nir_swizzle(b, def, (unsigned[4]){c, c, c, c}, 1, false); > +} > + > +static bool > +cubemap_normalize_block(nir_block *block, void *void_state) > +{ > + nir_builder *b = void_state; > + > + nir_foreach_instr(block, instr) { > + if (instr->type != nir_instr_type_tex) > + continue; > + > + nir_tex_instr *tex = nir_instr_as_tex(instr); > + if (tex->sampler_dim != GLSL_SAMPLER_DIM_CUBE) > + continue; > + > + nir_builder_insert_before_instr(b, &tex->instr); > + > + for (unsigned i = 0; i < tex->num_srcs; i++) { > + if (tex->src[i].src_type != nir_tex_src_coord) > + continue; > + > + nir_ssa_def *orig_coord = > + nir_ssa_for_src(b, tex->src[i].src, nir_tex_instr_src_size(tex, > i)); > + assert(orig_coord->num_components >= 3); > + > + nir_ssa_def *abs0 = nir_fabs(b, channel(b, orig_coord, 0)); > + nir_ssa_def *abs1 = nir_fabs(b, channel(b, orig_coord, 1)); > + nir_ssa_def *abs2 = nir_fabs(b, channel(b, orig_coord, 2)); > + > + nir_ssa_def *norm1 = nir_fmax(b, abs0, nir_fmax(b, abs1, abs2)); This could just be: nir_ssa_def *abs = nir_fabs(b, orig_coord); nir_ssa_def *norm = nir_fmax(b, channel(b, abs, 0), nir_fmax(b, channel(b, abs, 1), channel(b, abs, 2))); right? Just in case vec4 NIR ends up being a thing. Other than these little comments, Reviewed-by: Eric Anholt <e...@anholt.net>
signature.asc
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev