mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-09 02:28:10 +02:00
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:
parent
530728fb60
commit
d7477ad0a3
2 changed files with 19 additions and 6 deletions
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue