Don't use _mesa_swizzle_ubyte_image if all three texture formats
authorFelix Kuehling <fxkuehl@gmx.de>
Mon, 16 May 2005 23:01:09 +0000 (23:01 +0000)
committerFelix Kuehling <fxkuehl@gmx.de>
Mon, 16 May 2005 23:01:09 +0000 (23:01 +0000)
involved in _mesa_textore_argb/rgba8888 (source, base-internal,
destination) differ. _mesa_swizzle_ubyte_image knows only about two of
the formats and can't handle the case that all three are different
correctly. Fixes https://bugs.freedesktop.org/show_bug.cgi?id=3111.

src/mesa/main/texstore.c

index e4c3f6651d69770c0d9d25f157ec883fef4b6542..d46b23c803a4d3d8efd032acfea4be534e1f9a13 100644 (file)
@@ -1079,6 +1079,12 @@ _mesa_texstore_rgba8888(STORE_PARAMS)
            srcType == GL_UNSIGNED_BYTE && 
            dstFormat == &_mesa_texformat_rgba8888 &&
            littleEndian &&
+           /* Three texture formats involved: srcFormat,
+            * baseInternalFormat and destFormat (GL_RGBA). Only two
+            * may differ. _mesa_swizzle_ubyte_image can't handle two
+            * propagations at once correctly. */
+           (srcFormat == baseInternalFormat ||
+            baseInternalFormat == GL_RGBA) &&
            can_swizzle(srcFormat)) {
       GLubyte dstmap[4];
 
@@ -1252,6 +1258,12 @@ _mesa_texstore_argb8888(STORE_PARAMS)
            dstFormat == &_mesa_texformat_argb8888 &&
            srcType == GL_UNSIGNED_BYTE && 
            littleEndian &&
+           /* Three texture formats involved: srcFormat,
+            * baseInternalFormat and destFormat (GL_RGBA). Only two
+            * may differ. _mesa_swizzle_ubyte_image can't handle two
+            * propagations at once correctly. */
+           (srcFormat == baseInternalFormat ||
+            baseInternalFormat == GL_RGBA) &&
            can_swizzle(srcFormat)) {
 
       GLubyte dstmap[4];