mesa/dlist: fixes and improvements for material caching

Only short-circuit material call if *all* statechanges from this call
are cached.  Some material calls (eg with FRONT_AND_BACK) change more
than one piece of state -- need to check all of them before returning.

Also, Material calls are legal inside begin/end pairs, so don't need
to be as careful about begin/end state as with regular statechanges
(like ShadeModel) when caching.  Take advantage of this and do better
caching.
This commit is contained in:
Keith Whitwell 2009-06-30 18:40:20 +01:00
parent c48c01c9e7
commit 70ae7ba818
1 changed files with 16 additions and 8 deletions

View File

@ -5225,20 +5225,28 @@ save_Materialfv(GLenum face, GLenum pname, const GLfloat * param)
bitmask = _mesa_material_bitmask(ctx, face, pname, ~0, NULL);
/* Try to eliminate redundant statechanges
/* Try to eliminate redundant statechanges. Because it is legal to
* call glMaterial even inside begin/end calls, don't need to worry
* about ctx->Driver.CurrentSavePrimitive here.
*/
for (i = 0; i < MAT_ATTRIB_MAX; i++) {
if (bitmask & (1 << i)) {
if (ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END &&
ctx->ListState.ActiveMaterialSize[i] == args &&
compare4fv(ctx->ListState.CurrentMaterial[i], param, args))
return;
ctx->ListState.ActiveMaterialSize[i] = args;
COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param);
if (ctx->ListState.ActiveMaterialSize[i] == args &&
compare4fv(ctx->ListState.CurrentMaterial[i], param, args)) {
bitmask &= ~(1 << i);
}
else {
ctx->ListState.ActiveMaterialSize[i] = args;
COPY_SZ_4V(ctx->ListState.CurrentMaterial[i], args, param);
}
}
}
/* If this call has effect, return early:
*/
if (bitmask == 0)
return;
SAVE_FLUSH_VERTICES(ctx);
n = ALLOC_INSTRUCTION(ctx, OPCODE_MATERIAL, 6);