Mesa (mesa_7_7_branch): radeon: fix image migration for small compressed textures

Maciej Cencora osiris at kemper.freedesktop.org
Mon Dec 7 13:30:46 PST 2009


Module: Mesa
Branch: mesa_7_7_branch
Commit: 013cf1d63deb9c33089777afbdea85013fd46b49
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=013cf1d63deb9c33089777afbdea85013fd46b49

Author: Maciej Cencora <m.cencora at gmail.com>
Date:   Mon Dec  7 22:22:57 2009 +0100

radeon: fix image migration for small compressed textures

memcpy would give incorrect results if src rowstride != dst rowstride

---

 src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c |   23 ++++++++-------------
 1 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
index 0415a50..91f0db9 100644
--- a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
+++ b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
@@ -437,23 +437,18 @@ static void migrate_image_to_miptree(radeon_mipmap_tree *mt,
 
 		radeon_miptree_unreference(&image->mt);
 	} else {
-		/* need to confirm this value is correct */
-		if (_mesa_is_format_compressed(image->base.TexFormat)) {
-			unsigned size = _mesa_format_image_size(image->base.TexFormat,
-													image->base.Width,
-													image->base.Height,
-													image->base.Depth);
-			memcpy(dest, image->base.Data, size);
-		} else {
-			uint32_t srcrowstride;
-			uint32_t height;
+		const uint32_t srcrowstride = _mesa_format_row_stride(image->base.TexFormat, image->base.Width);
+		uint32_t rows = image->base.Height * image->base.Depth;
 
-			height = image->base.Height * image->base.Depth;
-			srcrowstride = image->base.Width * _mesa_get_format_bytes(image->base.TexFormat);
-			copy_rows(dest, dstlvl->rowstride, image->base.Data, srcrowstride,
-					height, srcrowstride);
+		if (_mesa_is_format_compressed(image->base.TexFormat)) {
+			uint32_t blockWidth, blockHeight;
+			_mesa_get_format_block_size(image->base.TexFormat, &blockWidth, &blockHeight);
+			rows = (rows + blockHeight - 1) / blockHeight;
 		}
 
+		copy_rows(dest, dstlvl->rowstride, image->base.Data, srcrowstride,
+				  rows, srcrowstride);
+
 		_mesa_free_texmemory(image->base.Data);
 		image->base.Data = 0;
 	}



More information about the mesa-commit mailing list