softpipe: fix Z interpolation invariance bug
authorBrian Paul <brianp@vmware.com>
Tue, 4 Oct 2011 21:01:05 +0000 (15:01 -0600)
committerBrian Paul <brianp@vmware.com>
Tue, 4 Oct 2011 21:04:42 +0000 (15:04 -0600)
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.

src/gallium/drivers/softpipe/sp_quad_fs.c

index d74d6d4914e90210874fe54cfc408e17be6bcb8b..7b08cd0cf30232279e29a83b15d7db6aff5f8023 100644 (file)
@@ -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)