Mesa (master): r600g: Flush upload buffers before draws instead of before flushes.

Henri Verbeet hverbeet at kemper.freedesktop.org
Sun Sep 19 17:43:57 UTC 2010


Module: Mesa
Branch: master
Commit: a1d9a58b825825723f1c5f7705f2ed3ef834038a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a1d9a58b825825723f1c5f7705f2ed3ef834038a

Author: Henri Verbeet <hverbeet at gmail.com>
Date:   Sun Sep 19 19:27:30 2010 +0200

r600g: Flush upload buffers before draws instead of before flushes.

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 |    4 ----
 src/gallium/drivers/r600/r600_draw.c    |    5 +++++
 2 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_context.c b/src/gallium/drivers/r600/r600_context.c
index 776dc24..f07cbfc 100644
--- a/src/gallium/drivers/r600/r600_context.c
+++ b/src/gallium/drivers/r600/r600_context.c
@@ -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);
 
diff --git a/src/gallium/drivers/r600/r600_draw.c b/src/gallium/drivers/r600/r600_draw.c
index cbfa448..00a6aea 100644
--- a/src/gallium/drivers/r600/r600_draw.c
+++ b/src/gallium/drivers/r600/r600_draw.c
@@ -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;




More information about the mesa-commit mailing list