softpipe: restore culling code
authorKeith Whitwell <keithw@vmware.com>
Fri, 14 May 2010 19:36:08 +0000 (20:36 +0100)
committerKeith Whitwell <keithw@vmware.com>
Fri, 14 May 2010 19:36:08 +0000 (20:36 +0100)
src/gallium/drivers/softpipe/sp_setup.c

index ca02d4df4895daf69001429cbddfb74141036c35..5d727dc00df0952ebdfe7ca1676aa28da45ff60b 100644 (file)
@@ -111,6 +111,7 @@ struct setup_context {
    uint numFragsWritten;  /**< per primitive */
 #endif
 
+   unsigned cull_face;         /* which faces cull */
    unsigned nr_vertex_attrs;
 };
 
@@ -374,6 +375,14 @@ setup_sort_vertices(struct setup_context *setup,
       ((det < 0.0) ^ 
        (setup->softpipe->rasterizer->front_ccw));
 
+   {
+      unsigned face = setup->facing == 0 ? PIPE_FACE_FRONT : PIPE_FACE_BACK;
+
+      if (face & setup->cull_face)
+        return FALSE;
+   }
+
+
    /* Prepare pixel offset for rasterisation:
     *  - pixel center (0.5, 0.5) for GL, or
     *  - assume (0.0, 0.0) for other APIs.
@@ -810,11 +819,9 @@ sp_setup_tri(struct setup_context *setup,
    setup->numFragsWritten = 0;
 #endif
 
-   /* Culling already done by draw module.
-    */
-
    if (!setup_sort_vertices( setup, det, v0, v1, v2 ))
       return;
+
    setup_tri_coefficients( setup );
    setup_tri_edges( setup );
 
@@ -1396,6 +1403,17 @@ sp_setup_prepare(struct setup_context *setup)
    setup->nr_vertex_attrs = draw_num_shader_outputs(sp->draw);
 
    sp->quad.first->begin( sp->quad.first );
+
+   if (sp->reduced_api_prim == PIPE_PRIM_TRIANGLES &&
+       sp->rasterizer->fill_front == PIPE_POLYGON_MODE_FILL &&
+       sp->rasterizer->fill_back == PIPE_POLYGON_MODE_FILL) {
+      /* we'll do culling */
+      setup->cull_face = sp->rasterizer->cull_face;
+   }
+   else {
+      /* 'draw' will do culling */
+      setup->cull_face = PIPE_FACE_NONE;
+   }
 }