[Mesa-dev] [PATCH] r600g, radeonsi: add debug option which forces DMA for copy_region and blit

Marek Olšák maraeo at gmail.com
Sat Sep 6 08:15:37 PDT 2014


From: Marek Olšák <marek.olsak at amd.com>

---

Turn this on, run piglit, and pray for mercy.
It might be interesting to see if it makes 3D apps any faster. Or piglit.

 src/gallium/drivers/r600/evergreen_state.c    |  2 +-
 src/gallium/drivers/r600/r600_blit.c          | 18 +++++++++++-------
 src/gallium/drivers/r600/r600_pipe.c          |  3 +++
 src/gallium/drivers/r600/r600_pipe.h          | 11 +++++++++--
 src/gallium/drivers/r600/r600_state.c         |  2 +-
 src/gallium/drivers/radeon/r600_pipe_common.c |  1 +
 src/gallium/drivers/radeon/r600_pipe_common.h |  3 ++-
 src/gallium/drivers/radeonsi/si_blit.c        | 19 ++++++++++++-------
 src/gallium/drivers/radeonsi/si_dma.c         |  4 ++--
 src/gallium/drivers/radeonsi/si_pipe.c        |  3 +++
 src/gallium/drivers/radeonsi/si_pipe.h        |  7 +++++++
 11 files changed, 52 insertions(+), 21 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index e7faeaf..27a9ad9 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -3365,7 +3365,7 @@ static void evergreen_dma_copy(struct pipe_context *ctx,
 	return;
 
 fallback:
-	ctx->resource_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
+	r600_resource_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
 				  src, src_level, src_box);
 }
 
diff --git a/src/gallium/drivers/r600/r600_blit.c b/src/gallium/drivers/r600/r600_blit.c
index f766e37..1e18d87 100644
--- a/src/gallium/drivers/r600/r600_blit.c
+++ b/src/gallium/drivers/r600/r600_blit.c
@@ -565,13 +565,13 @@ static void r600_clear_buffer(struct pipe_context *ctx, struct pipe_resource *ds
 	}
 }
 
