Mesa (master): radeon: more fixes for compressed textures

Roland Scheidegger sroland at kemper.freedesktop.org
Mon Aug 3 22:21:50 UTC 2009


Module: Mesa
Branch: master
Commit: 50c736589ee0edbedf9ac434e883483b82b3030a
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=50c736589ee0edbedf9ac434e883483b82b3030a

Author: Roland Scheidegger <sroland at vmware.com>
Date:   Tue Aug  4 00:21:07 2009 +0200

radeon: more fixes for compressed textures

- fix not respecting required hardware stride with compressedTexImage -
  this fixes #22615.
- make sure correct stride is used in various places
- fix stored miptree never matching with a TexImage call with compressed
  texture
- don't always store data with compressedtexsubimage at offset 0,
  and actually use the supplied pixel data... (untested)
- make sure rows for compressed texture handling are rounded up not down

Note that trying to access stored compressed textures in hardware miptrees
from core mesa (get_compressed_teximage, swrast fallbacks) can't work correctly,
since RowStride isn't really set to anything useful, plus some places (at least
get_compressed_teximage) assume this data has native stride and no padding.

---

 src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c |    4 +-
 src/mesa/drivers/dri/radeon/radeon_texture.c     |   37 ++++++++++++++++-----
 2 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
index 071a18e..02e0dc7 100644
--- a/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
+++ b/src/mesa/drivers/dri/radeon/radeon_mipmap_tree.c
@@ -366,8 +366,8 @@ GLboolean radeon_miptree_matches_texture(radeon_mipmap_tree *mt, struct gl_textu
 	        mt->width0 == firstImage->Width &&
 	        mt->height0 == firstImage->Height &&
 	        mt->depth0 == firstImage->Depth &&
-	        mt->bpp == firstImage->TexFormat->TexelBytes &&
-	        mt->compressed == compressed);
+	        mt->compressed == compressed &&
+	        (!mt->compressed ? (mt->bpp == firstImage->TexFormat->TexelBytes) : 1));
 }
 
 
diff --git a/src/mesa/drivers/dri/radeon/radeon_texture.c b/src/mesa/drivers/dri/radeon/radeon_texture.c
index 6a065f0..fa16f44 100644
--- a/src/mesa/drivers/dri/radeon/radeon_texture.c
+++ b/src/mesa/drivers/dri/radeon/radeon_texture.c
@@ -610,9 +610,17 @@ static void radeon_teximage(
 
 	if (pixels) {
 		radeon_teximage_map(image, GL_TRUE);
-
 		if (compressed) {
-			memcpy(texImage->Data, pixels, imageSize);
+			if (image->mt) {
+				uint32_t srcRowStride, bytesPerRow, rows;
+				srcRowStride = _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, width);
+				bytesPerRow = srcRowStride;
+				rows = (height + 3) / 4;
+				copy_rows(texImage->Data, image->mt->levels[level].rowstride,
+					  pixels, srcRowStride, rows, bytesPerRow);
+			} else {
+				memcpy(texImage->Data, pixels, imageSize);
+			}
 		} else {
 			GLuint dstRowStride;
 			GLuint *dstImageOffsets;
@@ -756,14 +764,23 @@ static void radeon_texsubimage(GLcontext* ctx, int dims, GLenum target, int leve
 		}
 
 		if (compressed) {
-			uint32_t srcRowStride, bytesPerRow, rows; 
-			dstRowStride = _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, texImage->Width);
+			uint32_t srcRowStride, bytesPerRow, rows;
+			GLubyte *img_start;
+			if (!image->mt) {
+				dstRowStride = _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, texImage->Width);
+				img_start = _mesa_compressed_image_address(xoffset, yoffset, 0,
+									   texImage->TexFormat->MesaFormat,
+									   texImage->Width, texImage->Data);
+			}
+			else {
+				uint32_t blocks_x = dstRowStride / (image->mt->bpp * 4);
+				img_start = texImage->Data + image->mt->bpp * 4 * (blocks_x * (yoffset / 4) + xoffset / 4);
+			}
 			srcRowStride = _mesa_compressed_row_stride(texImage->TexFormat->MesaFormat, width);
 			bytesPerRow = srcRowStride;
-			rows = height / 4;
+			rows = (height + 3) / 4;
 
-			copy_rows(texImage->Data, dstRowStride,  image->base.Data, srcRowStride, rows,
-				  bytesPerRow);
+			copy_rows(img_start, dstRowStride,  pixels, srcRowStride, rows,  bytesPerRow);
 			
 		} else {
 			if (!texImage->TexFormat->StoreImage(ctx, dims, texImage->_BaseFormat,
@@ -884,8 +901,8 @@ static void migrate_image_to_miptree(radeon_mipmap_tree *mt, radeon_texture_imag
 		uint32_t height;
 		/* need to confirm this value is correct */
 		if (mt->compressed) {
-			height = image->base.Height / 4;
-			srcrowstride = image->base.RowStride * mt->bpp;
+			height = (image->base.Height + 3) / 4;
+			srcrowstride = _mesa_compressed_row_stride(image->base.TexFormat->MesaFormat, image->base.Width);
 		} else {
 			height = image->base.Height * image->base.Depth;
 			srcrowstride = image->base.Width * image->base.TexFormat->TexelBytes;
@@ -1000,6 +1017,8 @@ radeon_get_tex_image(GLcontext * ctx, GLenum target, GLint level,
 	}
 
 	if (compressed) {
+		/* FIXME: this can't work for small textures (mips) which
+		         use different hw stride */
 		_mesa_get_compressed_teximage(ctx, target, level, pixels,
 					      texObj, texImage);
 	} else {




More information about the mesa-commit mailing list