mesa: add MESA_FORMAT_B8G8R8X8_SRGB
authorChia-I Wu <olvaffe@gmail.com>
Tue, 4 Mar 2014 04:18:52 +0000 (12:18 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Thu, 6 Mar 2014 02:59:25 +0000 (10:59 +0800)
The format is needed to represent an RGB-only winsys framebuffer that is
sRGB-capable.

Reviewed-by: Brian Paul <brianp@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

index ee505ec80e30f0282736d86800bda02b98066fd7..b870001d909bec2b600d43b0cc64d0a6707e6162 100644 (file)
@@ -1880,6 +1880,20 @@ pack_float_SIGNED_RG1616(const GLfloat src[4], void *dst)
    *d = (r << 16) | (g & 0xffff);
 }
 
+/*
+ * MESA_FORMAT_B8G8R8X8_SRGB
+ */
+
+static void
+pack_float_XRGB8888_SRGB(const GLfloat src[4], void *dst)
+{
+   GLuint *d = (GLuint *) dst;
+   GLubyte r = linear_float_to_srgb_ubyte(src[RCOMP]);
+   GLubyte g = linear_float_to_srgb_ubyte(src[GCOMP]);
+   GLubyte b = linear_float_to_srgb_ubyte(src[BCOMP]);
+   *d = PACK_COLOR_8888(127, r, g, b);
+}
+
 /**
  * Return a function that can pack a GLubyte rgba[4] color.
  */
@@ -2034,6 +2048,8 @@ _mesa_get_pack_ubyte_rgba_function(mesa_format format)
 
       table[MESA_FORMAT_R10G10B10A2_UNORM] = pack_ubyte_ABGR2101010;
 
+      table[MESA_FORMAT_B8G8R8X8_SRGB] = NULL;
+
       initialized = GL_TRUE;
    }
 
@@ -2197,6 +2213,8 @@ _mesa_get_pack_float_rgba_function(mesa_format format)
       table[MESA_FORMAT_G8R8_SNORM] = pack_float_SIGNED_RG88;
       table[MESA_FORMAT_G16R16_SNORM] = pack_float_SIGNED_RG1616;
 
+      table[MESA_FORMAT_B8G8R8X8_SRGB] = pack_float_XRGB8888_SRGB;
+
       initialized = GL_TRUE;
    }
 
index f9c42e768d6dd375d754ba33d7629a7b95144cfc..1a0e7271c8df974d8e8524f1f5de1ec4ec780196 100644 (file)
@@ -2313,6 +2313,19 @@ unpack_SIGNED_RG1616(const void *src, GLfloat dst[][4], GLuint n)
    }
 }
 
+static void
+unpack_XRGB8888_SRGB(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] >> 16) & 0xff );
+      dst[i][GCOMP] = _mesa_nonlinear_to_linear( (s[i] >>  8) & 0xff );
+      dst[i][BCOMP] = _mesa_nonlinear_to_linear( (s[i]      ) & 0xff );
+      dst[i][ACOMP] = 1.0F;
+   }
+}
+
 /**
  * Return the unpacker function for the given format.
  */
@@ -2530,6 +2543,8 @@ get_unpack_rgba_function(mesa_format format)
       table[MESA_FORMAT_G8R8_SNORM] = unpack_SIGNED_RG88;
       table[MESA_FORMAT_G16R16_SNORM] = unpack_SIGNED_RG1616;
 
+      table[MESA_FORMAT_B8G8R8X8_SRGB] = unpack_XRGB8888_SRGB;
+
       initialized = GL_TRUE;
    }
 
index f6c399ede58c2b55cbd850f44f8abafe99c34025..e0b774e3a44fe65c4de561e30a9f827df231c94a 100644 (file)
@@ -1790,6 +1790,15 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
       0, 0, 0, 0, 0,
       1, 1, 4
    },
+   {
+      MESA_FORMAT_B8G8R8X8_SRGB,
+      "MESA_FORMAT_B8G8R8X8_SRGB",
+      GL_RGB,
+      GL_UNSIGNED_NORMALIZED,
+      8, 8, 8, 0,
+      0, 0, 0, 0, 0,
+      1, 1, 4
+   },
 };
 
 
