diff options
author | Keith Whitwell <[email protected]> | 2009-06-30 18:40:20 +0100 |
---|---|---|
committer | Keith Whitwell <[email protected]> | 2009-06-30 18:40:20 +0100 |
commit | 70ae7ba818e9d8a5485653b258e76f06c988654c (patch) | |
tree | c286ff4ccb7480b275eb94f4474490bfbd761f46 /src/mesa/main/dlist.c | |
parent | c48c01c9e7d6d0a43883b7b3333ad42208ea9d44 (diff) |
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.
Diffstat (limited to 'src/mesa/main/dlist.c')
-rw-r--r-- | src/mesa/main/dlist.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/src/mesa/main/dlist.c b/src/mesa/main/dlist.c index 2af0dd3c597..c5a1c1f38fc 100644 --- a/src/mesa/main/dlist.c +++ b/src/mesa/main/dlist.c @@ -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); |