mesa: add MESA_FORMAT_RGBX8888 and MESA_FORMAT_RGBX8888_REV
authorChia-I Wu <olv@lunarg.com>
Tue, 22 Nov 2011 07:05:25 +0000 (15:05 +0800)
committerChia-I Wu <olv@lunarg.com>
Sun, 27 Nov 2011 04:43:24 +0000 (12:43 +0800)
MESA_FORMAT_RGBX8888_REV is one of the opaque pixel formats used on Android.
Thanks to texture-from-pixmap, drivers may actually see texture images with
this format on Android.

MESA_FORMAT_RGBX8888 is added only for completeness.

Reviewed-by: Brian Paul <brianp@vmware.com>
[olv: Move the new formats after MESA_FORMAT_ARGB8888_REV in gl_format.  I
      accidentally moved them to the wrong place when preparing the patch.]

src/mesa/main/format_unpack.c
src/mesa/main/formats.c
src/mesa/main/formats.h
src/mesa/main/texstore.c
src/mesa/state_tracker/st_format.c
src/mesa/swrast/s_texfetch.c
src/mesa/swrast/s_texfetch_tmp.h

index 080392f2bcace7c98843089750c5dd7083da0922..2f051dfa4bc2a214076270838a26c7de1cd8414d 100644 (file)
@@ -112,6 +112,32 @@ unpack_ARGB8888_REV(const void *src, GLfloat dst[][4], GLuint n)
    }
 }
 
+static void
+unpack_RGBX8888(const void *src, GLfloat dst[][4], GLuint n)
+{
+   const GLuint *s = ((const GLuint *) src);
+   GLuint i;
+   for (i = 0; i < n; i++) {
+      dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i] >> 24)        );
+      dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
+      dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
+      dst[i][ACOMP] = 1.0f;
+   }
+}
+
+static void
+unpack_RGBX8888_REV(const void *src, GLfloat dst[][4], GLuint n)
+{
+   const GLuint *s = ((const GLuint *) src);
+   GLuint i;
+   for (i = 0; i < n; i++) {
+      dst[i][RCOMP] = UBYTE_TO_FLOAT( (s[i]      ) & 0xff );
+      dst[i][GCOMP] = UBYTE_TO_FLOAT( (s[i] >>  8) & 0xff );
+      dst[i][BCOMP] = UBYTE_TO_FLOAT( (s[i] >> 16) & 0xff );
+      dst[i][ACOMP] = 1.0f;
+   }
+}
+
 static void
 unpack_XRGB8888(const void *src, GLfloat dst[][4], GLuint n)
 {
@@ -1405,6 +1431,8 @@ get_unpack_rgba_function(gl_format format)
       table[MESA_FORMAT_RGBA8888_REV] = unpack_RGBA8888_REV;
       table[MESA_FORMAT_ARGB8888] = unpack_ARGB8888;
       table[MESA_FORMAT_ARGB8888_REV] = unpack_ARGB8888_REV;
+      table[MESA_FORMAT_RGBX8888] = unpack_RGBX8888;
+      table[MESA_FORMAT_RGBX8888_REV] = unpack_RGBX8888_REV;
       table[MESA_FORMAT_XRGB8888] = unpack_XRGB8888;
       table[MESA_FORMAT_XRGB8888_REV] = unpack_XRGB8888_REV;
       table[MESA_FORMAT_RGB888] = unpack_RGB888;
index b934bd4d8c43417946071ddef2a8a9310af88de6..b9871aec8833a4e9c8e6226478ae017806f11d89 100644 (file)
@@ -122,6 +122,24 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
       1, 1, 4                      /* BlockWidth/Height,Bytes */
    },
