diff options
author | Kenneth Graunke <[email protected]> | 2016-05-17 03:30:58 -0700 |
---|---|---|
committer | Kenneth Graunke <[email protected]> | 2016-05-20 14:29:04 -0700 |
commit | c9192fcbd28063f1273917d258456a5cd38dd119 (patch) | |
tree | 15ba0dd4d07c85159b7e259c4dc4ee27e6c052ed /src/compiler/nir | |
parent | 287f099db170132518b75142de8580fd252fde45 (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.c | 21 |
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); |