summaryrefslogtreecommitdiffstats
path: root/src/mesa/vbo/vbo_save_draw.c
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2012-02-07 13:08:53 -0700
committerBrian Paul <[email protected]>2012-02-09 08:18:50 -0700
commit781f84a3c2f7a06cb9e6cc44b8d5d08b39577c25 (patch)
treeaaea2a928d53df2ccc60332216b4b2cb65ac368e /src/mesa/vbo/vbo_save_draw.c
parent8b4f7b0672d663273310fffa9490ad996f5b914a (diff)
vbo: unmap vertex store before executing lists
We don't want our VBOs mapped when we're drawing. This change checks if the vertex store VBO is mapped before we execute a list, unmaps it, then remaps it after drawing. This situation pops up when building a nested display list in GL_COMPILE_AND_EXECUTE mode. Reviewed-by: Eric Anholt <[email protected]>
Diffstat (limited to 'src/mesa/vbo/vbo_save_draw.c')
-rw-r--r--src/mesa/vbo/vbo_save_draw.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/mesa/vbo/vbo_save_draw.c b/src/mesa/vbo/vbo_save_draw.c
index b903757c027..b8e1e7883e8 100644
--- a/src/mesa/vbo/vbo_save_draw.c
+++ b/src/mesa/vbo/vbo_save_draw.c
@@ -249,6 +249,19 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
(const struct vbo_save_vertex_list *) data;
struct vbo_save_context *save = &vbo_context(ctx)->save;
struct vbo_exec_context *exec = &vbo_context(ctx)->exec;
+ GLboolean remap_vertex_store = GL_FALSE;
+
+ if (save->vertex_store->buffer) {
+ /* The vertex store is currently mapped but we're about to replay
+ * a display list. This can happen when a nested display list is
+ * being build with GL_COMPILE_AND_EXECUTE.
+ * We never want to have mapped vertex buffers when we're drawing.
+ * Unmap the vertex store, execute the list, then remap the vertex
+ * store.
+ */
+ vbo_save_unmap_vertex_store(ctx, save->vertex_store);
+ remap_vertex_store = GL_TRUE;
+ }
FLUSH_CURRENT(ctx, 0);
@@ -264,14 +277,16 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
printf("displaylist recursive begin");
vbo_save_loopback_vertex_list( ctx, node );
- return;
+
+ goto end;
}
else if (save->replay_flags) {
/* Various degnerate cases: translate into immediate mode
* calls rather than trying to execute in place.
*/
vbo_save_loopback_vertex_list( ctx, node );
- return;
+
+ goto end;
}
if (ctx->NewState)
@@ -310,6 +325,11 @@ vbo_save_playback_vertex_list(struct gl_context *ctx, void *data)
/* Copy to current?
*/
_playback_copy_to_current( ctx, node );
+
+end:
+ if (remap_vertex_store) {
+ save->buffer_ptr = vbo_save_map_vertex_store(ctx, save->vertex_store);
+ }
}