summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIan Romanick <[email protected]>2010-12-01 11:57:33 -0800
committerIan Romanick <[email protected]>2010-12-01 12:01:13 -0800
commitc92550be64abd454560556599cd95b237f4375b1 (patch)
tree0680d3dfa2560a57bf0a08d824a06b10ebb981fc
parentb6dbc06742af4cbd86869243640c35aa7025766c (diff)
i915: Correctly generate unconditional KIL instructions
Fixes piglit test glsl-fs-discard-03. NOTE: This is a candidate for the 7.9 branch.
-rw-r--r--src/mesa/drivers/dri/i915/i915_fragprog.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/mesa/drivers/dri/i915/i915_fragprog.c b/src/mesa/drivers/dri/i915/i915_fragprog.c
index c00ee415b6b..7a9fb7f088b 100644
--- a/src/mesa/drivers/dri/i915/i915_fragprog.c
+++ b/src/mesa/drivers/dri/i915/i915_fragprog.c
@@ -569,10 +569,14 @@ upload_program(struct i915_fragment_program *p)
if (inst->DstReg.CondMask == COND_TR) {
tmp = i915_get_utemp(p);
+ /* The KIL instruction discards the fragment if any component of
+ * the source is < 0. Emit an immediate operand of {-1}.xywz.
+ */
i915_emit_texld(p, get_live_regs(p, inst),
tmp, A0_DEST_CHANNEL_ALL,
0, /* use a dummy dest reg */
- swizzle(tmp, ONE, ONE, ONE, ONE), /* always */
+ negate(swizzle(tmp, ONE, ONE, ONE, ONE),
+ 1, 1, 1, 1),
T0_TEXKILL);
} else {
p->error = 1;