Mesa (9.1): r600g: x/y coordinates must be divided by block dim in dma blit

Carl Worth cworth at kemper.freedesktop.org
Mon Jul 15 20:40:44 UTC 2013


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

Author: Christoph Bumiller <christoph.bumiller at speed.at>
Date:   Fri Jul  5 20:55:36 2013 +0200

r600g: x/y coordinates must be divided by block dim in dma blit

Note: this is a candidate for the 9.1 branch.

Reviewed-by: Marek Olšák <maraeo at gmail.com>
Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
(cherry picked from commit 9974593dfbf87e95a4c396772b82c302d663d1f8)

---

 src/gallium/drivers/r600/evergreen_state.c |   10 ++++++++--
 src/gallium/drivers/r600/r600_state.c      |   10 ++++++++--
 2 files changed, 16 insertions(+), 4 deletions(-)

diff --git a/src/gallium/drivers/r600/evergreen_state.c b/src/gallium/drivers/r600/evergreen_state.c
index 804c037..8cf9781 100644
--- a/src/gallium/drivers/r600/evergreen_state.c
+++ b/src/gallium/drivers/r600/evergreen_state.c
@@ -3644,6 +3644,7 @@ boolean evergreen_dma_blit(struct pipe_context *ctx,
 	struct r600_texture *rdst = (struct r600_texture*)dst;
 	unsigned dst_pitch, src_pitch, bpp, dst_mode, src_mode, copy_height;
 	unsigned src_w, dst_w;
+	unsigned src_x, src_y;
 
 	if (rctx->rings.dma.cs == NULL) {
 		return FALSE;
@@ -3652,6 +3653,11 @@ boolean evergreen_dma_blit(struct pipe_context *ctx,
 		return FALSE;
 	}
 
+	src_x = util_format_get_nblocksx(src->format, src_box->x);
+	dst_x = util_format_get_nblocksx(src->format, dst_x);
+	src_y = util_format_get_nblocksy(src->format, src_box->y);
+	dst_y = util_format_get_nblocksy(src->format, dst_y);
+
 	bpp = rdst->surface.bpe;
 	dst_pitch = rdst->surface.level[dst_level].pitch_bytes;
 	src_pitch = rsrc->surface.level[src_level].pitch_bytes;
@@ -3696,7 +3702,7 @@ boolean evergreen_dma_blit(struct pipe_context *ctx,
 		 */
 		src_offset= rsrc->surface.level[src_level].offset;
 		src_offset += rsrc->surface.level[src_level].slice_size * src_box->z;
-		src_offset += src_box->y * src_pitch + src_box->x * bpp;
+		src_offset += src_y * src_pitch + src_x * bpp;
 		dst_offset = rdst->surface.level[dst_level].offset;
 		dst_offset += rdst->surface.level[dst_level].slice_size * dst_z;
 		dst_offset += dst_y * dst_pitch + dst_x * bpp;
@@ -3704,7 +3710,7 @@ boolean evergreen_dma_blit(struct pipe_context *ctx,
 					src_box->height * src_pitch);
 	} else {
 		evergreen_dma_copy_tile(rctx, dst, dst_level, dst_x, dst_y, dst_z,
-					src, src_level, src_box->x, src_box->y, src_box->z,
+					src, src_level, src_x, src_y, src_box->z,
 					copy_height, dst_pitch, bpp);
 	}
 	return TRUE;
diff --git a/src/gallium/drivers/r600/r600_state.c b/src/gallium/drivers/r600/r600_state.c
index 70232fd..8ce8b82 100644
--- a/src/gallium/drivers/r600/r600_state.c
+++ b/src/gallium/drivers/r600/r600_state.c
@@ -3110,6 +3110,7 @@ boolean r600_dma_blit(struct pipe_context *ctx,
 	struct r600_texture *rdst = (struct r600_texture*)dst;
 	unsigned dst_pitch, src_pitch, bpp, dst_mode, src_mode, copy_height;
 	unsigned src_w, dst_w;
+	unsigned src_x, src_y;
 
 	if (rctx->rings.dma.cs == NULL) {
 		return FALSE;
@@ -3118,6 +3119,11 @@ boolean r600_dma_blit(struct pipe_context *ctx,
 		return FALSE;
 	}
 
+	src_x = util_format_get_nblocksx(src->format, src_box->x);
+	dst_x = util_format_get_nblocksx(src->format, dst_x);
+	src_y = util_format_get_nblocksy(src->format, src_box->y);
+	dst_y = util_format_get_nblocksy(src->format, dst_y);
+
 	bpp = rdst->surface.bpe;
 	dst_pitch = rdst->surface.level[dst_level].pitch_bytes;
 	src_pitch = rsrc->surface.level[src_level].pitch_bytes;
@@ -3150,7 +3156,7 @@ boolean r600_dma_blit(struct pipe_context *ctx,
 		 */
 		src_offset= rsrc->surface.level[src_level].offset;
 		src_offset += rsrc->surface.level[src_level].slice_size * src_box->z;
-		src_offset += src_box->y * src_pitch + src_box->x * bpp;
+		src_offset += src_y * src_pitch + src_x * bpp;
 		dst_offset = rdst->surface.level[dst_level].offset;
 		dst_offset += rdst->surface.level[dst_level].slice_size * dst_z;
 		dst_offset += dst_y * dst_pitch + dst_x * bpp;
@@ -3162,7 +3168,7 @@ boolean r600_dma_blit(struct pipe_context *ctx,
 		r600_dma_copy(rctx, dst, src, dst_offset, src_offset, size);
 	} else {
 		return r600_dma_copy_tile(rctx, dst, dst_level, dst_x, dst_y, dst_z,
-					src, src_level, src_box->x, src_box->y, src_box->z,
+					src, src_level, src_x, src_y, src_box->z,
 					copy_height, dst_pitch, bpp);
 	}
 	return TRUE;




More information about the mesa-commit mailing list