summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeith Whitwell <[email protected]>2007-12-18 16:56:22 +0000
committerKeith Whitwell <[email protected]>2007-12-18 16:56:22 +0000
commit9d4ab42f4be3a26f702729cc79ef67f8afc2eca5 (patch)
tree6a1478b30115b05a39fb4629dac566d0b41001b6
parent7cef9237ae663f107dce82a688e8e0a9ce8193bc (diff)
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.
-rw-r--r--src/mesa/vbo/vbo_exec_draw.c16
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 68aba1df66b..23a3658386c 100644
--- a/src/mesa/vbo/vbo_exec_draw.c
+++ b/src/mesa/vbo/vbo_exec_draw.c
@@ -221,8 +221,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,
@@ -230,6 +240,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);
}
}