r300g: add workaround for multiple contexts
authorMarek Olšák <maraeo@gmail.com>
Tue, 29 Jun 2010 22:02:27 +0000 (00:02 +0200)
committerMarek Olšák <maraeo@gmail.com>
Tue, 29 Jun 2010 22:03:04 +0000 (00:03 +0200)
src/gallium/drivers/r300/r300_context.c
src/gallium/drivers/r300/r300_context.h
src/gallium/drivers/r300/r300_screen_buffer.c

index 59129bc24d9f268b6a5567f6c4e226a8ed45ecde..2fe2e0a96d7d968b790207e2b06d6580c57955ec 100644 (file)
@@ -121,7 +121,7 @@ static void r300_destroy_context(struct pipe_context* context)
     FREE(r300);
 }
 
-static void r300_flush_cb(void *data)
+void r300_flush_cb(void *data)
 {
     struct r300_context* const cs_context_copy = data;
 
index ac5ae23cb5a51d1ee396ecc5c57ab0f6d6a3bf09..5bc5d9893966798197fbad005aff74ee0483fb6e 100644 (file)
@@ -564,6 +564,7 @@ struct pipe_context* r300_create_context(struct pipe_screen* screen,
 
 boolean r300_check_cs(struct r300_context *r300, unsigned size);
 void r300_finish(struct r300_context *r300);
+void r300_flush_cb(void *data);
 
 /* Context initialization. */
 struct draw_stage* r300_draw_stage(struct r300_context* r300);
index 7959e6a2f9eaa82a9c701b974ce9d3377c7d8956..f49f36b6264766c7ecbb2e2345664724cdf93c46 100644 (file)
@@ -178,7 +178,14 @@ r300_buffer_transfer_map( struct pipe_context *pipe,
            }
        }
     }
+
 just_map:
+    /* XXX buffer_map might flush.
+     * We cannot flush here because there is a buffer manager between
+     * the context and winsys, and it does some magic to make the driver
+     * fast. This is a workaround for the case of multiple contexts. */
+    rws->set_flush_cb(rws, r300_flush_cb, pipe);
+
     map = rws->buffer_map(rws, rbuf->buf, transfer->usage);
 
     if (map == NULL)