From c64a2b708944ec671b1104067245500fcfc6ed94 Mon Sep 17 00:00:00 2001
From: Keith Whitwell <keithw@vmware.com>
Date: Tue, 3 Mar 2009 10:41:57 +0000
Subject: mesa: Add BeginVertices driver call

Provides notification to the VBO modules prior to the first immediate call.
Pairs with FlushVertices()
---
 src/mesa/main/dd.h          |  6 ++++++
 src/mesa/main/vtxfmt.c      |  9 ++++++---
 src/mesa/vbo/vbo_exec.c     |  1 +
 src/mesa/vbo/vbo_exec.h     |  2 ++
 src/mesa/vbo/vbo_exec_api.c | 10 ++++++++++
 5 files changed, 25 insertions(+), 3 deletions(-)

(limited to 'src')

diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index 7fb0a211d7..b1e006901b 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -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
diff --git a/src/mesa/main/vtxfmt.c b/src/mesa/main/vtxfmt.c
index 0204979003..1f807dc3dc 100644
--- a/src/mesa/main/vtxfmt.c
+++ b/src/mesa/main/vtxfmt.c
@@ -54,9 +54,12 @@
    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++;							\
diff --git a/src/mesa/vbo/vbo_exec.c b/src/mesa/vbo/vbo_exec.c
index 635f239acc..e168a89ea5 100644
--- a/src/mesa/vbo/vbo_exec.c
+++ b/src/mesa/vbo/vbo_exec.c
@@ -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 );
diff --git a/src/mesa/vbo/vbo_exec.h b/src/mesa/vbo/vbo_exec.h
index ddbcbe1181..3ce36657bd 100644
--- a/src/mesa/vbo/vbo_exec.h
+++ b/src/mesa/vbo/vbo_exec.h
@@ -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 );
 
 
diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
index 23f4f8331e..093e3d2167 100644
--- a/src/mesa/vbo/vbo_exec_api.c
+++ b/src/mesa/vbo/vbo_exec_api.c
@@ -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;
 }
 
-- 
cgit v1.2.3