[Mesa-dev] [PATCH] radeonsi: Fix si_dma_copy(_tile) for compressed formats

Michel Dänzer michel at daenzer.net
Wed Sep 10 02:59:15 PDT 2014


From: Michel Dänzer <michel.daenzer at amd.com>

Fixes GPUVM faults when running the piglit test "getteximage-formats
init-by-rendering" with R600_DEBUG=forcedma on SI.

Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
---
 src/gallium/drivers/radeonsi/si_dma.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_dma.c b/src/gallium/drivers/radeonsi/si_dma.c
index cd6ff4a..02899c1 100644
--- a/src/gallium/drivers/radeonsi/si_dma.c
+++ b/src/gallium/drivers/radeonsi/si_dma.c
@@ -148,7 +148,6 @@ static void si_dma_copy_tile(struct si_context *ctx,
 
 	sub_cmd = SI_DMA_COPY_TILED;
 	lbpp = util_logbase2(bpp);
-	pitch_tile_max = ((pitch / bpp) / 8) - 1;
 
 	detile = dst_mode == RADEON_SURF_MODE_LINEAR;
 	rlinear = detile ? rdst : rsrc;
@@ -165,8 +164,13 @@ static void si_dma_copy_tile(struct si_context *ctx,
 	assert(!util_format_is_depth_and_stencil(rtiled->resource.b.b.format));
 
 	array_mode = si_array_mode(rtiled->surface.level[tiled_lvl].mode);
-	slice_tile_max = (rtiled->surface.level[tiled_lvl].nblk_x *
-			  rtiled->surface.level[tiled_lvl].nblk_y) / (8*8) - 1;
+	pitch_tile_max =
+		rtiled->surface.level[tiled_lvl].nblk_x * rtiled->surface.blk_w
+		/ 8 - 1;
+	slice_tile_max =
+		rtiled->surface.level[tiled_lvl].nblk_x * rtiled->surface.blk_w
+		* rtiled->surface.level[tiled_lvl].nblk_y * rtiled->surface.blk_h
+		/ (8*8) - 1;
 	/* linear height must be the same as the slice tile max height, it's ok even
 	 * if the linear destination/source have smaller heigh as the size of the
 	 * dma packet will be using the copy_height which is always smaller or equal
@@ -216,7 +220,7 @@ static void si_dma_copy_tile(struct si_context *ctx,
 		cs->buf[cs->cdw++] = (addr >> 32UL) & 0xff;
 		copy_height -= cheight;
 		addr += cheight * pitch;
-		tiled_y += cheight;
+		tiled_y += cheight * rtiled->surface.blk_h;
 	}
 }
 
@@ -302,7 +306,7 @@ void si_dma_copy(struct pipe_context *ctx,
 		dst_offset += rdst->surface.level[dst_level].slice_size * dst_z;
 		dst_offset += dst_y * dst_pitch + dst_x * bpp;
 		si_dma_copy_buffer(sctx, dst, src, dst_offset, src_offset,
-			    src_box->height * src_pitch);
+				   copy_height * src_pitch);
 	} else {
 		si_dma_copy_tile(sctx, dst, dst_level, dst_x, dst_y, dst_z,
 				 src, src_level, src_x, src_y, src_box->z,
-- 
2.1.0



More information about the mesa-dev mailing list