From c9192fcbd28063f1273917d258456a5cd38dd119 Mon Sep 17 00:00:00 2001 From: Kenneth Graunke Date: Tue, 17 May 2016 03:30:58 -0700 Subject: [PATCH] nir: Add interp_var_at_offset flipping. The Y-offset needs flipping as well, similar to ddy. Signed-off-by: Kenneth Graunke Reviewed-by: Rob Clark --- src/compiler/nir/nir_lower_wpos_ytransform.c | 21 ++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/compiler/nir/nir_lower_wpos_ytransform.c b/src/compiler/nir/nir_lower_wpos_ytransform.c index 41f85544246..4dc9d950e06 100644 --- a/src/compiler/nir/nir_lower_wpos_ytransform.c +++ b/src/compiler/nir/nir_lower_wpos_ytransform.c @@ -257,6 +257,25 @@ lower_fddy(lower_wpos_ytransform_state *state, nir_alu_instr *fddy) fddy->src[0].swizzle[i] = MIN2(i, pt->num_components - 1); } +/* Multiply interp_var_at_offset's offset by transform.x to flip it. */ +static void +lower_interp_var_at_offset(lower_wpos_ytransform_state *state, + nir_intrinsic_instr *interp) +{ + nir_builder *b = &state->b; + nir_ssa_def *offset; + nir_ssa_def *flip_y; + + b->cursor = nir_before_instr(&interp->instr); + + offset = nir_ssa_for_src(b, interp->src[0], 2); + flip_y = nir_fmul(b, nir_channel(b, offset, 1), + nir_channel(b, get_transform(state), 0)); + nir_instr_rewrite_src(&interp->instr, &interp->src[0], + nir_src_for_ssa(nir_vec2(b, nir_channel(b, offset, 0), + flip_y))); +} + static bool lower_wpos_ytransform_block(lower_wpos_ytransform_state *state, nir_block *block) { @@ -272,6 +291,8 @@ lower_wpos_ytransform_block(lower_wpos_ytransform_state *state, nir_block *block assert(dvar->deref.child == NULL); lower_fragcoord(state, intr); } + } else if (intr->intrinsic == nir_intrinsic_interp_var_at_offset) { + lower_interp_var_at_offset(state, intr); } } else if (instr->type == nir_instr_type_alu) { nir_alu_instr *alu = nir_instr_as_alu(instr); -- 2.30.2