From: Younes M. <you...@gm...> - 2009-11-28 20:11:49
|
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); + } } } |