mesa/st: avoid quadstrips if its easy to do so
authorKeith Whitwell <keithw@vmware.com>
Tue, 1 Dec 2009 16:31:21 +0000 (16:31 +0000)
committerKeith Whitwell <keithw@vmware.com>
Tue, 1 Dec 2009 16:33:59 +0000 (16:33 +0000)
Tristrips are easier for many drivers to handle.

src/mesa/state_tracker/st_draw.c

index ec9c859fcbc8b448a6acaeb200c93fd4457abaf8..47330d8efd7105b3c92c5146985c3bb2acaca46e 100644 (file)
@@ -528,6 +528,20 @@ check_uniforms(GLcontext *ctx)
 }
 
 
+static unsigned translate_prim( GLcontext *ctx,
+                                unsigned prim )
+{
+   /* Avoid quadstrips if it's easy to do so:
+    */
+   if (prim == GL_QUAD_STRIP &&
+       ctx->Light.ShadeModel != GL_FLAT &&
+       ctx->Polygon.FrontMode == GL_FILL &&
+       ctx->Polygon.BackMode == GL_FILL)
+      prim = GL_TRIANGLE_STRIP;
+
+   return prim;
+}
+
 /**
  * This function gets plugged into the VBO module and is called when
  * we have something to render.
@@ -624,6 +638,7 @@ st_draw_vbo(GLcontext *ctx,
       struct gl_buffer_object *bufobj = ib->obj;
       struct pipe_buffer *indexBuf = NULL;
       unsigned indexSize, indexOffset, i;
+      unsigned prim;
 
       switch (ib->type) {
       case GL_UNSIGNED_INT:
@@ -666,10 +681,12 @@ st_draw_vbo(GLcontext *ctx,
                          prims[i].start + indexOffset, prims[i].count,
                          arrays[VERT_ATTRIB_EDGEFLAG]);
 
+         prim = translate_prim( ctx, prims[i].mode );
+
          pipe->draw_range_elements(pipe, indexBuf, indexSize,
                                    min_index,
                                    max_index,
-                                   prims[i].mode,
+                                   prim,
                                    prims[i].start + indexOffset, prims[i].count);
       }
       else {
@@ -677,9 +694,11 @@ st_draw_vbo(GLcontext *ctx,
             setup_edgeflags(ctx, prims[i].mode,
                             prims[i].start + indexOffset, prims[i].count,
                             arrays[VERT_ATTRIB_EDGEFLAG]);
+
+            prim = translate_prim( ctx, prims[i].mode );
             
             pipe->draw_elements(pipe, indexBuf, indexSize,
-                                prims[i].mode,
+                                prim,
                                 prims[i].start + indexOffset, prims[i].count);
          }
       }
@@ -689,12 +708,16 @@ st_draw_vbo(GLcontext *ctx,
    else {
       /* non-indexed */
       GLuint i;
+      GLuint prim;
+
       for (i = 0; i < nr_prims; i++) {
          setup_edgeflags(ctx, prims[i].mode,
                          prims[i].start, prims[i].count,
                          arrays[VERT_ATTRIB_EDGEFLAG]);
 
-         pipe->draw_arrays(pipe, prims[i].mode, prims[i].start, prims[i].count);
+         prim = translate_prim( ctx, prims[i].mode );
+
+         pipe->draw_arrays(pipe, prim, prims[i].start, prims[i].count);
       }
    }