[Mesa-dev] [PATCH 2/3] i965: Add a NIR-based cubemap normalizing pass

Jason Ekstrand jason at jlekstrand.net
Fri Apr 3 11:42:42 PDT 2015


On Fri, Apr 3, 2015 at 11:41 AM, Eric Anholt <eric at anholt.net> wrote:
> Jason Ekstrand <jason at 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 <jason at 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.

D'oh!  Yeah, I'll change that.

> Other than these little comments,
>
> Reviewed-by: Eric Anholt <eric at anholt.net>

Thanks.
--Jason


More information about the mesa-dev mailing list