Mesa (master): vbo: second attempt - avoid getting buffer_ptr and buffer_map out of sync

Keith Whitwell keithw at kemper.freedesktop.org
Wed Mar 4 09:02:13 PST 2009


Module: Mesa
Branch: master
Commit: 368ca83a3fdfbe8dfe591ab73d29c500d1a91c0a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=368ca83a3fdfbe8dfe591ab73d29c500d1a91c0a

Author: Keith Whitwell <keithw at vmware.com>
Date:   Wed Mar  4 17:01:47 2009 +0000

vbo: second attempt - avoid getting buffer_ptr and buffer_map out of sync

---

 src/mesa/vbo/vbo_exec_api.c  |    3 +++
 src/mesa/vbo/vbo_exec_draw.c |    8 +++++++-
 2 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/src/mesa/vbo/vbo_exec_api.c b/src/mesa/vbo/vbo_exec_api.c
index 9c2d065..a1e66ae 100644
--- a/src/mesa/vbo/vbo_exec_api.c
+++ b/src/mesa/vbo/vbo_exec_api.c
@@ -675,6 +675,7 @@ void vbo_use_buffer_objects(GLcontext *ctx)
    if (exec->vtx.buffer_map) {
       _mesa_align_free(exec->vtx.buffer_map);
       exec->vtx.buffer_map = NULL;
+      exec->vtx.buffer_ptr = NULL;
    }
 
    /* Allocate a real buffer object now */
@@ -700,6 +701,7 @@ void vbo_exec_vtx_init( struct vbo_exec_context *exec )
 
    ASSERT(!exec->vtx.buffer_map);
    exec->vtx.buffer_map = (GLfloat *)ALIGN_MALLOC(VBO_VERT_BUFFER_SIZE, 64);
+   exec->vtx.buffer_ptr = exec->vtx.buffer_map;
 
    vbo_exec_vtxfmt_init( exec );
 
@@ -735,6 +737,7 @@ void vbo_exec_vtx_destroy( struct vbo_exec_context *exec )
       if (exec->vtx.buffer_map) {
          ALIGN_FREE(exec->vtx.buffer_map);
          exec->vtx.buffer_map = NULL;
+         exec->vtx.buffer_ptr = NULL;
       }
    }
 }
diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
index 38b6c56..59e176b 100644
--- a/src/mesa/vbo/vbo_exec_draw.c
+++ b/src/mesa/vbo/vbo_exec_draw.c
@@ -243,7 +243,10 @@ static void vbo_exec_vtx_unmap( struct vbo_exec_context *exec )
 
       exec->vtx.buffer_used += (exec->vtx.buffer_ptr -
                                 exec->vtx.buffer_map) * sizeof(float);
-            
+
+      assert(exec->vtx.buffer_used <= VBO_VERT_BUFFER_SIZE);
+      assert(exec->vtx.buffer_ptr != NULL);
+      
       ctx->Driver.UnmapBuffer(ctx, target, exec->vtx.bufferobj);
       exec->vtx.buffer_map = NULL;
       exec->vtx.buffer_ptr = NULL;
@@ -264,6 +267,7 @@ void vbo_exec_vtx_map( struct vbo_exec_context *exec )
    if (exec->vtx.buffer_map != NULL) {
       assert(0);
       exec->vtx.buffer_map = NULL;
+      exec->vtx.buffer_ptr = NULL;
    }
 
    if (VBO_VERT_BUFFER_SIZE > exec->vtx.buffer_used + 1024 &&
@@ -280,6 +284,7 @@ void vbo_exec_vtx_map( struct vbo_exec_context *exec )
                                                 GL_MAP_UNSYNCHRONIZED_BIT | 
                                                 MESA_MAP_NOWAIT_BIT),
                                                exec->vtx.bufferobj);
+      exec->vtx.buffer_ptr = exec->vtx.buffer_map;
    }
 
    if (exec->vtx.buffer_map) {
@@ -294,6 +299,7 @@ void vbo_exec_vtx_map( struct vbo_exec_context *exec )
 
       exec->vtx.buffer_map = 
          (GLfloat *)ctx->Driver.MapBuffer(ctx, target, access, exec->vtx.bufferobj);
+      exec->vtx.buffer_ptr = exec->vtx.buffer_map;
    }
 
    if (0) _mesa_printf("map %d..\n", exec->vtx.buffer_used);



More information about the mesa-commit mailing list