@@ -2035,6 +2044,7 @@ _mesa_get_format_color_encoding(mesa_format format)
    case MESA_FORMAT_ETC2_SRGB8:
    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
+   case MESA_FORMAT_B8G8R8X8_SRGB:
       return GL_SRGB;
    default:
       return GL_LINEAR;
@@ -2089,6 +2099,9 @@ _mesa_get_srgb_format_linear(mesa_format format)
    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
       format = MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
       break;
+   case MESA_FORMAT_B8G8R8X8_SRGB:
+      format = MESA_FORMAT_B8G8R8X8_UNORM;
+      break;
    default:
       break;
    }
@@ -2895,6 +2908,11 @@ _mesa_format_to_type_and_comps(mesa_format format,
       *comps = 2;
       return;
 
+   case MESA_FORMAT_B8G8R8X8_SRGB:
+      *datatype = GL_UNSIGNED_BYTE;
+      *comps = 4;
+      return;
+
    case MESA_FORMAT_COUNT:
       assert(0);
       return;
@@ -3448,6 +3466,9 @@ _mesa_format_matches_format_and_type(mesa_format mesa_format,
    case MESA_FORMAT_G16R16_SNORM:
       return format == GL_RG && type == GL_SHORT && !littleEndian &&
          !swapBytes;
+
+   case MESA_FORMAT_B8G8R8X8_SRGB:
+      return GL_FALSE;
    }
 
    return GL_FALSE;
index 3102584b6a09be055c8062a9c3481cff092ef329..07b84d6fa423a5ee357a676dbf5e58c956df9f6c 100644 (file)
@@ -333,6 +333,7 @@ typedef enum
     *  R10G10B10A2_UNORM
     *  G8R8_SINT
     *  G16R16_SINT
+    *  B8G8R8X8_SRGB
     *
     */
    /*@{*/
@@ -647,6 +648,8 @@ typedef enum
    MESA_FORMAT_G8R8_SNORM,        /*                     RRRR RRRR GGGG GGGG */
    MESA_FORMAT_G16R16_SNORM,      /* RRRR RRRR RRRR RRRR GGGG GGGG GGGG GGGG */
 
+   MESA_FORMAT_B8G8R8X8_SRGB,     /* xxxx xxxx RRRR RRRR GGGG GGGG BBBB BBBB */
+
    MESA_FORMAT_COUNT
 } mesa_format;
 
index 3e22a0b46f7cf8c949d46636e55780dd58e7050f..edf7e816727f90d4dc7ed9410b991800fee42842 100644 (file)
@@ -3290,10 +3290,17 @@ _mesa_texstore_sargb8(TEXSTORE_PARAMS)
    mesa_format newDstFormat;
    GLboolean k;
 
-   ASSERT(dstFormat == MESA_FORMAT_B8G8R8A8_SRGB);
-
-   /* reuse normal rgba texstore code */
-   newDstFormat = MESA_FORMAT_B8G8R8A8_UNORM;
+   switch (dstFormat) {
+   case MESA_FORMAT_B8G8R8A8_SRGB:
+      newDstFormat = MESA_FORMAT_B8G8R8A8_UNORM;
+      break;
+   case MESA_FORMAT_B8G8R8X8_SRGB:
+      newDstFormat = MESA_FORMAT_B8G8R8X8_UNORM;
+      break;
+   default:
+      ASSERT(0);
+      return GL_FALSE;
+   }
 
    k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
                                newDstFormat,
@@ -3859,6 +3866,8 @@ _mesa_get_texstore_func(mesa_format format)
       table[MESA_FORMAT_G8R8_SNORM] = _mesa_texstore_snorm88;
       table[MESA_FORMAT_G16R16_SNORM] = _mesa_texstore_snorm1616;
 
+      table[MESA_FORMAT_B8G8R8X8_SRGB] = _mesa_texstore_sargb8;
+
       initialized = GL_TRUE;
    }
 
index b620748c93634cf7821fc25a03da77ee2555513c..9c173a8b3dd83d66513a48122eba344e1ae5c68b 100644 (file)
@@ -1304,6 +1304,12 @@ texfetch_funcs[] =
       NULL,
       NULL
    },
+   {
+      MESA_FORMAT_B8G8R8X8_SRGB,
+      NULL,
+      NULL,
+      NULL
+   },
 };