From d4fcf67a3ac78c29448000486dadc2b4b1b2a56d Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Tue, 22 Nov 2011 15:05:25 +0800 Subject: [PATCH] mesa: add MESA_FORMAT_RGBX8888 and MESA_FORMAT_RGBX8888_REV 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 [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 | 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 080392f2bca..2f051dfa4bc 100644 --- a/src/mesa/main/format_unpack.c +++ b/src/mesa/main/format_unpack.c @@ -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; diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c index b934bd4d8c4..b9871aec883 100644 --- a/src/mesa/main/formats.c +++ b/src/mesa/main/formats.c @@ -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; diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h index b2cb750aa94..5f601862b32 100644 --- a/src/mesa/main/formats.h +++ b/src/mesa/main/formats.h @@ -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 */ diff --git a/src/mesa/main/texstore.c b/src/mesa/main/texstore.c index aae6b4b3b9b..6deeb642ede 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 196433d5e23..b11245bebea 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 a854c3efd24..bfa7da79d67 100644 --- a/src/mesa/swrast/s_texfetch.c +++ b/src/mesa/swrast/s_texfetch.c @@ -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, diff --git a/src/mesa/swrast/s_texfetch_tmp.h b/src/mesa/swrast/s_texfetch_tmp.h index 8b7e930f905..4ee05a5ea5a 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 */ -- 2.30.2