gallium: Fix computation of Z values when not using early Z.
authorBrian <brian.paul@tungstengraphics.com>
Fri, 28 Mar 2008 21:22:34 +0000 (15:22 -0600)
committerBrian <brian.paul@tungstengraphics.com>
Fri, 28 Mar 2008 21:22:34 +0000 (15:22 -0600)
This fixes the missing bitmaps in the engine and fogcoord demos.

src/gallium/drivers/softpipe/sp_quad_fs.c

index c10ad80e015162774f128068dad6a59dece40f32..a73df31383f44c33f336ffe19d28cbb03b53bff0 100644 (file)
@@ -113,15 +113,18 @@ shade_quad(
       }
    }
    else {
-      /* copy input Z (which was interpolated by the executor) to output Z */
-      uint i;
-      for (i = 0; i < 4; i++) {
-         quad->outputs.depth[i] = machine->Inputs[0].xyzw[2].f[i];
-         /* XXX not sure the above line is always correct.  The following
-          * might be better:
-         quad->outputs.depth[i] = machine->QuadPos.xyzw[2].f[i];
-          */
-      }
+      /* compute Z values now, as in the quad earlyz stage */
+      /* XXX we should really only do this if the earlyz stage is not used */
+      const float fx = (float) quad->x0;
+      const float fy = (float) quad->y0;
+      const float dzdx = quad->posCoef->dadx[2];
+      const float dzdy = quad->posCoef->dady[2];
+      const float z0 = quad->posCoef->a0[2] + dzdx * fx + dzdy * fy;
+
+      quad->outputs.depth[0] = z0;
+      quad->outputs.depth[1] = z0 + dzdx;
+      quad->outputs.depth[2] = z0 + dzdy;
+      quad->outputs.depth[3] = z0 + dzdx + dzdy;
    }
 
    /* shader may cull fragments */