From: Marek Olšák <marek.ol...@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 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev