Mesa (master): r600g: explicitly flush caches for streamout-based buffer copying & clearing

Marek Olšák mareko at kemper.freedesktop.org
Mon Jul 8 18:30:02 UTC 2013


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

Author: Marek Olšák <maraeo at gmail.com>
Date:   Mon Jul  1 02:31:22 2013 +0200

r600g: explicitly flush caches for streamout-based buffer copying & clearing

It's done automatically for vertex buffers, but not for constant buffers,
textures, and colorbuffers.

Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

---

 src/gallium/drivers/r600/r600_blit.c |   13 +++++++++++++
 1 files changed, 13 insertions(+), 0 deletions(-)

diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index ba5d4ea..2230e7b 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -569,9 +569,17 @@ void r600_copy_buffer(struct pipe_context *ctx, struct pipe_resource *dst, unsig
 	else if (rctx->screen->has_streamout &&
 		 /* Require 4-byte alignment. */
 		 dstx % 4 == 0 && src_box->x % 4 == 0 && src_box->width % 4 == 0) {
+
+		/* Flush both resources. */
+		r600_flag_resource_cache_flush(rctx, src);
+		r600_flag_resource_cache_flush(rctx, dst);
+
 		r600_blitter_begin(ctx, R600_COPY_BUFFER);
 		util_blitter_copy_buffer(rctx->blitter, dst, dstx, src, src_box->x, src_box->width);
 		r600_blitter_end(ctx);
+
+		/* Flush the dst in case the 3D engine has been prefetching the resource. */
+		r600_flag_resource_cache_flush(rctx, dst);
 	} else {
 		util_resource_copy_region(ctx, dst, 0, dstx, 0, 0, src, 0, src_box);
 	}
@@ -594,10 +602,15 @@ static void r600_clear_buffer(struct pipe_context *ctx, struct pipe_resource *ds
 
 		clear_value.ui[0] = v | (v << 8) | (v << 16) | (v << 24);
 
+		r600_flag_resource_cache_flush(rctx, dst);
+
 		r600_blitter_begin(ctx, R600_DISABLE_RENDER_COND);
 		util_blitter_clear_buffer(rctx->blitter, dst, offset, size,
 					  1, &clear_value);
 		r600_blitter_end(ctx);
+
+		/* Flush again in case the 3D engine has been prefetching the resource. */
+		r600_flag_resource_cache_flush(rctx, dst);
 	} else {
 		char *map = r600_buffer_mmap_sync_with_rings(rctx, r600_resource(dst),
 							     PIPE_TRANSFER_WRITE);




More information about the mesa-commit mailing list