summaryrefslogtreecommitdiffstats
path: root/src/mesa/main/dlist.c
diff options
context:
space:
mode:
authorKeith Whitwell <[email protected]>2009-06-30 18:40:20 +0100
committerKeith Whitwell <[email protected]>2009-06-30 18:40:20 +0100
commit70ae7ba818e9d8a5485653b258e76f06c988654c (patch)
treec286ff4ccb7480b275eb94f4474490bfbd761f46 /src/mesa/main/dlist.c
parentc48c01c9e7d6d0a43883b7b3333ad42208ea9d44 (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.c24
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);