aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2011-10-04 15:01:05 -0600
committerBrian Paul <[email protected]>2011-10-04 15:04:42 -0600
commita5f2010735b6af469f57c6c254af9603bb9db18d (patch)
tree992590340d7259df0238ee9819662ff9762330e8 /src/gallium/drivers
parent334a9dd3e60e9c7b8ba7bcceb2c88c2645e6220b (diff)
softpipe: fix Z interpolation invariance bug
We want quad/pixel Z values to be interpolated exactly the same for multi-pass algorithms. Because of how the optimized Z-test code is written, we can't cull the first quad in a run even if it's totally killed. See the comment for more info. NOTE: This is a candidate for the 7.11 branch.
Diffstat (limited to 'src/gallium/drivers')
-rw-r--r--src/gallium/drivers/softpipe/sp_quad_fs.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/gallium/drivers/softpipe/sp_quad_fs.c b/src/gallium/drivers/softpipe/sp_quad_fs.c
index d74d6d4914e..7b08cd0cf30 100644
--- a/src/gallium/drivers/softpipe/sp_quad_fs.c
+++ b/src/gallium/drivers/softpipe/sp_quad_fs.c
@@ -118,7 +118,16 @@ shade_quads(struct quad_stage *qs,
machine->InterpCoefs = quads[0]->coef;
for (i = 0; i < nr; i++) {
- if (!shade_quad(qs, quads[i]))
+ /* Only omit this quad from the output list if all the fragments
+ * are killed _AND_ it's not the first quad in the list.
+ * The first quad is special in the (optimized) depth-testing code:
+ * the quads' Z coordinates are step-wise interpolated with respect
+ * to the first quad in the list.
+ * For multi-pass algorithms we need to produce exactly the same
+ * Z values in each pass. If interpolation starts with different quads
+ * we can get different Z values for the same (x,y).
+ */
+ if (!shade_quad(qs, quads[i]) && i > 0)
continue; /* quad totally culled/killed */
if (/*do_coverage*/ 0)