mesa/st: avoid quadstrips if its easy to do so
Tristrips are easier for many drivers to handle.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user