mesa: add MESA_FORMAT_R8G8B8A8_SRGB
authorBrian Paul <brianp@vmware.com>
Thu, 6 Mar 2014 17:56:27 +0000 (10:56 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 7 Mar 2014 01:17:14 +0000 (18:17 -0700)
To match PIPE_FORMAT_R8G8B8A8_SRGB.
v2: fix component name copy&paste bugs

Reviewed-by: José Fonseca <jfonseca@vmware.com>
Reviewed-by: Roland Scheidegger <sroland@vmware.com>
src/mesa/main/format_pack.c
src/mesa/main/format_unpack.c
src/mesa/main/formats.c
src/mesa/main/formats.h
src/mesa/main/texstore.c
src/mesa/swrast/s_texfetch.c
src/mesa/swrast/s_texfetch_tmp.h

index 89958f79ff5df016d022b6edd5ea776138a374ec..acab6cb8d00c9f4ba8d3b82b0c9742858460b6ab 100644 (file)
@@ -1108,6 +1108,31 @@ pack_float_SARGB8(const GLfloat src[4], void *dst)
 }
 
 
+/* MESA_FORMAT_R8G8B8A8_SRGB */
+
+static void
+pack_ubyte_SABGR8(const GLubyte src[4], void *dst)
+{
+   GLuint *d = ((GLuint *) dst);
+   GLubyte r = linear_ubyte_to_srgb_ubyte(src[RCOMP]);
+   GLubyte g = linear_ubyte_to_srgb_ubyte(src[GCOMP]);
+   GLubyte b = linear_ubyte_to_srgb_ubyte(src[BCOMP]);
+   *d = PACK_COLOR_8888(src[ACOMP], b, g, r);
+}
+
+static void
+pack_float_SABGR8(const GLfloat src[4], void *dst)
+{
+   GLuint *d = ((GLuint *) dst);
+   GLubyte r, g, b, a;
+   r = linear_float_to_srgb_ubyte(src[RCOMP]);
+   g = linear_float_to_srgb_ubyte(src[GCOMP]);
+   b = linear_float_to_srgb_ubyte(src[BCOMP]);
+   UNCLAMPED_FLOAT_TO_UBYTE(a, src[ACOMP]);
+   *d = PACK_COLOR_8888(a, b, g, r);
+}
+
+
 /* MESA_FORMAT_L_SRGB8 */
 
 static void
@@ -1961,6 +1986,7 @@ _mesa_get_pack_ubyte_rgba_function(mesa_format format)
       table[MESA_FORMAT_BGR_SRGB8] = pack_ubyte_SRGB8;
       table[MESA_FORMAT_A8B8G8R8_SRGB] = pack_ubyte_SRGBA8;
       table[MESA_FORMAT_B8G8R8A8_SRGB] = pack_ubyte_SARGB8;
+      table[MESA_FORMAT_R8G8B8A8_SRGB] = pack_ubyte_SABGR8;
       table[MESA_FORMAT_L_SRGB8] = pack_ubyte_SL8;
       table[MESA_FORMAT_L8A8_SRGB] = pack_ubyte_SLA8;
       /* n/a */
@@ -2125,6 +2151,7 @@ _mesa_get_pack_float_rgba_function(mesa_format format)
       table[MESA_FORMAT_BGR_SRGB8] = pack_float_SRGB8;
       table[MESA_FORMAT_A8B8G8R8_SRGB] = pack_float_SRGBA8;
       table[MESA_FORMAT_B8G8R8A8_SRGB] = pack_float_SARGB8;
+      table[MESA_FORMAT_R8G8B8A8_SRGB] = pack_float_SABGR8;
       table[MESA_FORMAT_L_SRGB8] = pack_float_SL8;
       table[MESA_FORMAT_L8A8_SRGB] = pack_float_SLA8;
 
index 1a0e7271c8df974d8e8524f1f5de1ec4ec780196..2348ef60583cd7b0127585d69aa69be6d5822ccd 100644 (file)
@@ -796,6 +796,19 @@ unpack_SARGB8(const void *src, GLfloat dst[][4], GLuint n)
    }
 }
 
+static void
+unpack_SABGR8(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] = _mesa_nonlinear_to_linear( (s[i]      ) & 0xff );
+      dst[i][GCOMP] = _mesa_nonlinear_to_linear( (s[i] >>  8) & 0xff );
+      dst[i][BCOMP] = _mesa_nonlinear_to_linear( (s[i] >> 16) & 0xff );
+      dst[i][ACOMP] = UBYTE_TO_FLOAT( s[i] >> 24 ); /* linear! */
+   }
+}
+
 static void
 unpack_SL8(const void *src, GLfloat dst[][4], GLuint n)
 {
@@ -2388,6 +2401,7 @@ get_unpack_rgba_function(mesa_format format)
       table[MESA_FORMAT_BGR_SRGB8] = unpack_SRGB8;
       table[MESA_FORMAT_A8B8G8R8_SRGB] = unpack_SRGBA8;
       table[MESA_FORMAT_B8G8R8A8_SRGB] = unpack_SARGB8;
+      table[MESA_FORMAT_R8G8B8A8_SRGB] = unpack_SABGR8;
       table[MESA_FORMAT_L_SRGB8] = unpack_SL8;
       table[MESA_FORMAT_L8A8_SRGB] = unpack_SLA8;
       table[MESA_FORMAT_SRGB_DXT1] = unpack_SRGB_DXT1;
index e0b774e3a44fe65c4de561e30a9f827df231c94a..0cf97fa316b38cc2a807362213ed26755da8c7ba 100644 (file)
@@ -519,6 +519,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
       0, 0, 0, 0, 0,
       1, 1, 4
    },
