diff options
author | Brian Paul <[email protected]> | 2012-02-07 13:08:53 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2012-02-09 08:18:50 -0700 |
commit | 781f84a3c2f7a06cb9e6cc44b8d5d08b39577c25 (patch) | |
tree | aaea2a928d53df2ccc60332216b4b2cb65ac368e /src/mesa/vbo/vbo_save_draw.c | |
parent | 8b4f7b0672d663273310fffa9490ad996f5b914a (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.c | 24 |
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); + } } |