mesa/dlist: don't cache state which may not be replayed on CallList
authorKeith Whitwell <keithw@vmware.com>
Tue, 30 Jun 2009 16:10:56 +0000 (17:10 +0100)
committerKeith Whitwell <keithw@vmware.com>
Tue, 30 Jun 2009 16:10:56 +0000 (17:10 +0100)
Statechanges which occur before the first End in a display list may
not be replayed when the list is called, in particular if it is called
from within a begin/end pair.

Recognize vulnerable statechanges and do not use them to fill in the
state cache.

src/mesa/main/dlist.c

index 3e8b5a9424530c0eaef920a31ea947ed50a84936..2af0dd3c59721383ba5a35c208d36a92a1e1ae6a 100644 (file)
@@ -3203,7 +3203,11 @@ save_ShadeModel(GLenum mode)
       return;
 
    SAVE_FLUSH_VERTICES(ctx);
-   ctx->ListState.Current.ShadeModel = mode;
+
+   /* Only save the value if we know the statechange will take effect:
+    */
+   if (ctx->Driver.CurrentSavePrimitive == PRIM_OUTSIDE_BEGIN_END)
+      ctx->ListState.Current.ShadeModel = mode;
 
    n = ALLOC_INSTRUCTION(ctx, OPCODE_SHADE_MODEL, 1);
    if (n) {