mesa: Add BeginVertices driver call
authorKeith Whitwell <keithw@vmware.com>
Tue, 3 Mar 2009 10:41:57 +0000 (10:41 +0000)
committerKeith Whitwell <keithw@vmware.com>
Tue, 3 Mar 2009 10:41:57 +0000 (10:41 +0000)
Provides notification to the VBO modules prior to the first immediate call.
Pairs with FlushVertices()

src/mesa/main/dd.h
src/mesa/main/vtxfmt.c
src/mesa/vbo/vbo_exec.c
src/mesa/vbo/vbo_exec.h
src/mesa/vbo/vbo_exec_api.c

index 7fb0a211d7aa8c9483117e8e9f837c8cc8d91019..b1e006901bfc5e8c35a51142472b4414b9f6c001 100644 (file)
@@ -947,6 +947,12 @@ struct dd_function_table {
    GLuint NeedFlush;
    GLuint SaveNeedFlush;
 
+
+   /* Called prior to any of the GLvertexformat functions being
+    * called.  Paired with Driver.FlushVertices().
+    */
+   void (*BeginVertices)( GLcontext *ctx );
+
    /**
     * If inside glBegin()/glEnd(), it should ASSERT(0).  Otherwise, if
     * FLUSH_STORED_VERTICES bit in \p flags is set flushes any buffered
index 0204979003e16fdae97ff821027e50195e879070..1f807dc3dc3a0903e3964b905a721eee0a077590 100644 (file)
    ASSERT( tnl->Current );                                             \
    ASSERT( tnl->SwapCount < NUM_VERTEX_FORMAT_ENTRIES );               \
    ASSERT( tmp_offset >= 0 );                                          \
-                                                                       \
-   /* Save the swapped function's dispatch entry so it can be */       \
-   /* restored later. */                                               \
+                                                                        \
+   if (tnl->SwapCount == 0)                                             \
+      ctx->Driver.BeginVertices( ctx );                                 \
+                                                                        \
+   /* Save the swapped function's dispatch entry so it can be */        \
+   /* restored later. */                                                \
    tnl->Swapped[tnl->SwapCount].location = & (((_glapi_proc *)ctx->Exec)[tmp_offset]); \
    tnl->Swapped[tnl->SwapCount].function = (_glapi_proc)TAG(FUNC);     \
    tnl->SwapCount++;                                                   \
index 635f239acc81e8ac0b4863981fa0a3b67aa89a58..e168a89ea5e28dbd1f07389a90ba1b3bbe8e5d02 100644 (file)
@@ -57,6 +57,7 @@ void vbo_exec_init( GLcontext *ctx )
 
    ctx->Driver.NeedFlush = 0;
    ctx->Driver.CurrentExecPrimitive = PRIM_OUTSIDE_BEGIN_END;
+   ctx->Driver.BeginVertices = vbo_exec_BeginVertices;
    ctx->Driver.FlushVertices = vbo_exec_FlushVertices;
 
    vbo_exec_invalidate_state( ctx, ~0 );
index ddbcbe11814c201027a56751f1aa1c84ec431ba1..3ce36657bd44e79b70fa0c586ed156543ee16d55 100644 (file)
@@ -140,6 +140,8 @@ struct vbo_exec_context
 void vbo_exec_init( GLcontext *ctx );
 void vbo_exec_destroy( GLcontext *ctx );
 void vbo_exec_invalidate_state( GLcontext *ctx, GLuint new_state );
+
+void vbo_exec_BeginVertices( GLcontext *ctx );
 void vbo_exec_FlushVertices( GLcontext *ctx, GLuint flags );
 
 
index 23f4f8331e3722c567adf66bf5a3f26300e32ee2..093e3d216780fba69901324887ae895d8f80dfbc 100644 (file)
@@ -748,6 +748,12 @@ void vbo_exec_vtx_destroy( struct vbo_exec_context *exec )
    }
 }
 
+void vbo_exec_BeginVertices( GLcontext *ctx )
+{
+   struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
+   if (0) _mesa_printf("%s\n", __FUNCTION__);
+//   vbo_exec_vtx_map( exec );
+}
 
 void vbo_exec_FlushVertices( GLcontext *ctx, GLuint flags )
 {
@@ -765,6 +771,10 @@ void vbo_exec_FlushVertices( GLcontext *ctx, GLuint flags )
       reset_attrfv( exec );
    }
 
+   /* Need to do this to ensure BeginVertices gets called again:
+    */
+   _mesa_restore_exec_vtxfmt( ctx );
+
    exec->ctx->Driver.NeedFlush = 0;
 }