radeon: fix image migration for small compressed textures
authorMaciej Cencora <m.cencora@gmail.com>
Mon, 7 Dec 2009 21:22:57 +0000 (22:22 +0100)
committerMaciej Cencora <m.cencora@gmail.com>
Mon, 7 Dec 2009 21:29:11 +0000 (22:29 +0100)
memcpy would give incorrect results if src rowstride != dst rowstride

src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c

index 0415a50d0b32ec84aa1cbbeb21182bed69ba7c8b..91f0db958b9f14b730c98a054ddb8e3b0b16afa7 100644 (file)
@@ -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;
        }