Big-endian texture fixes from Michel Dänzer.
authorBrian Paul <brian.paul@tungstengraphics.com>
Sat, 19 Jun 2004 17:44:23 +0000 (17:44 +0000)
committerBrian Paul <brian.paul@tungstengraphics.com>
Sat, 19 Jun 2004 17:44:23 +0000 (17:44 +0000)
src/mesa/drivers/dri/common/texmem.c
src/mesa/drivers/dri/common/texmem.h
src/mesa/drivers/dri/r128/r128_tex.c
src/mesa/drivers/dri/r128/r128_texstate.c
src/mesa/drivers/dri/r200/r200_tex.c
src/mesa/drivers/dri/r200/r200_texstate.c
src/mesa/drivers/dri/radeon/radeon_tex.c
src/mesa/drivers/dri/radeon/radeon_texstate.c
src/mesa/main/colormac.h
src/mesa/main/teximage.c
src/mesa/main/texstore.c

index c76d3716822c79fa60514bbc635ec85f13111467..48a8f5c74e9459c61dfeab63af2687baf882c45d 100644 (file)
@@ -47,6 +47,7 @@
 #include "simple_list.h"
 #include "imports.h"
 #include "macros.h"
+#include "texformat.h"
 
 #include <assert.h>
 
@@ -64,11 +65,10 @@ static unsigned dummy_swap_counter;
  * \param n Value whose \f$\log_2\f$ is to be calculated
  */
 
