[Mesa-dev] [PATCH] mesa: add MESA_FORMAT_RGBX8888 and MESA_FORMAT_RGBX8888_REV

Chia-I Wu olvaffe at gmail.com
Thu Nov 24 19:24:46 PST 2011


From: Chia-I Wu <olv at lunarg.com>

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.
---
 src/mesa/main/format_unpack.c      |   28 +++++++++++++++++++++
 src/mesa/main/formats.c            |   24 ++++++++++++++++++
 src/mesa/main/formats.h            |    2 +
 src/mesa/main/texstore.c           |   21 +++++++++++----
 src/mesa/state_tracker/st_format.c |    8 ++++++
 src/mesa/swrast/s_texfetch.c       |   14 ++++++++++
 src/mesa/swrast/s_texfetch_tmp.h   |   48 ++++++++++++++++++++++++++++++++++++
 7 files changed, 139 insertions(+), 6 deletions(-)

diff --git a/src/mesa/main/format_unpack.c b/src/mesa/main/format_unpack.c
index 080392f..2f051df 100644
--- a/src/mesa/main/format_unpack.c
+++ b/src/mesa/main/format_unpack.c
@@ -113,6 +113,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)
 {
    const GLuint *s = ((const GLuint *) src);
@@ -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;
diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index b934bd4..b9871ae 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -123,6 +123,24 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
       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 */
       GL_RGB,                      /* BaseFormat */
@@ -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;
diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
index b2cb750..0867338 100644
--- a/src/mesa/main/formats.h
+++ b/src/mesa/main/formats.h
@@ -61,6 +61,8 @@ typedef enum
 				/* ---- ---- ---- ---- ---- ---- ---- ---- */
    MESA_FORMAT_RGBA8888,	/* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
    MESA_FORMAT_RGBA8888_REV,	/* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
+   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_ARGB8888,	/* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
    MESA_FORMAT_ARGB8888_REV,	/* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
    MESA_FORMAT_XRGB8888,	/* xxxx xxxx RRRR RRRR GGGG GGGG BBBB BBBB */
diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c
index aae6b4b..6deeb64 100644
--- a/src/mesa/main/texstore.c
+++ b/src/mesa/main/texstore.c
@@ -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;
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index 196433d..b11245b 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -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:
diff --git a/src/mesa/swrast/s_texfetch.c b/src/mesa/swrast/s_texfetch.c
index a854c3e..bfa7da7 100644
--- a/src/mesa/swrast/s_texfetch.c
+++ b/src/mesa/swrast/s_texfetch.c
@@ -165,6 +165,20 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
       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,
       fetch_texel_2d_f_xrgb8888,
diff --git a/src/mesa/swrast/s_texfetch_tmp.h b/src/mesa/swrast/s_texfetch_tmp.h
index 8b7e930..4ee05a5 100644
--- a/src/mesa/swrast/s_texfetch_tmp.h
+++ b/src/mesa/swrast/s_texfetch_tmp.h
@@ -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 */
-- 
1.7.7.1



More information about the mesa-dev mailing list