+   {
+      MESA_FORMAT_RGBX8888,        /* Name */
+      "MESA_FORMAT_RGBX8888",      /* StrName */
+      GL_RGB,                      /* BaseFormat */
+      GL_UNSIGNED_NORMALIZED,      /* DataType */
+      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
+      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
+      1, 1, 4                      /* BlockWidth/Height,Bytes */
+   },
+   {
+      MESA_FORMAT_RGBX8888_REV,    /* Name */
+      "MESA_FORMAT_RGBX8888_REV",  /* StrName */
+      GL_RGB,                      /* BaseFormat */
+      GL_UNSIGNED_NORMALIZED,      /* DataType */
+      8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
+      0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
+      1, 1, 4                      /* BlockWidth/Height,Bytes */
+   },
    {
       MESA_FORMAT_XRGB8888,        /* Name */
       "MESA_FORMAT_XRGB8888",      /* StrName */
@@ -1987,6 +2005,8 @@ _mesa_format_to_type_and_comps(gl_format format,
    case MESA_FORMAT_RGBA8888_REV:
    case MESA_FORMAT_ARGB8888:
    case MESA_FORMAT_ARGB8888_REV:
+   case MESA_FORMAT_RGBX8888:
+   case MESA_FORMAT_RGBX8888_REV:
    case MESA_FORMAT_XRGB8888:
    case MESA_FORMAT_XRGB8888_REV:
       *datatype = GL_UNSIGNED_BYTE;
@@ -2492,6 +2512,10 @@ _mesa_format_matches_format_and_type(gl_format gl_format,
       return ((format == GL_BGRA && (type == GL_UNSIGNED_INT_8_8_8_8 ||
                                     (type == GL_UNSIGNED_BYTE && !littleEndian))));
 
+   case MESA_FORMAT_RGBX8888:
+   case MESA_FORMAT_RGBX8888_REV:
+      return GL_FALSE;
+
    case MESA_FORMAT_XRGB8888:
    case MESA_FORMAT_XRGB8888_REV:
       return GL_FALSE;
index b2cb750aa941538e7c68fa514f16d7dee6298b5f..5f601862b321d5dcd3a4d79156756b48134252d6 100644 (file)
@@ -63,6 +63,8 @@ typedef enum
    MESA_FORMAT_RGBA8888_REV,   /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
    MESA_FORMAT_ARGB8888,       /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
    MESA_FORMAT_ARGB8888_REV,   /* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
+   MESA_FORMAT_RGBX8888,       /* RRRR RRRR GGGG GGGG BBBB BBBB XXXX XXXX */
+   MESA_FORMAT_RGBX8888_REV,   /* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
    MESA_FORMAT_XRGB8888,       /* xxxx xxxx RRRR RRRR GGGG GGGG BBBB BBBB */
    MESA_FORMAT_XRGB8888_REV,   /* BBBB BBBB GGGG GGGG RRRR RRRR xxxx xxxx */
    MESA_FORMAT_RGB888,         /*           RRRR RRRR GGGG GGGG BBBB BBBB */
index aae6b4b3b9bfa5593226748f16d456d2aa224cbe..6deeb642ede68c100df5f5a8ab02869225c20d17 100644 (file)
@@ -1265,12 +1265,15 @@ _mesa_texstore_rgba8888(TEXSTORE_PARAMS)
    const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
 
    ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
-          dstFormat == MESA_FORMAT_RGBA8888_REV);
+          dstFormat == MESA_FORMAT_RGBA8888_REV ||
+          dstFormat == MESA_FORMAT_RGBX8888 ||
+          dstFormat == MESA_FORMAT_RGBX8888_REV);
    ASSERT(texelBytes == 4);
 
    if (!ctx->_ImageTransferState &&
        !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_RGBA8888 &&
+      (dstFormat == MESA_FORMAT_RGBA8888 ||
+       dstFormat == MESA_FORMAT_RGBX8888) &&
        baseInternalFormat == GL_RGBA &&
       ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
        (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
@@ -1285,7 +1288,8 @@ _mesa_texstore_rgba8888(TEXSTORE_PARAMS)
    }
    else if (!ctx->_ImageTransferState &&
        !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_RGBA8888_REV &&
+      (dstFormat == MESA_FORMAT_RGBA8888_REV ||
+       dstFormat == MESA_FORMAT_RGBX8888_REV) &&
        baseInternalFormat == GL_RGBA &&
       ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
        (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
@@ -1309,8 +1313,10 @@ _mesa_texstore_rgba8888(TEXSTORE_PARAMS)
 
       /* dstmap - how to swizzle from RGBA to dst format:
        */
-      if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) ||
-         (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) {
+      if ((littleEndian && (dstFormat == MESA_FORMAT_RGBA8888 ||
+                            dstFormat == MESA_FORMAT_RGBX8888)) ||
+         (!littleEndian && (dstFormat == MESA_FORMAT_RGBA8888_REV ||
+                            dstFormat == MESA_FORMAT_RGBX8888_REV))) {
         dstmap[3] = 0;
         dstmap[2] = 1;
         dstmap[1] = 2;
@@ -1351,7 +1357,8 @@ _mesa_texstore_rgba8888(TEXSTORE_PARAMS)
             + dstXoffset * texelBytes;
          for (row = 0; row < srcHeight; row++) {
             GLuint *dstUI = (GLuint *) dstRow;
-            if (dstFormat == MESA_FORMAT_RGBA8888) {
+            if (dstFormat == MESA_FORMAT_RGBA8888 ||
+                dstFormat == MESA_FORMAT_RGBX8888) {
                for (col = 0; col < srcWidth; col++) {
                   dstUI[col] = PACK_COLOR_8888( src[RCOMP],
                                                 src[GCOMP],
@@ -4281,6 +4288,8 @@ _mesa_get_texstore_func(gl_format format)
       table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888;
       table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888;
       table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888;
+      table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888;
+      table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888;
       table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888;
       table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888;
       table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888;
index 196433d5e23357eaca274bd4ef2e617638ce75f7..b11245bebead57a186320e1c745a273e2e5734c2 100644 (file)
@@ -162,6 +162,10 @@ st_mesa_format_to_pipe_format(gl_format mesaFormat)
       return PIPE_FORMAT_B8G8R8A8_UNORM;
    case MESA_FORMAT_ARGB8888_REV:
       return PIPE_FORMAT_A8R8G8B8_UNORM;
+   case MESA_FORMAT_RGBX8888:
+      return PIPE_FORMAT_X8B8G8R8_UNORM;
+   case MESA_FORMAT_RGBX8888_REV:
+      return PIPE_FORMAT_R8G8B8X8_UNORM;
    case MESA_FORMAT_XRGB8888:
       return PIPE_FORMAT_B8G8R8X8_UNORM;
    case MESA_FORMAT_XRGB8888_REV:
@@ -476,6 +480,10 @@ st_pipe_format_to_mesa_format(enum pipe_format format)
       return MESA_FORMAT_ARGB8888;
    case PIPE_FORMAT_A8R8G8B8_UNORM:
       return MESA_FORMAT_ARGB8888_REV;
+   case PIPE_FORMAT_X8B8G8R8_UNORM:
+      return MESA_FORMAT_RGBX8888;
+   case PIPE_FORMAT_R8G8B8X8_UNORM:
+      return MESA_FORMAT_RGBX8888_REV;
    case PIPE_FORMAT_B8G8R8X8_UNORM:
       return MESA_FORMAT_XRGB8888;
    case PIPE_FORMAT_X8R8G8B8_UNORM:
index a854c3efd24c54924c5bb8e9d4d83589344a7c62..bfa7da79d677698067caa47015e1a0e42f5daa5c 100644 (file)
@@ -164,6 +164,20 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
       fetch_texel_3d_f_argb8888_rev,
       store_texel_argb8888_rev
    },
+   {
+      MESA_FORMAT_RGBX8888,
+      fetch_texel_1d_f_rgbx8888,
+      fetch_texel_2d_f_rgbx8888,
+      fetch_texel_3d_f_rgbx8888,
+      store_texel_rgbx8888
+   },
+   {
+      MESA_FORMAT_RGBX8888_REV,
+      fetch_texel_1d_f_rgbx8888_rev,
+      fetch_texel_2d_f_rgbx8888_rev,
+      fetch_texel_3d_f_rgbx8888_rev,
+      store_texel_rgbx8888_rev,
+   },
    {
       MESA_FORMAT_XRGB8888,
       fetch_texel_1d_f_xrgb8888,
index 8b7e930f905d323a3a7ae18aea64c396b01840e0..4ee05a5ea5a2915abe83a4681a42dccdf9f323e6 100644 (file)
@@ -646,6 +646,54 @@ static void store_texel_argb8888_rev(struct swrast_texture_image *texImage,
 #endif
 
 
+/* MESA_FORMAT_RGBX8888 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rgbx8888 texture, return 4 GLfloats */
+static void FETCH(f_rgbx8888)( const struct swrast_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
+   texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
+   texel[BCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
+   texel[ACOMP] = 1.0f;
+}
+
+#if DIM == 3
+static void store_texel_rgbx8888(struct swrast_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], 0xff);
+}
+#endif
+
+
+/* MESA_FORMAT_RGBX888_REV ***************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rgbx8888_rev texture, return 4 GLchans */
+static void FETCH(f_rgbx8888_rev)( const struct swrast_texture_image *texImage,
+                                   GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
+   texel[GCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
+   texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
+   texel[ACOMP] = 1.0f;
+}
+
+#if DIM == 3
+static void store_texel_rgbx8888_rev(struct swrast_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888_REV(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], 0xff);
+}
+#endif
+
+
 /* MESA_FORMAT_XRGB8888 ******************************************************/
 
 /* Fetch texel from 1D, 2D or 3D xrgb8888 texture, return 4 GLchans */