Rob Clark <[email protected]> writes:

> From: Rob Clark <[email protected]>
>
> Signed-off-by: Rob Clark <[email protected]>
> ---

> +static bool
> +nir_lower_two_sided_color_block(nir_block *block, void *void_state)
> +{
> +   lower_2side_state *state = void_state;
> +   nir_builder *b = &state->b;
> +
> +   nir_foreach_instr_safe(block, instr) {
> +      if (instr->type != nir_instr_type_intrinsic)
> +         continue;
> +
> +      nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
> +
> +      if (intr->intrinsic != nir_intrinsic_load_input)
> +         continue;
> +
> +      int idx;
> +      for (idx = 0; idx < state->colors_count; idx++) {
> +         unsigned drvloc =
> +            state->colors[idx].front->data.driver_location;
> +         if (intr->const_index[0] == drvloc) {
> +            break;
> +         }
> +      }
> +
> +      if (idx == state->colors_count)
> +         continue;
> +
> +      /* replace load_input(COLn) with
> +       * bcsel(load_input(FACE), load_input(COLn), load_input(BFCn))
> +       */
> +      b->cursor = nir_before_instr(&intr->instr);
> +      nir_ssa_def *face  = load_input(b, state->face);
> +      nir_ssa_def *front = load_input(b, state->colors[idx].front);
> +      nir_ssa_def *back  = load_input(b, state->colors[idx].back);
> +      face = nir_swizzle(b, face, (unsigned[]){0,0,0,0}, 4, true);

nir_channel(b, face, 0)?

Other than that this looks like a fairly obvious implementation.

Reviewed-by: Eric Anholt <[email protected]>

> +      nir_ssa_def *cond  = nir_flt(b, face, nir_imm_float(b, 0.0));
> +      nir_ssa_def *color = nir_bcsel(b, cond, back, front);
> +
> +      assert(intr->dest.is_ssa);
> +      nir_ssa_def_rewrite_uses(&intr->dest.ssa, nir_src_for_ssa(color));
> +   }

Attachment: signature.asc
Description: PGP signature

_______________________________________________
mesa-dev mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to