mesa/st: avoid quadstrips if its easy to do so

Tristrips are easier for many drivers to handle.
This commit is contained in:
Keith Whitwell
2009-12-01 16:31:21 +00:00
parent bb1cde755b
commit 759c094bf8
+26 -3
View 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);
}
}