-static void r600_resource_copy_region(struct pipe_context *ctx,
-				      struct pipe_resource *dst,
-				      unsigned dst_level,
-				      unsigned dstx, unsigned dsty, unsigned dstz,
-				      struct pipe_resource *src,
-				      unsigned src_level,
-				      const struct pipe_box *src_box)
+void r600_resource_copy_region(struct pipe_context *ctx,
+			       struct pipe_resource *dst,
+			       unsigned dst_level,
+			       unsigned dstx, unsigned dsty, unsigned dstz,
+			       struct pipe_resource *src,
+			       unsigned src_level,
+			       const struct pipe_box *src_box)
 {
 	struct r600_context *rctx = (struct r600_context *)ctx;
 	struct pipe_surface *dst_view, dst_templ;
@@ -815,6 +815,10 @@ static void r600_blit(struct pipe_context *ctx,
 		return; /* error */
 	}
 
+	if (rctx->screen->b.debug_flags & DBG_FORCE_DMA &&
+	    util_try_blit_via_copy_region(ctx, info))
+		return;
+
 	r600_blitter_begin(ctx, R600_BLIT |
 			   (info->render_condition_enable ? 0 : R600_DISABLE_RENDER_COND));
 	util_blitter_blit(rctx->blitter, info);
diff --git a/src/gallium/drivers/r600/r600_pipe.c b/src/gallium/drivers/r600/r600_pipe.c
index 6e00eff..f396328 100644
--- a/src/gallium/drivers/r600/r600_pipe.c
+++ b/src/gallium/drivers/r600/r600_pipe.c
@@ -191,6 +191,9 @@ static struct pipe_context *r600_create_context(struct pipe_screen *screen, void
 	if (!rctx->isa || r600_isa_init(rctx, rctx->isa))
 		goto fail;
 
+	if (rscreen->b.debug_flags & DBG_FORCE_DMA)
+		rctx->b.b.resource_copy_region = rctx->b.dma_copy;
+
 	rctx->blitter = util_blitter_create(&rctx->b.b);
 	if (rctx->blitter == NULL)
 		goto fail;
diff --git a/src/gallium/drivers/r600/r600_pipe.h b/src/gallium/drivers/r600/r600_pipe.h
index 8907d41..2df168f 100644
--- a/src/gallium/drivers/r600/r600_pipe.h
+++ b/src/gallium/drivers/r600/r600_pipe.h
@@ -195,8 +195,8 @@ struct r600_gs_rings_state {
 
 /* This must start from 16. */
 /* features */
-#define DBG_LLVM		(1 << 17)
-#define DBG_NO_CP_DMA		(1 << 18)
+#define DBG_LLVM		(1 << 29)
+#define DBG_NO_CP_DMA		(1 << 30)
 /* shader backend */
 #define DBG_NO_SB		(1 << 21)
 #define DBG_SB_CS		(1 << 22)
@@ -551,6 +551,13 @@ void r600_decompress_depth_textures(struct r600_context *rctx,
 				    struct r600_samplerview_state *textures);
 void r600_decompress_color_textures(struct r600_context *rctx,
 				    struct r600_samplerview_state *textures);
+void r600_resource_copy_region(struct pipe_context *ctx,
+			       struct pipe_resource *dst,
+			       unsigned dst_level,
+			       unsigned dstx, unsigned dsty, unsigned dstz,
+			       struct pipe_resource *src,
+			       unsigned src_level,
+			       const struct pipe_box *src_box);
 
 /* r600_shader.c */
 int r600_pipe_shader_create(struct pipe_context *ctx,
diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
index 36f7750..9ca6171 100644
--- a/src/gallium/drivers/r600/r600_state.c
+++ b/src/gallium/drivers/r600/r600_state.c
@@ -2966,7 +2966,7 @@ static void r600_dma_copy(struct pipe_context *ctx,
 	return;
 
 fallback:
-	ctx->resource_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
+	r600_resource_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
 				  src, src_level, src_box);
 }
 
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c b/src/gallium/drivers/radeon/r600_pipe_common.c
index dec8063..ae203b6 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -320,6 +320,7 @@ static const struct debug_named_value common_debug_options[] = {
 	{ "no2d", DBG_NO_2D_TILING, "Disable 2D tiling" },
 	{ "notiling", DBG_NO_TILING, "Disable tiling" },
 	{ "switch_on_eop", DBG_SWITCH_ON_EOP, "Program WD/IA to switch on end-of-packet." },
+	{ "forcedma", DBG_FORCE_DMA, "Use asynchronous DMA for all operations when possible." },
 
 	DEBUG_NAMED_VALUE_END /* must be last */
 };
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h b/src/gallium/drivers/radeon/r600_pipe_common.h
index b9a35c7..beaa312 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -98,7 +98,8 @@
 #define DBG_NO_2D_TILING	(1 << 13)
 #define DBG_NO_TILING		(1 << 14)
 #define DBG_SWITCH_ON_EOP	(1 << 15)
-/* The maximum allowed bit is 15. */
+#define DBG_FORCE_DMA		(1 << 16)
+/* The maximum allowed bit is 20. */
 
 #define R600_MAP_BUFFER_ALIGNMENT 64
 
diff --git a/src/gallium/drivers/radeonsi/si_blit.c b/src/gallium/drivers/radeonsi/si_blit.c
index 96d27ec..9f95a8a 100644
--- a/src/gallium/drivers/radeonsi/si_blit.c
+++ b/src/gallium/drivers/radeonsi/si_blit.c
@@ -23,6 +23,7 @@
 
 #include "si_pipe.h"
 #include "util/u_format.h"
+#include "util/u_surface.h"
 
 enum si_blitter_op /* bitmask */
 {
@@ -531,13 +532,13 @@ static void si_reset_blittable_to_orig(struct pipe_resource *tex,
 	rtex->mipmap_shift = 0;
 }
 
-static void si_resource_copy_region(struct pipe_context *ctx,
-				    struct pipe_resource *dst,
-				    unsigned dst_level,
-				    unsigned dstx, unsigned dsty, unsigned dstz,
-				    struct pipe_resource *src,
-				    unsigned src_level,
-				    const struct pipe_box *src_box)
+void si_resource_copy_region(struct pipe_context *ctx,
+			     struct pipe_resource *dst,
+			     unsigned dst_level,
+			     unsigned dstx, unsigned dsty, unsigned dstz,
+			     struct pipe_resource *src,
+			     unsigned src_level,
+			     const struct pipe_box *src_box)
 {
 	struct si_context *sctx = (struct si_context *)ctx;
 	struct r600_texture *rdst = (struct r600_texture*)dst;
@@ -770,6 +771,10 @@ static void si_blit(struct pipe_context *ctx,
 				  info->src.box.z,
 				  info->src.box.z + info->src.box.depth - 1);
 
+	if (sctx->screen->b.debug_flags & DBG_FORCE_DMA &&
+	    util_try_blit_via_copy_region(ctx, info))
+		return;
+
 	si_blitter_begin(ctx, SI_BLIT |
 			 (info->render_condition_enable ? 0 : SI_DISABLE_RENDER_COND));
 	util_blitter_blit(sctx->blitter, info);
diff --git a/src/gallium/drivers/radeonsi/si_dma.c b/src/gallium/drivers/radeonsi/si_dma.c
index 4a87f79..f6e2a78 100644
--- a/src/gallium/drivers/radeonsi/si_dma.c
+++ b/src/gallium/drivers/radeonsi/si_dma.c
@@ -331,6 +331,6 @@ void si_dma_copy(struct pipe_context *ctx,
 	return;
 
 fallback:
-	ctx->resource_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
-				  src, src_level, src_box);
+	si_resource_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
+				src, src_level, src_box);
 }
diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c
index b63c5d7..d540646 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.c
+++ b/src/gallium/drivers/radeonsi/si_pipe.c
@@ -118,6 +118,9 @@ static struct pipe_context *si_create_context(struct pipe_screen *screen, void *
 		goto fail;
 	}
 
+	if (sscreen->b.debug_flags & DBG_FORCE_DMA)
+		sctx->b.b.resource_copy_region = sctx->b.dma_copy;
+
 	sctx->blitter = util_blitter_create(&sctx->b.b);
 	if (sctx->blitter == NULL)
 		goto fail;
diff --git a/src/gallium/drivers/radeonsi/si_pipe.h b/src/gallium/drivers/radeonsi/si_pipe.h
index 55643d6..6ec8d5d 100644
--- a/src/gallium/drivers/radeonsi/si_pipe.h
+++ b/src/gallium/drivers/radeonsi/si_pipe.h
@@ -174,6 +174,13 @@ void si_flush_depth_textures(struct si_context *sctx,
 			     struct si_textures_info *textures);
 void si_decompress_color_textures(struct si_context *sctx,
 				  struct si_textures_info *textures);
+void si_resource_copy_region(struct pipe_context *ctx,
+			     struct pipe_resource *dst,
+			     unsigned dst_level,
+			     unsigned dstx, unsigned dsty, unsigned dstz,
+			     struct pipe_resource *src,
+			     unsigned src_level,
+			     const struct pipe_box *src_box);
 
 /* si_dma.c */
 void si_dma_copy(struct pipe_context *ctx,
-- 
1.9.1



More information about the mesa-dev mailing list