mesa: get another class of degenerate dlists working
authorKeith Whitwell <keith@tungstengraphics.com>
Mon, 15 Sep 2008 12:47:25 +0000 (13:47 +0100)
committerKeith Whitwell <keith@tungstengraphics.com>
Mon, 15 Sep 2008 12:49:04 +0000 (13:49 +0100)
Primitive begin in one dlist, end in another.

src/mesa/main/dlist.c
src/mesa/vbo/vbo_save_api.c

index 63a00e04f51c25434c1acfdd481b88bb93f6809a..9f6f4d96f485bc35b81265cf5e3b107398f77c36 100644 (file)
@@ -6788,6 +6788,11 @@ _mesa_EndList(void)
       _mesa_error(ctx, GL_INVALID_OPERATION, "glEndList");
       return;
    }
+   
+   /* Call before emitting END_OF_LIST, in case the driver wants to
+    * emit opcodes itself.
+    */
+   ctx->Driver.EndList(ctx);
 
    (void) ALLOC_INSTRUCTION(ctx, OPCODE_END_OF_LIST, 0);
 
@@ -6801,8 +6806,6 @@ _mesa_EndList(void)
    if (MESA_VERBOSE & VERBOSE_DISPLAY_LIST)
       mesa_print_display_list(ctx->ListState.CurrentListNum);
 
-   ctx->Driver.EndList(ctx);
-
    ctx->ListState.CurrentList = NULL;
    ctx->ListState.CurrentListNum = 0;
    ctx->ListState.CurrentListPtr = NULL;
index 88d573f1283873384bbbada8bd30debb63c2e8b6..f93ef3a02a0c4413889e31140491e0a4f9e6a1fa 100644 (file)
@@ -1045,6 +1045,30 @@ void vbo_save_NewList( GLcontext *ctx, GLuint list, GLenum mode )
 void vbo_save_EndList( GLcontext *ctx )
 {
    struct vbo_save_context *save = &vbo_context(ctx)->save;
+
+   /* EndList called inside a (saved) Begin/End pair?
+    */
+   if (ctx->Driver.CurrentSavePrimitive != PRIM_OUTSIDE_BEGIN_END) {
+      GLint i = save->prim_count - 1;
+
+      ctx->Driver.CurrentSavePrimitive = PRIM_OUTSIDE_BEGIN_END;
+      save->prim[i].end = 0;
+      save->prim[i].count = (save->vert_count - 
+                             save->prim[i].start);
+
+      /* Make sure this vertex list gets replayed by the "loopback"
+       * mechanism:
+       */
+      save->dangling_attr_ref = 1;
+      vbo_save_SaveFlushVertices( ctx );
+
+      /* Swap out this vertex format while outside begin/end.  Any color,
+       * etc. received between here and the next begin will be compiled
+       * as opcodes.
+       */   
+      _mesa_install_save_vtxfmt( ctx, &ctx->ListState.ListVtxfmt );
+   }
+
    unmap_vertex_store( ctx, save->vertex_store );
 
    assert(save->vertex_size == 0);