mesa: fix image unpacking when storing compressed textures

This fixes failures found with the new piglit texsubimage test.

Two things were broken:
1. The dxt code doesn't handle sources images where width != row stride.
   Check for that and take the _mesa_make_temp_ubyte_image() path to get
   an image where width = rowstride.
2. If we don't take the _mesa_make_temp_ubyte_image() path we need to
   take the source image unpacking parameters into account in order to
   get the proper starting memory address of the source texels.

Note: This is a candidate for the 7.11 branch.
This commit is contained in:
Brian Paul 2011-10-07 08:14:46 -06:00
parent 530728fb60
commit d7477ad0a3
2 changed files with 19 additions and 6 deletions

View file

@ -76,6 +76,7 @@ _mesa_texstore_rgb_fxt1(TEXSTORE_PARAMS)
if (srcFormat != GL_RGB ||
srcType != GL_UNSIGNED_BYTE ||
ctx->_ImageTransferState ||
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGB/GLubyte */
tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
@ -91,7 +92,9 @@ _mesa_texstore_rgb_fxt1(TEXSTORE_PARAMS)
srcFormat = GL_RGB;
}
else {
pixels = (const GLubyte *) srcAddr;
pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
srcFormat, srcType, 0, 0);
srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat,
srcType) / sizeof(GLubyte);
}
@ -146,7 +149,9 @@ _mesa_texstore_rgba_fxt1(TEXSTORE_PARAMS)
srcFormat = GL_RGBA;
}
else {
pixels = (const GLubyte *) srcAddr;
pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
srcFormat, srcType, 0, 0);
srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat,
srcType) / sizeof(GLubyte);
}

View file

@ -178,6 +178,7 @@ _mesa_texstore_rgb_dxt1(TEXSTORE_PARAMS)
if (srcFormat != GL_RGB ||
srcType != GL_UNSIGNED_BYTE ||
ctx->_ImageTransferState ||
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGB/GLubyte */
tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
@ -192,7 +193,8 @@ _mesa_texstore_rgb_dxt1(TEXSTORE_PARAMS)
srcFormat = GL_RGB;
}
else {
pixels = (const GLubyte *) srcAddr;
pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
srcFormat, srcType, 0, 0);
}
dst = _mesa_compressed_image_address(dstXoffset, dstYoffset, 0,
@ -236,6 +238,7 @@ _mesa_texstore_rgba_dxt1(TEXSTORE_PARAMS)
if (srcFormat != GL_RGBA ||
srcType != GL_UNSIGNED_BYTE ||
ctx->_ImageTransferState ||
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGBA/GLubyte */
tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
@ -250,7 +253,8 @@ _mesa_texstore_rgba_dxt1(TEXSTORE_PARAMS)
srcFormat = GL_RGBA;
}
else {
pixels = (const GLubyte *) srcAddr;
pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
srcFormat, srcType, 0, 0);
}
dst = _mesa_compressed_image_address(dstXoffset, dstYoffset, 0,
@ -293,6 +297,7 @@ _mesa_texstore_rgba_dxt3(TEXSTORE_PARAMS)
if (srcFormat != GL_RGBA ||
srcType != GL_UNSIGNED_BYTE ||
ctx->_ImageTransferState ||
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGBA/GLubyte */
tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
@ -306,7 +311,8 @@ _mesa_texstore_rgba_dxt3(TEXSTORE_PARAMS)
pixels = tempImage;
}
else {
pixels = (const GLubyte *) srcAddr;
pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
srcFormat, srcType, 0, 0);
}
dst = _mesa_compressed_image_address(dstXoffset, dstYoffset, 0,
@ -349,6 +355,7 @@ _mesa_texstore_rgba_dxt5(TEXSTORE_PARAMS)
if (srcFormat != GL_RGBA ||
srcType != GL_UNSIGNED_BYTE ||
ctx->_ImageTransferState ||
srcPacking->RowLength != srcWidth ||
srcPacking->SwapBytes) {
/* convert image to RGBA/GLubyte */
tempImage = _mesa_make_temp_ubyte_image(ctx, dims,
@ -362,7 +369,8 @@ _mesa_texstore_rgba_dxt5(TEXSTORE_PARAMS)
pixels = tempImage;
}
else {
pixels = (const GLubyte *) srcAddr;
pixels = _mesa_image_address2d(srcPacking, srcAddr, srcWidth, srcHeight,
srcFormat, srcType, 0, 0);
}
dst = _mesa_compressed_image_address(dstXoffset, dstYoffset, 0,