Is there anything in the spec or mesa internals that say this isn't allowed? I was trying to fix what seems like an unrelated HW errata with no luck, but it might as well be used if it's useful. I'll apply if no one raises any concerns.
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c index c76bff9..794b426 100644 --- a/src/mesa/state_tracker/st_draw.c +++ b/src/mesa/state_tracker/st_draw.c @@ -672,14 +672,36 @@ st_draw_vbo(GLcontext *ctx, prims[i].start + indexOffset, prims[i].count); } else { - for (i = 0; i < nr_prims; i++) { - setup_edgeflags(ctx, prims[i].mode, - prims[i].start + indexOffset, prims[i].count, - arrays[VERT_ATTRIB_EDGEFLAG]); - - pipe->draw_elements(pipe, indexBuf, indexSize, - prims[i].mode, - prims[i].start + indexOffset, prims[i].count); + if (ctx->Polygon.FrontMode == GL_FILL && + ctx->Polygon.BackMode == GL_FILL) { + /* Coalesce runs of prims into a single draw call */ + for (i = 0; i < nr_prims; i++) { + GLuint firstPrimMode = prims[i].mode; + GLuint firstPrimStart = prims[i].start; + GLuint totalCount = prims[i].count; + if (firstPrimMode != GL_TRIANGLE_STRIP && firstPrimMode != GL_TRIANGLE_FAN) + while (i + 1 < nr_prims && prims[i + 1].mode == firstPrimMode && + prims[i + 1].start == prims[i].start + prims[i].count) { + totalCount += prims[i + 1].count; + i++; + } + + pipe->draw_elements(pipe, indexBuf, indexSize, + firstPrimMode, + firstPrimStart + indexOffset, totalCount); + } + } + else + { + for (i = 0; i < nr_prims; i++) { + setup_edgeflags(ctx, prims[i].mode, + prims[i].start + indexOffset, prims[i].count, + arrays[VERT_ATTRIB_EDGEFLAG]); + + pipe->draw_elements(pipe, indexBuf, indexSize, + prims[i].mode, + prims[i].start + indexOffset, prims[i].count); + } } } @@ -688,12 +710,32 @@ st_draw_vbo(GLcontext *ctx, else { /* non-indexed */ GLuint i; - for (i = 0; i < nr_prims; i++) { - setup_edgeflags(ctx, prims[i].mode, - prims[i].start, prims[i].count, - arrays[VERT_ATTRIB_EDGEFLAG]); + if (ctx->Polygon.FrontMode == GL_FILL && + ctx->Polygon.BackMode == GL_FILL) { + /* Coalesce runs of prims into a single draw call */ + for (i = 0; i < nr_prims; i++) { + GLuint firstPrimMode = prims[i].mode; + GLuint firstPrimStart = prims[i].start; + GLuint totalCount = prims[i].count; + if (firstPrimMode != GL_TRIANGLE_STRIP && firstPrimMode != GL_TRIANGLE_FAN) + while (i + 1 < nr_prims && prims[i + 1].mode == firstPrimMode && + prims[i + 1].start == prims[i].start + prims[i].count) { + totalCount += prims[i + 1].count; + i++; + } + + pipe->draw_arrays(pipe, firstPrimMode, firstPrimStart, totalCount); + } + } + else + { + 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); + pipe->draw_arrays(pipe, prims[i].mode, prims[i].start, prims[i].count); + } } } ------------------------------------------------------------------------------ Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day trial. Simplify your report design, integration and deployment - and focus on what you do best, core application coding. Discover what's new with Crystal Reports now. http://p.sf.net/sfu/bobj-july _______________________________________________ Mesa3d-dev mailing list Mesa3d-dev@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mesa3d-dev