r600g: Flush upload buffers before draws instead of before flushes.
authorHenri Verbeet <hverbeet@gmail.com>
Sun, 19 Sep 2010 17:27:30 +0000 (19:27 +0200)
committerHenri Verbeet <hverbeet@gmail.com>
Sun, 19 Sep 2010 17:43:05 +0000 (19:43 +0200)
If a upload buffer is used by a previous draw that's still in the CS,
accessing it would need a context flush. However, doing a context flush when
mapping the upload buffer would then flush/destroy the same buffer we're trying
to map there. Flushing the upload buffers before a draw avoids both the CS
flush and the upload buffer going away while it's being used. Note that
u_upload_data() could e.g. use a pool of buffers instead of allocating new
ones all the time if that turns out to be a significant issue.

src/gallium/drivers/r600/r600_context.c
src/gallium/drivers/r600/r600_draw.c

index 776dc24569b692b826382d8c100ed0bf19eb2fdd..f07cbfc2ccff4ef8cecc3142683c8972e23967e9 100644 (file)
@@ -70,10 +70,6 @@ void r600_flush(struct pipe_context *ctx, unsigned flags,
        struct r600_context *rctx = r600_context(ctx);
        struct r600_query *rquery = NULL;
 
-       /* flush upload buffers */
-       u_upload_flush(rctx->upload_vb);
-       u_upload_flush(rctx->upload_ib);
-
        /* suspend queries */
        r600_queries_suspend(ctx);
 
index cbfa44868e8efaff682b06c685623dc6d780ee41..00a6aeaef25f18bce2d3ee9df31c9b7965bf3004 100644 (file)
@@ -31,6 +31,7 @@
 #include <util/u_math.h>
 #include <util/u_inlines.h>
 #include <util/u_memory.h>
+#include <util/u_upload_mgr.h>
 #include "radeon.h"
 #include "r600_screen.h"
 #include "r600_context.h"
@@ -125,6 +126,10 @@ void r600_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *info)
 
        memset(&draw, 0, sizeof(draw));
 
+       /* flush upload buffers */
+       u_upload_flush(rctx->upload_vb);
+       u_upload_flush(rctx->upload_ib);
+
        if (rctx->any_user_vbs) {
                r600_upload_user_buffers(rctx);
                rctx->any_user_vbs = false;