softpipe: add depth-lequal z16 path
authorKeith Whitwell <keithw@vmware.com>
Thu, 30 Jul 2009 10:35:08 +0000 (11:35 +0100)
committerKeith Whitwell <keithw@vmware.com>
Thu, 30 Jul 2009 10:35:08 +0000 (11:35 +0100)
src/gallium/drivers/softpipe/sp_quad_depth_test.c

index 506867f4d07bd71019d1d03ba7d47d7369a21519..9cffea2c9e60ef3b7df8988a4b8ce2dcdc15ceb9 100644 (file)
@@ -780,6 +780,81 @@ depth_interp_z16_less_write(struct quad_stage *qs,
 }
 
 
+static void
+depth_interp_z16_lequal_write(struct quad_stage *qs, 
+                            struct quad_header *quads[],
+                            unsigned nr)
+{
+   unsigned i, pass = 0;
+   const unsigned ix = quads[0]->input.x0;
+   const unsigned iy = quads[0]->input.y0;
+   const float fx = (float) ix;
+   const float fy = (float) iy;
+   const float dzdx = quads[0]->posCoef->dadx[2];
+   const float dzdy = quads[0]->posCoef->dady[2];
+   const float z0 = quads[0]->posCoef->a0[2] + dzdx * fx + dzdy * fy;
+   struct softpipe_cached_tile *tile;
+   ushort (*depth16)[TILE_SIZE];
+   ushort idepth[4], depth_step;
+   const float scale = 65535.0;
+
+   idepth[0] = (ushort)((z0) * scale);
+   idepth[1] = (ushort)((z0 + dzdx) * scale);
+   idepth[2] = (ushort)((z0 + dzdy) * scale);
+   idepth[3] = (ushort)((z0 + dzdx + dzdy) * scale);
+
+   depth_step = (ushort)(dzdx * 2 * scale);
+
+   tile = sp_get_cached_tile(qs->softpipe->zsbuf_cache, ix, iy);
+
+   depth16 = (ushort (*)[TILE_SIZE])
+      &tile->data.depth16[iy % TILE_SIZE][ix % TILE_SIZE];
+
+   for (i = 0; i < nr; i++) {
+      unsigned outmask = quads[i]->inout.mask;
+      unsigned mask = 0;
+      
+      if ((outmask & 1) && idepth[0] <= depth16[0][0]) {
+         depth16[0][0] = idepth[0];
+         mask |= (1 << 0);
+      }
+
+      if ((outmask & 2) && idepth[1] <= depth16[0][1]) {
+         depth16[0][1] = idepth[1];
+         mask |= (1 << 1);
+      }
+
+      if ((outmask & 4) && idepth[2] <= depth16[1][0]) {
+         depth16[1][0] = idepth[2];
+         mask |= (1 << 2);
+      }
+
+      if ((outmask & 8) && idepth[3] <= depth16[1][1]) {
+         depth16[1][1] = idepth[3];
+         mask |= (1 << 3);
+      }
+
+      idepth[0] += depth_step;
+      idepth[1] += depth_step;
+      idepth[2] += depth_step;
+      idepth[3] += depth_step;
+
+      depth16 = (ushort (*)[TILE_SIZE]) &depth16[0][2];
+
+      quads[i]->inout.mask = mask;
+      if (quads[i]->inout.mask)
+         quads[pass++] = quads[i];
+   }
+
+   if (pass)
+      qs->next->run(qs->next, quads, pass);
+
+}
+
+
+
+
+
 static void
 depth_noop(struct quad_stage *qs, 
            struct quad_header *quads[],
@@ -809,8 +884,6 @@ choose_depth_test(struct quad_stage *qs,
    boolean depthwrite = qs->softpipe->depth_stencil->depth.writemask;
 
 
-   qs->run = depth_test_quads_fallback;
-
    if (!alpha &&
        !depth &&
        !stencil) {
@@ -819,18 +892,38 @@ choose_depth_test(struct quad_stage *qs,
    else if (!alpha && 
             interp_depth && 
             depth && 
-            depthfunc == PIPE_FUNC_LESS && 
             depthwrite && 
             !stencil) 
    {
-      switch (qs->softpipe->framebuffer.zsbuf->format) {
-      case PIPE_FORMAT_Z16_UNORM:
-         qs->run = depth_interp_z16_less_write;
+      switch (depthfunc) {
+      case PIPE_FUNC_LESS:
+         switch (qs->softpipe->framebuffer.zsbuf->format) {
+         case PIPE_FORMAT_Z16_UNORM:
+            qs->run = depth_interp_z16_less_write;
+            break;
+         default:
+            qs->run = depth_test_quads_fallback;
+            break;
+         }
          break;
-      default:
+      case PIPE_FUNC_LEQUAL:
+         switch (qs->softpipe->framebuffer.zsbuf->format) {
+         case PIPE_FORMAT_Z16_UNORM:
+            qs->run = depth_interp_z16_lequal_write;
+            break;
+         default:
+            qs->run = depth_test_quads_fallback;
+            break;
+         }
          break;
+      default:
+         qs->run = depth_test_quads_fallback;
       }
    }
+   else {
+      qs->run = depth_test_quads_fallback;
+   }
+
 
    qs->run( qs, quads, nr );
 }