summaryrefslogtreecommitdiffstats
path: root/src/compiler/nir
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2016-05-17 03:30:58 -0700
committerKenneth Graunke <[email protected]>2016-05-20 14:29:04 -0700
commitc9192fcbd28063f1273917d258456a5cd38dd119 (patch)
tree15ba0dd4d07c85159b7e259c4dc4ee27e6c052ed /src/compiler/nir
parent287f099db170132518b75142de8580fd252fde45 (diff)
nir: Add interp_var_at_offset flipping.
The Y-offset needs flipping as well, similar to ddy. Signed-off-by: Kenneth Graunke <[email protected]> Reviewed-by: Rob Clark <[email protected]>
Diffstat (limited to 'src/compiler/nir')
-rw-r--r--src/compiler/nir/nir_lower_wpos_ytransform.c21
1 files changed, 21 insertions, 0 deletions
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);