-static unsigned
-driLog2( unsigned n )
+static GLuint
+driLog2( GLuint n )
 {
-   unsigned   log2;
-
+   GLuint log2;
 
    for ( log2 = 1 ; n > 1 ; log2++ ) {
       n >>= 1;
@@ -1228,3 +1228,51 @@ driCalculateTextureFirstLastLevel( driTextureObject * t )
    t->firstLevel = firstLevel;
    t->lastLevel = lastLevel;
 }
+
+
+
+
+/**
+ * \name DRI texture formats.  Pointers initialized to either the big- or
+ * little-endian Mesa formats.
+ */
+/*@{*/
+const struct gl_texture_format *_dri_texformat_rgba8888 = NULL;
+const struct gl_texture_format *_dri_texformat_argb8888 = NULL;
+const struct gl_texture_format *_dri_texformat_rgb565 = NULL;
+const struct gl_texture_format *_dri_texformat_argb4444 = NULL;
+const struct gl_texture_format *_dri_texformat_argb1555 = NULL;
+const struct gl_texture_format *_dri_texformat_al88 = NULL;
+const struct gl_texture_format *_dri_texformat_a8 = &_mesa_texformat_a8;
+const struct gl_texture_format *_dri_texformat_ci8 = &_mesa_texformat_ci8;
+const struct gl_texture_format *_dri_texformat_i8 = &_mesa_texformat_i8;
+const struct gl_texture_format *_dri_texformat_l8 = &_mesa_texformat_l8;
+/*@}*/
+
+
+/**
+ * Initialize little endian target, host byte order independent texture formats
+ */
+void
+driInitTextureFormats(void)
+{
+   const GLuint ui = 1;
+   const GLubyte littleEndian = *((const GLubyte *) &ui);
+
+   if (littleEndian) {
+      _dri_texformat_rgba8888  = &_mesa_texformat_rgba8888;
+      _dri_texformat_argb8888  = &_mesa_texformat_argb8888;
+      _dri_texformat_rgb565    = &_mesa_texformat_rgb565;
+      _dri_texformat_argb4444  = &_mesa_texformat_argb4444;
+      _dri_texformat_argb1555  = &_mesa_texformat_argb1555;
+      _dri_texformat_al88      = &_mesa_texformat_al88;
+   }
+   else {
+      _dri_texformat_rgba8888  = &_mesa_texformat_rgba8888_rev;
+      _dri_texformat_argb8888  = &_mesa_texformat_argb8888_rev;
+      _dri_texformat_rgb565    = &_mesa_texformat_rgb565_rev;
+      _dri_texformat_argb4444  = &_mesa_texformat_argb4444_rev;
+      _dri_texformat_argb1555  = &_mesa_texformat_argb1555_rev;
+      _dri_texformat_al88      = &_mesa_texformat_al88_rev;
+   }
+}
index f0c416fc61161d613aba69bd53492b029ed88605..266afd8bb66d3d0664cec6c8fe432c9c4ade7c68 100644 (file)
@@ -293,4 +293,18 @@ GLboolean driValidateTextureHeaps( driTexHeap * const * texture_heaps,
 
 extern void driCalculateTextureFirstLastLevel( driTextureObject * t );
 
+
+extern const struct gl_texture_format *_dri_texformat_rgba8888;
+extern const struct gl_texture_format *_dri_texformat_argb8888;
+extern const struct gl_texture_format *_dri_texformat_rgb565;
+extern const struct gl_texture_format *_dri_texformat_argb4444;
+extern const struct gl_texture_format *_dri_texformat_argb1555;
+extern const struct gl_texture_format *_dri_texformat_al88;
+extern const struct gl_texture_format *_dri_texformat_a8;
+extern const struct gl_texture_format *_dri_texformat_ci8;
+extern const struct gl_texture_format *_dri_texformat_i8;
+extern const struct gl_texture_format *_dri_texformat_l8;
+
+extern void driInitTextureFormats( void );
+
 #endif /* DRI_TEXMEM_H */
index 973048b62277f6823cfb3705f81339b6ca8a96ef..7355c9f3fe1115a4d798facd327b727dc7d6ff5a 100644 (file)
@@ -200,9 +200,9 @@ r128ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_RGBA:
    case GL_COMPRESSED_RGBA:
       if (do32bpt)
-         return &_mesa_texformat_argb8888;
+         return _dri_texformat_argb8888;
       else
-         return &_mesa_texformat_argb4444;
+         return _dri_texformat_argb4444;
 
    /* 16-bit formats with alpha */
    case GL_INTENSITY4:
@@ -210,7 +210,7 @@ r128ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_LUMINANCE4_ALPHA4:
    case GL_RGBA2:
    case GL_RGBA4:
-      return &_mesa_texformat_argb4444;
+      return _dri_texformat_argb4444;
 
    /* 32-bit formats with alpha */
    case GL_INTENSITY8:
@@ -230,9 +230,9 @@ r128ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_RGBA12:
    case GL_RGBA16:
       if (!force16bpt)
-         return &_mesa_texformat_argb8888;
+         return _dri_texformat_argb8888;
       else
-         return &_mesa_texformat_argb4444;
+         return _dri_texformat_argb4444;
 
    /* non-sized formats without alpha */
    case 1:
@@ -242,16 +242,16 @@ r128ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_RGB:
    case GL_COMPRESSED_RGB:
       if (do32bpt)
-         return &_mesa_texformat_argb8888;
+         return _dri_texformat_argb8888;
       else
-         return &_mesa_texformat_rgb565;
+         return _dri_texformat_rgb565;
 
    /* 16-bit formats without alpha */
    case GL_LUMINANCE4:
    case GL_R3_G3_B2:
    case GL_RGB4:
    case GL_RGB5:
-      return &_mesa_texformat_rgb565;
+      return _dri_texformat_rgb565;
 
    /* 32-bit formats without alpha */
    case GL_LUMINANCE8:
@@ -262,9 +262,9 @@ r128ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_RGB12:
    case GL_RGB16:
       if (!force16bpt)
-         return &_mesa_texformat_argb8888;
+         return _dri_texformat_argb8888;
       else
-         return &_mesa_texformat_rgb565;
+         return _dri_texformat_rgb565;
 
    /* color-indexed formats */
    case GL_COLOR_INDEX:
@@ -274,7 +274,7 @@ r128ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_COLOR_INDEX8_EXT:
    case GL_COLOR_INDEX12_EXT:
    case GL_COLOR_INDEX16_EXT:
-      return &_mesa_texformat_ci8;
+      return _dri_texformat_ci8;
 
    case GL_YCBCR_MESA:
       if (type == GL_UNSIGNED_SHORT_8_8_APPLE ||
@@ -612,5 +612,7 @@ void r128InitTextureFuncs( struct dd_function_table *functions )
    functions->NewTextureObject         = r128NewTextureObject;
    functions->DeleteTexture            = r128DeleteTexture;
    functions->IsTextureResident                = driIsTextureResident;
+
+   driInitTextureFormats();
 }
 
index 89eda8acfb3a986b011db513272e80c4c60af22e..c4c9b20fe9bcb40c06e36acebd15b5c688c4ebeb 100644 (file)
@@ -65,12 +65,15 @@ static void r128SetTexImages( r128ContextPtr rmesa,
 
    switch (baseImage->TexFormat->MesaFormat) {
    case MESA_FORMAT_ARGB8888:
+   case MESA_FORMAT_ARGB8888_REV:
       t->textureFormat = R128_DATATYPE_ARGB8888;
       break;
    case MESA_FORMAT_ARGB4444:
+   case MESA_FORMAT_ARGB4444_REV:
       t->textureFormat = R128_DATATYPE_ARGB4444;
       break;
    case MESA_FORMAT_RGB565:
+   case MESA_FORMAT_RGB565_REV:
       t->textureFormat = R128_DATATYPE_RGB565;
       break;
    case MESA_FORMAT_RGB332:
index fd326ad959fa83afcbe012b4d9d516fcdc37a331..20febb508f16e7164eafa408e7f289594b6f2192 100644 (file)
@@ -324,15 +324,15 @@ r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
       switch ( type ) {
       case GL_UNSIGNED_INT_10_10_10_2:
       case GL_UNSIGNED_INT_2_10_10_10_REV:
-        return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb1555;
+        return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_argb1555;
       case GL_UNSIGNED_SHORT_4_4_4_4:
       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-        return &_mesa_texformat_argb4444;
+        return _dri_texformat_argb4444;
       case GL_UNSIGNED_SHORT_5_5_5_1:
       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-        return &_mesa_texformat_argb1555;
+        return _dri_texformat_argb1555;
       default:
-         return do32bpt ? &_mesa_texformat_rgba8888 : &_mesa_texformat_argb4444;
+         return do32bpt ? _dri_texformat_rgba8888 : _dri_texformat_argb4444;
       }
 
    case 3:
@@ -341,15 +341,15 @@ r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
       switch ( type ) {
       case GL_UNSIGNED_SHORT_4_4_4_4:
       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-        return &_mesa_texformat_argb4444;
+        return _dri_texformat_argb4444;
       case GL_UNSIGNED_SHORT_5_5_5_1:
       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-        return &_mesa_texformat_argb1555;
+        return _dri_texformat_argb1555;
       case GL_UNSIGNED_SHORT_5_6_5:
       case GL_UNSIGNED_SHORT_5_6_5_REV:
-        return &_mesa_texformat_rgb565;
+        return _dri_texformat_rgb565;
       default:
-         return do32bpt ? &_mesa_texformat_rgba8888 : &_mesa_texformat_rgb565;
+         return do32bpt ? _dri_texformat_rgba8888 : _dri_texformat_rgb565;
       }
 
    case GL_RGBA8:
@@ -357,25 +357,25 @@ r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_RGBA12:
    case GL_RGBA16:
       return !force16bpt ?
-         &_mesa_texformat_rgba8888 : &_mesa_texformat_argb4444;
+         _dri_texformat_rgba8888 : _dri_texformat_argb4444;
 
    case GL_RGBA4:
    case GL_RGBA2:
-      return &_mesa_texformat_argb4444;
+      return _dri_texformat_argb4444;
 
    case GL_RGB5_A1:
-      return &_mesa_texformat_argb1555;
+      return _dri_texformat_argb1555;
 
    case GL_RGB8:
    case GL_RGB10:
    case GL_RGB12:
    case GL_RGB16:
-      return !force16bpt ? &_mesa_texformat_rgba8888 : &_mesa_texformat_rgb565;
+      return !force16bpt ? _dri_texformat_rgba8888 : _dri_texformat_rgb565;
 
    case GL_RGB5:
    case GL_RGB4:
    case GL_R3_G3_B2:
-      return &_mesa_texformat_rgb565;
+      return _dri_texformat_rgb565;
 
    case GL_ALPHA:
    case GL_ALPHA4:
@@ -383,7 +383,7 @@ r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_ALPHA12:
    case GL_ALPHA16:
    case GL_COMPRESSED_ALPHA:
-      return &_mesa_texformat_a8;
+      return _dri_texformat_a8;
 
    case 1:
    case GL_LUMINANCE:
@@ -392,7 +392,7 @@ r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_LUMINANCE12:
    case GL_LUMINANCE16:
    case GL_COMPRESSED_LUMINANCE:
-      return &_mesa_texformat_l8;
+      return _dri_texformat_l8;
 
    case 2:
    case GL_LUMINANCE_ALPHA:
@@ -403,7 +403,7 @@ r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_LUMINANCE12_ALPHA12:
    case GL_LUMINANCE16_ALPHA16:
    case GL_COMPRESSED_LUMINANCE_ALPHA:
-      return &_mesa_texformat_al88;
+      return _dri_texformat_al88;
 
    case GL_INTENSITY:
    case GL_INTENSITY4:
@@ -411,11 +411,11 @@ r200ChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_INTENSITY12:
    case GL_INTENSITY16:
    case GL_COMPRESSED_INTENSITY:
-       return &_mesa_texformat_i8;
+       return _dri_texformat_i8;
 
    case GL_YCBCR_MESA:
       if (type == GL_UNSIGNED_SHORT_8_8_APPLE ||
-         type == GL_UNSIGNED_BYTE)
+          type == GL_UNSIGNED_BYTE)
          return &_mesa_texformat_ycbcr;
       else
          return &_mesa_texformat_ycbcr_rev;
@@ -461,7 +461,7 @@ r200ValidateClientStorage( GLcontext *ctx, GLenum target,
    switch ( internalFormat ) {
    case GL_RGBA:
       if ( format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV ) {
-        texImage->TexFormat = &_mesa_texformat_argb8888;
+        texImage->TexFormat = _dri_texformat_argb8888;
       }
       else
         return 0;
@@ -469,7 +469,7 @@ r200ValidateClientStorage( GLcontext *ctx, GLenum target,
 
    case GL_RGB:
       if ( format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 ) {
-        texImage->TexFormat = &_mesa_texformat_rgb565;
+        texImage->TexFormat = _dri_texformat_rgb565;
       }
       else
         return 0;
@@ -1034,6 +1034,8 @@ void r200InitTextureFuncs( struct dd_function_table *functions )
    functions->TexParameter             = r200TexParameter;
    functions->TexGen                   = r200TexGen;
 
+   driInitTextureFormats();
+
 #if 000
    /* moved or obsolete code */
    r200ContextPtr rmesa = R200_CONTEXT(ctx);
index 08791ff78814628774544e5b33ee05b7ade6e795..cde801b0abf2b78d14677a50f0d519800e095a6c 100644 (file)
@@ -56,8 +56,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define _COLOR(f) \
     [ MESA_FORMAT_ ## f ] = { R200_TXFORMAT_ ## f, 0 }
+#define _COLOR_REV(f) \
+    [ MESA_FORMAT_ ## f ## _REV ] = { R200_TXFORMAT_ ## f, 0 }
 #define _ALPHA(f) \
     [ MESA_FORMAT_ ## f ] = { R200_TXFORMAT_ ## f | R200_TXFORMAT_ALPHA_IN_MAP, 0 }
+#define _ALPHA_REV(f) \
+    [ MESA_FORMAT_ ## f ## _REV ] = { R200_TXFORMAT_ ## f | R200_TXFORMAT_ALPHA_IN_MAP, 0 }
 #define _YUV(f) \
     [ MESA_FORMAT_ ## f ] = { R200_TXFORMAT_ ## f, R200_YUV_TO_RGB }
 #define _INVALID(f) \
@@ -71,12 +75,18 @@ static const struct {
 tx_table[] =
 {
    _ALPHA(RGBA8888),
+   _ALPHA_REV(RGBA8888),
    _ALPHA(ARGB8888),
+   _ALPHA_REV(ARGB8888),
    _INVALID(RGB888),
    _COLOR(RGB565),
+   _COLOR_REV(RGB565),
    _ALPHA(ARGB4444),
+   _ALPHA_REV(ARGB4444),
    _ALPHA(ARGB1555),
+   _ALPHA_REV(ARGB1555),
    _ALPHA(AL88),
+   _ALPHA_REV(AL88),
    _ALPHA(A8),
    _COLOR(L8),
    _ALPHA(I8),
index cb5073d3ccb460efe51c7977d4490fda3aed5c21..82b5d940f88888f732e651e38b30ed25178489f6 100644 (file)
@@ -286,15 +286,15 @@ radeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
       switch ( type ) {
       case GL_UNSIGNED_INT_10_10_10_2:
       case GL_UNSIGNED_INT_2_10_10_10_REV:
-        return do32bpt ? &_mesa_texformat_argb8888 : &_mesa_texformat_argb1555;
+        return do32bpt ? _dri_texformat_argb8888 : _dri_texformat_argb1555;
       case GL_UNSIGNED_SHORT_4_4_4_4:
       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-        return &_mesa_texformat_argb4444;
+        return _dri_texformat_argb4444;
       case GL_UNSIGNED_SHORT_5_5_5_1:
       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-        return &_mesa_texformat_argb1555;
+        return _dri_texformat_argb1555;
       default:
-         return do32bpt ? &_mesa_texformat_rgba8888 : &_mesa_texformat_argb4444;
+         return do32bpt ? _dri_texformat_rgba8888 : _dri_texformat_argb4444;
       }
 
    case 3:
@@ -303,15 +303,15 @@ radeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
       switch ( type ) {
       case GL_UNSIGNED_SHORT_4_4_4_4:
       case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-        return &_mesa_texformat_argb4444;
+        return _dri_texformat_argb4444;
       case GL_UNSIGNED_SHORT_5_5_5_1:
       case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-        return &_mesa_texformat_argb1555;
+        return _dri_texformat_argb1555;
       case GL_UNSIGNED_SHORT_5_6_5:
       case GL_UNSIGNED_SHORT_5_6_5_REV:
-        return &_mesa_texformat_rgb565;
+        return _dri_texformat_rgb565;
       default:
-         return do32bpt ? &_mesa_texformat_rgba8888 : &_mesa_texformat_rgb565;
+         return do32bpt ? _dri_texformat_rgba8888 : _dri_texformat_rgb565;
       }
 
    case GL_RGBA8:
@@ -319,25 +319,25 @@ radeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_RGBA12:
    case GL_RGBA16:
       return !force16bpt ?
-         &_mesa_texformat_rgba8888 : &_mesa_texformat_argb4444;
+         _dri_texformat_rgba8888 : _dri_texformat_argb4444;
 
    case GL_RGBA4:
    case GL_RGBA2:
-      return &_mesa_texformat_argb4444;
+      return _dri_texformat_argb4444;
 
    case GL_RGB5_A1:
-      return &_mesa_texformat_argb1555;
+      return _dri_texformat_argb1555;
 
    case GL_RGB8:
    case GL_RGB10:
    case GL_RGB12:
    case GL_RGB16:
-      return !force16bpt ? &_mesa_texformat_rgba8888 : &_mesa_texformat_rgb565;
+      return !force16bpt ? _dri_texformat_rgba8888 : _dri_texformat_rgb565;
 
    case GL_RGB5:
    case GL_RGB4:
    case GL_R3_G3_B2:
-      return &_mesa_texformat_rgb565;
+      return _dri_texformat_rgb565;
 
    case GL_ALPHA:
    case GL_ALPHA4:
@@ -345,7 +345,7 @@ radeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_ALPHA12:
    case GL_ALPHA16:
    case GL_COMPRESSED_ALPHA:
-      return &_mesa_texformat_a8;
+      return _dri_texformat_a8;
 
    case 1:
    case GL_LUMINANCE:
@@ -354,7 +354,7 @@ radeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_LUMINANCE12:
    case GL_LUMINANCE16:
    case GL_COMPRESSED_LUMINANCE:
-      return &_mesa_texformat_l8;
+      return _dri_texformat_l8;
 
    case 2:
    case GL_LUMINANCE_ALPHA:
@@ -365,7 +365,7 @@ radeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_LUMINANCE12_ALPHA12:
    case GL_LUMINANCE16_ALPHA16:
    case GL_COMPRESSED_LUMINANCE_ALPHA:
-      return &_mesa_texformat_al88;
+      return _dri_texformat_al88;
 
    case GL_INTENSITY:
    case GL_INTENSITY4:
@@ -373,7 +373,7 @@ radeonChooseTextureFormat( GLcontext *ctx, GLint internalFormat,
    case GL_INTENSITY12:
    case GL_INTENSITY16:
    case GL_COMPRESSED_INTENSITY:
-      return &_mesa_texformat_i8;
+      return _dri_texformat_i8;
 
    case GL_YCBCR_MESA:
       if (type == GL_UNSIGNED_SHORT_8_8_APPLE ||
@@ -755,4 +755,6 @@ void radeonInitTextureFuncs( struct dd_function_table *functions )
    functions->TexEnv                   = radeonTexEnv;
    functions->TexParameter             = radeonTexParameter;
    functions->TexGen                   = radeonTexGen;
+
+   driInitTextureFormats();
 }
index 1ec4e7dce32678e667f686c0eff241f005ef35f0..d17d9db4ac48568f4e5a379aafba42ad9bbd7ea5 100644 (file)
@@ -58,8 +58,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 #define _COLOR(f) \
     [ MESA_FORMAT_ ## f ] = { RADEON_TXFORMAT_ ## f, 0 }
+#define _COLOR_REV(f) \
+    [ MESA_FORMAT_ ## f ## _REV ] = { RADEON_TXFORMAT_ ## f, 0 }
 #define _ALPHA(f) \
     [ MESA_FORMAT_ ## f ] = { RADEON_TXFORMAT_ ## f | RADEON_TXFORMAT_ALPHA_IN_MAP, 0 }
+#define _ALPHA_REV(f) \
+    [ MESA_FORMAT_ ## f ## _REV ] = { RADEON_TXFORMAT_ ## f | RADEON_TXFORMAT_ALPHA_IN_MAP, 0 }
 #define _YUV(f) \
    [ MESA_FORMAT_ ## f ] = { RADEON_TXFORMAT_ ## f, RADEON_YUV_TO_RGB }
 #define _INVALID(f) \
@@ -73,12 +77,18 @@ static const struct {
 tx_table[] =
 {
    _ALPHA(RGBA8888),
+   _ALPHA_REV(RGBA8888),
    _ALPHA(ARGB8888),
+   _ALPHA_REV(ARGB8888),
    _INVALID(RGB888),
    _COLOR(RGB565),
+   _COLOR_REV(RGB565),
    _ALPHA(ARGB4444),
+   _ALPHA_REV(ARGB4444),
    _ALPHA(ARGB1555),
+   _ALPHA_REV(ARGB1555),
    _ALPHA(AL88),
+   _ALPHA_REV(AL88),
    _ALPHA(A8),
    _COLOR(L8),
    _ALPHA(I8),
index 9b67fa19e4c8350f9fddb1add302fe3b4b61667b..62b80136e9ee026fec196bee330d6ca8f09482df 100644 (file)
@@ -183,28 +183,38 @@ do {                                              \
 #define PACK_COLOR_8888( R, G, B, A )                                  \
    (((R) << 24) | ((G) << 16) | ((B) << 8) | (A))
 
+#define PACK_COLOR_8888_REV( R, G, B, A )                              \
+   (((A) << 24) | ((B) << 16) | ((G) << 8) | (R))
+
 #define PACK_COLOR_888( R, G, B )                                      \
    (((R) << 16) | ((G) << 8) | (B))
 
 #define PACK_COLOR_565( R, G, B )                                      \
    ((((R) & 0xf8) << 8) | (((G) & 0xfc) << 3) | (((B) & 0xf8) >> 3))
 
+#define PACK_COLOR_565_REV( R, G, B )                                  \
+   (((R) & 0xf8) | ((G) & 0xe0) >> 5 | (((G) & 0x1c) << 11) | (((B) & 0xf8) << 5))
+
 #define PACK_COLOR_1555( A, B, G, R )                                  \
    ((((B) & 0xf8) << 7) | (((G) & 0xf8) << 2) | (((R) & 0xf8) >> 3) |  \
     ((A) ? 0x8000 : 0))
 
-#define PACK_COLOR_5551( R, G, B, A )                                  \
-   ((((B) & 0xf8) << 8) |                                              \
-    (((G) & 0xf8) << 3) |                                              \
-    (((R) & 0xf8) >> 2) |                                              \
-    (((A) & 0x80) >> 7))
+#define PACK_COLOR_1555_REV( A, B, G, R )                                      \
+   ((((B) & 0xf8) >> 1) | (((G) & 0xc0) >> 6) | (((G) & 0x38) << 10) | (((R) & 0xf8) << 5) |   \
+    ((A) ? 0x80 : 0))
 
 #define PACK_COLOR_4444( R, G, B, A )                                  \
    ((((R) & 0xf0) << 8) | (((G) & 0xf0) << 4) | ((B) & 0xf0) | ((A) >> 4))
 
+#define PACK_COLOR_4444_REV( R, G, B, A )                              \
+   ((((B) & 0xf0) << 8) | (((A) & 0xf0) << 4) | ((R) & 0xf0) | ((G) >> 4))
+
 #define PACK_COLOR_88( L, A )                                          \
    (((L) << 8) | (A))
 
+#define PACK_COLOR_88_REV( L, A )                                      \
+   (((A) << 8) | (L))
+
 #define PACK_COLOR_332( R, G, B )                                      \
    (((R) & 0xe0) | (((G) & 0xe0) >> 3) | (((B) & 0xc0) >> 6))
 
index aa6494a0c5fb7e76eb0178d9a80357e98db691c5..d11b6e46094a90df58c65c16f427dd3b78ad53db 100644 (file)
@@ -365,6 +365,7 @@ is_color_format(GLenum format)
       case GL_RGB12:
       case GL_RGB16:
       case 4:
+      case GL_ABGR_EXT:
       case GL_RGBA:
       case GL_BGRA:
       case GL_RGBA2:
index 574066ecdd36e9fa6473cbb104ee3b027fd607c3..c5f39c445366628dfc53c988dd65ebb213a41f5a 100644 (file)
@@ -828,13 +828,18 @@ _mesa_texstore_rgb565(STORE_PARAMS)
       for (row = 0; row < srcHeight; row++) {
          const GLubyte *srcUB = (const GLubyte *) src;
          GLushort *dstUS = (GLushort *) dst;
-         for (col = 0; col < srcWidth; col++) {
-            dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
-            srcUB += 3;
-         }
          /* check for byteswapped format */
-         if (dstFormat == &_mesa_texformat_rgb565_rev) {
-            _mesa_swap2(dstUS, srcWidth);
+         if (dstFormat == &_mesa_texformat_rgb565) {
+            for (col = 0; col < srcWidth; col++) {
+               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
+               srcUB += 3;
+            }
+         }
+         else {
+            for (col = 0; col < srcWidth; col++) {
+               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
+               srcUB += 3;
+            }
          }
          dst += dstRowStride;
          src += srcRowStride;
@@ -861,15 +866,22 @@ _mesa_texstore_rgb565(STORE_PARAMS)
          GLubyte *dstRow = dstImage;
          for (row = 0; row < srcHeight; row++) {
             GLushort *dstUS = (GLushort *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[RCOMP]),
-                                            CHAN_TO_UBYTE(src[GCOMP]),
-                                            CHAN_TO_UBYTE(src[BCOMP]) );
-               src += 3;
-            }
             /* check for byteswapped format */
-            if (dstFormat == &_mesa_texformat_rgb565_rev) {
-               _mesa_swap2(dstUS, srcWidth);
+            if (dstFormat == &_mesa_texformat_rgb565) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[RCOMP]),
+                                               CHAN_TO_UBYTE(src[GCOMP]),
+                                               CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 3;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_565_REV( CHAN_TO_UBYTE(src[RCOMP]),
+                                                   CHAN_TO_UBYTE(src[GCOMP]),
+                                                   CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 3;
+               }
             }
             dstRow += dstRowStride;
          }
@@ -921,16 +933,23 @@ _mesa_texstore_rgba8888(STORE_PARAMS)
          GLubyte *dstRow = dstImage;
          for (row = 0; row < srcHeight; row++) {
             GLuint *dstUI = (GLuint *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[RCOMP]),
-                                             CHAN_TO_UBYTE(src[GCOMP]),
-                                             CHAN_TO_UBYTE(src[BCOMP]),
-                                             CHAN_TO_UBYTE(src[ACOMP]) );
-               src += 4;
+            if (dstFormat == &_mesa_texformat_rgba8888) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]),
+                                                CHAN_TO_UBYTE(src[ACOMP]) );
+                  src += 4;
+               }
             }
-            /* check for byteswapped format */
-            if (dstFormat == &_mesa_texformat_rgba8888_rev) {
-               _mesa_swap4(dstUI, srcWidth);
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[RCOMP]),
+                                                    CHAN_TO_UBYTE(src[GCOMP]),
+                                                    CHAN_TO_UBYTE(src[BCOMP]),
+                                                    CHAN_TO_UBYTE(src[ACOMP]) );
+                  src += 4;
+               }
             }
             dstRow += dstRowStride;
          }
@@ -999,15 +1018,23 @@ _mesa_texstore_argb8888(STORE_PARAMS)
          GLubyte *dstRow = dstImage;
          for (row = 0; row < srcHeight; row++) {
             GLuint *dstUI = (GLuint *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]),
-                                             CHAN_TO_UBYTE(src[RCOMP]),
-                                             CHAN_TO_UBYTE(src[GCOMP]),
-                                             CHAN_TO_UBYTE(src[BCOMP]) );
-               src += 4;
+            if (dstFormat == &_mesa_texformat_argb8888) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]),
+                                                CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
             }
-            if (dstFormat == &_mesa_texformat_argb8888_rev) {
-               _mesa_swap4(dstUI, srcWidth);
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[ACOMP]),
+                                                    CHAN_TO_UBYTE(src[RCOMP]),
+                                                    CHAN_TO_UBYTE(src[GCOMP]),
+                                                    CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
             }
             dstRow += dstRowStride;
          }
@@ -1248,15 +1275,23 @@ _mesa_texstore_argb4444(STORE_PARAMS)
          GLubyte *dstRow = dstImage;
          for (row = 0; row < srcHeight; row++) {
             GLushort *dstUS = (GLushort *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[ACOMP]),
-                                             CHAN_TO_UBYTE(src[RCOMP]),
-                                             CHAN_TO_UBYTE(src[GCOMP]),
-                                             CHAN_TO_UBYTE(src[BCOMP]) );
-               src += 4;
+            if (dstFormat == &_mesa_texformat_argb4444) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[ACOMP]),
+                                                CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
             }
-            if (dstFormat == &_mesa_texformat_argb4444_rev) {
-               _mesa_swap2(dstUS, srcWidth);
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_4444_REV( CHAN_TO_UBYTE(src[ACOMP]),
+                                                    CHAN_TO_UBYTE(src[RCOMP]),
+                                                    CHAN_TO_UBYTE(src[GCOMP]),
+                                                    CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
             }
             dstRow += dstRowStride;
          }
@@ -1309,15 +1344,23 @@ _mesa_texstore_argb1555(STORE_PARAMS)
          GLubyte *dstRow = dstImage;
          for (row = 0; row < srcHeight; row++) {
             GLushort *dstUS = (GLushort *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               dstUS[col] = PACK_COLOR_1555( CHAN_TO_UBYTE(src[ACOMP]),
-                                             CHAN_TO_UBYTE(src[RCOMP]),
-                                             CHAN_TO_UBYTE(src[GCOMP]),
-                                             CHAN_TO_UBYTE(src[BCOMP]) );
-               src += 4;
+            if (dstFormat == &_mesa_texformat_argb1555) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_1555( CHAN_TO_UBYTE(src[ACOMP]),
+                                                CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
             }
-            if (dstFormat == &_mesa_texformat_argb1555_rev) {
-               _mesa_swap2(dstUS, srcWidth);
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_1555_REV( CHAN_TO_UBYTE(src[ACOMP]),
+                                                    CHAN_TO_UBYTE(src[RCOMP]),
+                                                    CHAN_TO_UBYTE(src[GCOMP]),
+                                                    CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
             }
             dstRow += dstRowStride;
          }
@@ -1373,14 +1416,21 @@ _mesa_texstore_al88(STORE_PARAMS)
          GLubyte *dstRow = dstImage;
          for (row = 0; row < srcHeight; row++) {
             GLushort *dstUS = (GLushort *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               /* src[0] is luminance, src[1] is alpha */
-               dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[1]),
-                                           CHAN_TO_UBYTE(src[0]) );
-               src += 2;
+            if (dstFormat == &_mesa_texformat_al88) {
+               for (col = 0; col < srcWidth; col++) {
+                  /* src[0] is luminance, src[1] is alpha */
+                 dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[1]),
+                                             CHAN_TO_UBYTE(src[0]) );
+                 src += 2;
+               }
             }
-            if (dstFormat == &_mesa_texformat_al88_rev) {
-               _mesa_swap2(dstUS, srcWidth);
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  /* src[0] is luminance, src[1] is alpha */
+                 dstUS[col] = PACK_COLOR_88_REV( CHAN_TO_UBYTE(src[1]),
+                                                 CHAN_TO_UBYTE(src[0]) );
+                 src += 2;
+               }
             }
             dstRow += dstRowStride;
          }