mesa: Fix A1R5G5B5 packing/unpacking
[mesa.git] / src / mesa / main / formats.h
index 185010e029cea0fdc8c9e270261aa27c70a364ca..d0959906b3ebfdc2bffef2cbf88e2a3cb86db00e 100644 (file)
@@ -35,6 +35,7 @@
 
 #include <GL/gl.h>
 #include <stdbool.h>
+#include <stdint.h>
 
 
 #ifdef __cplusplus
@@ -56,6 +57,29 @@ extern "C" {
  */
 #define MAX_PIXEL_BYTES 16
 
+/**
+ * Specifies the layout of a pixel format.  See the MESA_FORMAT
+ * documentation below.
+ */
+enum mesa_format_layout {
+   MESA_FORMAT_LAYOUT_ARRAY,
+   MESA_FORMAT_LAYOUT_PACKED,
+   MESA_FORMAT_LAYOUT_OTHER,
+};
+
+/**
+ * An enum representing different possible swizzling values.  This is used
+ * to interpret the output of _mesa_get_format_swizzle
+ */
+enum {
+   MESA_FORMAT_SWIZZLE_X = 0,
+   MESA_FORMAT_SWIZZLE_Y = 1,
+   MESA_FORMAT_SWIZZLE_Z = 2,
+   MESA_FORMAT_SWIZZLE_W = 3,
+   MESA_FORMAT_SWIZZLE_ZERO = 4,
+   MESA_FORMAT_SWIZZLE_ONE = 5,
+   MESA_FORMAT_SWIZZLE_NONE = 6,
+};
 
 /**
  * Mesa texture/renderbuffer image formats.
@@ -115,9 +139,9 @@ typedef enum
     *   ** when type applies to all components
     *
     *  examples:                   msb <------ TEXEL BITS -----------> lsb
-    *  MESA_FORMAT_A8B8G8R8_UNORM, AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR
-    *  MESA_FORMAT_R5G6B5_UNORM                        RRRR RGGG GGGB BBBB
-    *  MESA_FORMAT_B4G4R4X4_UNORM                      BBBB GGGG RRRR XXXX
+    *  MESA_FORMAT_A8B8G8R8_UNORM, RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA
+    *  MESA_FORMAT_R5G6B5_UNORM                        BBBB BGGG GGGR RRRR
+    *  MESA_FORMAT_B4G4R4X4_UNORM                      XXXX RRRR GGGG BBBB
     *  MESA_FORMAT_Z32_FLOAT_S8X24_UINT
     *  MESA_FORMAT_R10G10B10A2_UINT
     *  MESA_FORMAT_R9G9B9E5_FLOAT
@@ -211,8 +235,6 @@ typedef enum
    MESA_FORMAT_YCBCR,            /*                     YYYY YYYY UorV UorV */
    MESA_FORMAT_YCBCR_REV,        /*                     UorV UorV YYYY YYYY */
 
-   MESA_FORMAT_DUDV8,            /*                     DUDU DUDU DVDV DVDV */
-
    /* Array unorm formats */
    MESA_FORMAT_A_UNORM8,      /* ubyte[i] = A */
    MESA_FORMAT_A_UNORM16,     /* ushort[i] = A */
@@ -243,6 +265,7 @@ typedef enum
    MESA_FORMAT_R8G8_SNORM,       /*                     GGGG GGGG RRRR RRRR */
    MESA_FORMAT_G8R8_SNORM,       /*                     RRRR RRRR GGGG GGGG */
    MESA_FORMAT_L8A8_SNORM,       /*                     AAAA AAAA LLLL LLLL */
+   MESA_FORMAT_A8L8_SNORM,       /*                     LLLL LLLL AAAA AAAA */
 
    /* Array signed/normalized formats */
    MESA_FORMAT_A_SNORM8,      /* byte[i] = A */
@@ -261,10 +284,14 @@ typedef enum
    /* Packed sRGB 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_A8R8G8B8_SRGB,    /* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
    MESA_FORMAT_B8G8R8X8_SRGB,    /* xxxx xxxx RRRR RRRR GGGG GGGG BBBB BBBB */
+   MESA_FORMAT_X8R8G8B8_SRGB,    /* BBBB BBBB GGGG GGGG RRRR RRRR xxxx xxxx */
    MESA_FORMAT_R8G8B8A8_SRGB,    /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
    MESA_FORMAT_R8G8B8X8_SRGB,    /* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
+   MESA_FORMAT_X8B8G8R8_SRGB,    /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
    MESA_FORMAT_L8A8_SRGB,                            /* AAAA AAAA LLLL LLLL */
+   MESA_FORMAT_A8L8_SRGB,                            /* LLLL LLLL AAAA AAAA */
 
    /* Array sRGB formats */
    MESA_FORMAT_L_SRGB8,       /* ubyte[i] = L */
@@ -405,6 +432,12 @@ typedef enum
    MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,
    MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,
 
+   /* BPTC compressed formats */
+   MESA_FORMAT_BPTC_RGBA_UNORM,
+   MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM,
+   MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT,
+   MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT,
+
    MESA_FORMAT_COUNT
 } mesa_format;
 
@@ -421,6 +454,9 @@ _mesa_get_format_bits(mesa_format format, GLenum pname);
 extern GLuint
 _mesa_get_format_max_bits(mesa_format format);
 
+extern enum mesa_format_layout
+_mesa_get_format_layout(mesa_format format);
+
 extern GLenum
 _mesa_get_format_datatype(mesa_format format);
 
@@ -430,6 +466,9 @@ _mesa_get_format_base_format(mesa_format format);
 extern void
 _mesa_get_format_block_size(mesa_format format, GLuint *bw, GLuint *bh);
 
+extern void
+_mesa_get_format_swizzle(mesa_format format, uint8_t swizzle_out[4]);
+
 extern GLboolean
 _mesa_is_format_compressed(mesa_format format);
 
@@ -448,6 +487,9 @@ _mesa_is_format_signed(mesa_format format);
 extern GLboolean
 _mesa_is_format_integer(mesa_format format);
 
+extern bool
+_mesa_is_format_etc2(mesa_format format);
+
 extern GLenum
 _mesa_get_format_color_encoding(mesa_format format);