mesa: Fix A1R5G5B5 packing/unpacking
authorJason Ekstrand <jason.ekstrand@intel.com>
Sat, 23 Aug 2014 03:32:27 +0000 (20:32 -0700)
committerIago Toral Quiroga <itoral@igalia.com>
Mon, 12 Jan 2015 10:20:27 +0000 (11:20 +0100)
As with B5G6R5, these have been left broken with comments saying they are.

Signed-off-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Jason Ekstrand <jason.ekstrand@intel.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
src/mesa/main/format_pack.c
src/mesa/main/format_unpack.c
src/mesa/main/formats.c
src/mesa/swrast/s_texfetch_tmp.h

index 20d2b1a4821e7908eecc7931605b2e27e31928a1..3d191c186f2fc9a983faf5736d737832b915a170 100644 (file)
@@ -584,17 +584,11 @@ pack_float_B5G5R5A1_UNORM(const GLfloat src[4], void *dst)
    pack_ubyte_B5G5R5A1_UNORM(v, dst);
 }
 
-
-/* MESA_FORMAT_A1R5G5B5_UNORM
- * Warning: these functions do not match the current Mesa definition
- * of MESA_FORMAT_A1R5G5B5_UNORM.
- */
-
 static void
 pack_ubyte_A1R5G5B5_UNORM(const GLubyte src[4], void *dst)
 {
    GLushort *d = ((GLushort *) dst), tmp;
-   tmp = PACK_COLOR_1555(src[ACOMP], src[RCOMP], src[GCOMP], src[BCOMP]);
+   tmp = PACK_COLOR_5551(src[BCOMP], src[GCOMP], src[RCOMP], src[ACOMP]);
    *d = (tmp >> 8) | (tmp << 8);
 }
 
index 69c76d354c737169b3cc35de80bff8677fae55d3..dfc5024dd482bb1c3020144079f75f198618716f 100644 (file)
@@ -2830,17 +2830,14 @@ unpack_ubyte_B5G5R5A1_UNORM(const void *src, GLubyte dst[][4], GLuint n)
 static void
 unpack_ubyte_A1R5G5B5_UNORM(const void *src, GLubyte dst[][4], GLuint n)
 {
-   /* Warning: this function does not match the current Mesa definition
-    * of MESA_FORMAT_A1R5G5B5_UNORM.
-    */
    const GLushort *s = ((const GLushort *) src);
    GLuint i;
    for (i = 0; i < n; i++) {
       GLushort tmp = (s[i] << 8) | (s[i] >> 8); /* byteswap */
-      dst[i][RCOMP] = EXPAND_5_8((tmp >> 10) & 0x1f);
-      dst[i][GCOMP] = EXPAND_5_8((tmp >>  5) & 0x1f);
-      dst[i][BCOMP] = EXPAND_5_8((tmp >>  0) & 0x1f);
-      dst[i][ACOMP] = EXPAND_1_8((tmp >> 15) & 0x01);
+      dst[i][RCOMP] = EXPAND_5_8((tmp >>  1) & 0x1f);
+      dst[i][GCOMP] = EXPAND_5_8((tmp >>  6) & 0x1f);
+      dst[i][BCOMP] = EXPAND_5_8((tmp >> 11) & 0x1f);
+      dst[i][ACOMP] = EXPAND_1_8((tmp      ) & 0x01);
    }
 }
 
index 1315d368c271d7f1c00b3940e7f4c8f84ae5caa9..676ac2781ae57599b3fca139be76f9ee75ddbb3b 100644 (file)
@@ -1487,7 +1487,8 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
          !swapBytes;
 
    case MESA_FORMAT_A1R5G5B5_UNORM:
-      return GL_FALSE;
+      return format == GL_BGRA && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
+         !swapBytes;
 
    case MESA_FORMAT_L4A4_UNORM:
       return GL_FALSE;
index 23db48d969e1093b1c54ed6d042fd79084d3e2a9..e3a3cfe361a56e0bf1756b18202962c09abddc4b 100644 (file)
@@ -482,10 +482,10 @@ FETCH(A1R5G5B5_UNORM)(const struct swrast_texture_image *texImage,
 {
    const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
    const GLushort s = (*src << 8) | (*src >> 8); /* byteswap */
-   texel[RCOMP] = UBYTE_TO_FLOAT( ((s >>  7) & 0xf8) | ((s >> 12) & 0x7) );
-   texel[GCOMP] = UBYTE_TO_FLOAT( ((s >>  2) & 0xf8) | ((s >>  7) & 0x7) );
-   texel[BCOMP] = UBYTE_TO_FLOAT( ((s <<  3) & 0xf8) | ((s >>  2) & 0x7) );
-   texel[ACOMP] = UBYTE_TO_FLOAT( ((s >> 15) & 0x01) * 255 );
+   texel[RCOMP] = ((s >>  1) & 0x1f) * (1.0F / 31.0F);
+   texel[GCOMP] = ((s >>  6) & 0x1f) * (1.0F / 31.0F);
+   texel[BCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F);
+   texel[ACOMP] = ((s      ) & 0x01) * 1.0F;
 }