Mesa (master): vbo: unmap and remap immediate vbo before/after each draw.

Keith Whitwell keithw at kemper.freedesktop.org
Wed Sep 24 04:12:14 UTC 2008


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

Author: Keith Whitwell <keith at tungstengraphics.com>
Date:   Tue Dec 18 16:56:22 2007 +0000

vbo: unmap and remap immediate vbo before/after each draw.

Also use BufferData(NULL) to get fresh storage and avoid synchronous
operation where we would have to flush and wait for the fence after each
draw because of the map.

This will chew through a whole load of buffer space on small draws, so
it isn't a proper solution.  Need to support a no-fence or append mapping
mode to do this right, or use user buffers.

---

 src/mesa/vbo/vbo_exec_draw.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/src/mesa/vbo/vbo_exec_draw.c b/src/mesa/vbo/vbo_exec_draw.c
index 557a43b..f497e9a 100644
--- a/src/mesa/vbo/vbo_exec_draw.c
+++ b/src/mesa/vbo/vbo_exec_draw.c
@@ -233,8 +233,18 @@ void vbo_exec_vtx_flush( struct vbo_exec_context *exec )
       if (exec->vtx.copied.nr != exec->vtx.vert_count) {
 	 GLcontext *ctx = exec->ctx;
 
+	 GLenum target = GL_ARRAY_BUFFER_ARB;
+	 GLenum access = GL_READ_WRITE_ARB;
+	 GLenum usage = GL_STREAM_DRAW_ARB;
+	 GLsizei size = VBO_VERT_BUFFER_SIZE * sizeof(GLfloat);
+	 
+	 /* Before the unmap (why?)
+	  */
 	 vbo_exec_bind_arrays( ctx );
 
+	 ctx->Driver.UnmapBuffer(ctx, target, exec->vtx.bufferobj);
+	 exec->vtx.buffer_map = NULL;
+
 	 vbo_context(ctx)->draw_prims( ctx, 
 				       exec->vtx.inputs, 
 				       exec->vtx.prim, 
@@ -242,6 +252,12 @@ void vbo_exec_vtx_flush( struct vbo_exec_context *exec )
 				       NULL,
 				       0,
 				       exec->vtx.vert_count - 1);
+
+	 /* Get new data:
+	  */
+	 ctx->Driver.BufferData(ctx, target, size, NULL, usage, exec->vtx.bufferobj);
+	 exec->vtx.buffer_map
+	    = ctx->Driver.MapBuffer(ctx, target, access, exec->vtx.bufferobj);
       }
    }
 




More information about the mesa-commit mailing list