+   {
+      MESA_FORMAT_R8G8B8A8_SRGB,
+      "MESA_FORMAT_R8G8B8A8_SRGB",
+      GL_RGBA,
+      GL_UNSIGNED_NORMALIZED,    
+      8, 8, 8, 8,
+      0, 0, 0, 0, 0,
+      1, 1, 4
+   },
    {
       MESA_FORMAT_L_SRGB8,
       "MESA_FORMAT_L_SRGB8",
@@ -2034,6 +2043,7 @@ _mesa_get_format_color_encoding(mesa_format format)
    case MESA_FORMAT_BGR_SRGB8:
    case MESA_FORMAT_A8B8G8R8_SRGB:
    case MESA_FORMAT_B8G8R8A8_SRGB:
+   case MESA_FORMAT_R8G8B8A8_SRGB:
    case MESA_FORMAT_L_SRGB8:
    case MESA_FORMAT_L8A8_SRGB:
    case MESA_FORMAT_SRGB_DXT1:
@@ -2069,6 +2079,9 @@ _mesa_get_srgb_format_linear(mesa_format format)
    case MESA_FORMAT_B8G8R8A8_SRGB:
       format = MESA_FORMAT_B8G8R8A8_UNORM;
       break;
+   case MESA_FORMAT_R8G8B8A8_SRGB:
+      format = MESA_FORMAT_R8G8B8A8_UNORM;
+      break;
    case MESA_FORMAT_L_SRGB8:
       format = MESA_FORMAT_L_UNORM8;
       break;
@@ -2576,6 +2589,7 @@ _mesa_format_to_type_and_comps(mesa_format format,
       return;
    case MESA_FORMAT_A8B8G8R8_SRGB:
    case MESA_FORMAT_B8G8R8A8_SRGB:
+   case MESA_FORMAT_R8G8B8A8_SRGB:
       *datatype = GL_UNSIGNED_BYTE;
       *comps = 4;
       return;
@@ -2985,6 +2999,7 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
       return GL_FALSE;
 
    case MESA_FORMAT_R8G8B8A8_UNORM:
+   case MESA_FORMAT_R8G8B8A8_SRGB:
       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
           !swapBytes)
          return GL_TRUE;
index 07b84d6fa423a5ee357a676dbf5e58c956df9f6c..a12fe4f087a76cd967cd00d884a1014513ec0f59 100644 (file)
@@ -419,6 +419,7 @@ typedef enum
    /* Type P formats */
    MESA_FORMAT_A8B8G8R8_SRGB,    /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
    MESA_FORMAT_B8G8R8A8_SRGB,    /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
+   MESA_FORMAT_R8G8B8A8_SRGB,    /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
 
    /* Type A format(s) */
    MESA_FORMAT_L_SRGB8,       /* uchar[i] = L */
index edf7e816727f90d4dc7ed9410b991800fee42842..557703d015d6c414122f4db64baee1e0e71dfc9e 100644 (file)
@@ -3294,6 +3294,9 @@ _mesa_texstore_sargb8(TEXSTORE_PARAMS)
    case MESA_FORMAT_B8G8R8A8_SRGB:
       newDstFormat = MESA_FORMAT_B8G8R8A8_UNORM;
       break;
+   case MESA_FORMAT_R8G8B8A8_SRGB:
+      newDstFormat = MESA_FORMAT_R8G8B8A8_UNORM;
+      break;
    case MESA_FORMAT_B8G8R8X8_SRGB:
       newDstFormat = MESA_FORMAT_B8G8R8X8_UNORM;
       break;
index 9c173a8b3dd83d66513a48122eba344e1ae5c68b..8ba75348ff701906914229e2b6f15fa258474cb8 100644 (file)
@@ -436,6 +436,12 @@ texfetch_funcs[] =
       fetch_texel_2d_sargb8,
       fetch_texel_3d_sargb8
    },
+   {
+      MESA_FORMAT_R8G8B8A8_SRGB,
+      fetch_texel_1d_sabgr8,
+      fetch_texel_2d_sabgr8,
+      fetch_texel_3d_sabgr8
+   },
    {
       MESA_FORMAT_L_SRGB8,
       fetch_texel_1d_sl8,
index 1db3adc7114d57a842659353fb14419b9804e60c..8821125a0e12eee56bf65af08577013a25cb7fd7 100644 (file)
@@ -1015,6 +1015,19 @@ static void FETCH(sargb8)(const struct swrast_texture_image *texImage,
 
 
 
+/* Fetch texel from 1D, 2D or 3D sabgr8 texture, return 4 GLfloats */
+static void FETCH(sabgr8)(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] = nonlinear_to_linear( (s      ) & 0xff );
+   texel[GCOMP] = nonlinear_to_linear( (s >>  8) & 0xff );
+   texel[BCOMP] = nonlinear_to_linear( (s >> 16) & 0xff );
+   texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) ); /* linear! */
+}
+
+
+
 /* Fetch texel from 1D, 2D or 3D sl8 texture, return 4 GLfloats */
 static void FETCH(sl8)(const struct swrast_texture_image *texImage,
                        GLint i, GLint j, GLint k, GLfloat *texel )