Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  5.  * Copyright (c) 2008-2009  VMware, Inc.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  21.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  22.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  23.  * OTHER DEALINGS IN THE SOFTWARE.
  24.  */
  25.  
  26. /*
  27.  * Authors:
  28.  *   Brian Paul
  29.  */
  30.  
  31.  
  32. #ifndef FORMATS_H
  33. #define FORMATS_H
  34.  
  35.  
  36. #include <GL/gl.h>
  37. #include <stdbool.h>
  38. #include <stdint.h>
  39. #include "compiler.h"
  40.  
  41. #ifdef __cplusplus
  42. extern "C" {
  43. #endif
  44.  
  45.  
  46. /**
  47.  * OpenGL doesn't have GL_UNSIGNED_BYTE_4_4, so we must define our own type
  48.  * for GL_LUMINANCE4_ALPHA4.
  49.  */
  50. #define MESA_UNSIGNED_BYTE_4_4 (GL_UNSIGNED_BYTE<<1)
  51.  
  52.  
  53. /**
  54.  * Max number of bytes for any non-compressed pixel format below, or for
  55.  * intermediate pixel storage in Mesa.  This should never be less than
  56.  * 16.  Maybe 32 someday?
  57.  */
  58. #define MAX_PIXEL_BYTES 16
  59.  
  60. /**
  61.  * Specifies the layout of a pixel format.  See the MESA_FORMAT
  62.  * documentation below.
  63.  */
  64. enum mesa_format_layout {
  65.    MESA_FORMAT_LAYOUT_ARRAY,
  66.    MESA_FORMAT_LAYOUT_PACKED,
  67.    MESA_FORMAT_LAYOUT_OTHER,
  68. };
  69.  
  70. /**
  71.  * An enum representing different possible swizzling values.  This is used
  72.  * to interpret the output of _mesa_get_format_swizzle
  73.  */
  74. enum {
  75.    MESA_FORMAT_SWIZZLE_X = 0,
  76.    MESA_FORMAT_SWIZZLE_Y = 1,
  77.    MESA_FORMAT_SWIZZLE_Z = 2,
  78.    MESA_FORMAT_SWIZZLE_W = 3,
  79.    MESA_FORMAT_SWIZZLE_ZERO = 4,
  80.    MESA_FORMAT_SWIZZLE_ONE = 5,
  81.    MESA_FORMAT_SWIZZLE_NONE = 6,
  82. };
  83.  
  84. /**
  85.  * An uint32_t that encodes the information necessary to represent an
  86.  * array format
  87.  */
  88. typedef uint32_t mesa_array_format;
  89.  
  90. /**
  91.  * Encoding for valid array format data types
  92.  */
  93. enum mesa_array_format_datatype {
  94.    MESA_ARRAY_FORMAT_TYPE_UBYTE = 0x0,
  95.    MESA_ARRAY_FORMAT_TYPE_USHORT = 0x1,
  96.    MESA_ARRAY_FORMAT_TYPE_UINT = 0x2,
  97.    MESA_ARRAY_FORMAT_TYPE_BYTE = 0x4,
  98.    MESA_ARRAY_FORMAT_TYPE_SHORT = 0x5,
  99.    MESA_ARRAY_FORMAT_TYPE_INT = 0x6,
  100.    MESA_ARRAY_FORMAT_TYPE_HALF = 0xd,
  101.    MESA_ARRAY_FORMAT_TYPE_FLOAT = 0xe,
  102. };
  103.  
  104. /**
  105.  * An enum useful to encode/decode information stored in a mesa_array_format
  106.  */
  107. enum {
  108.    MESA_ARRAY_FORMAT_TYPE_IS_SIGNED = 0x4,
  109.    MESA_ARRAY_FORMAT_TYPE_IS_FLOAT = 0x8,
  110.    MESA_ARRAY_FORMAT_TYPE_NORMALIZED = 0x10,
  111.    MESA_ARRAY_FORMAT_DATATYPE_MASK = 0xf,
  112.    MESA_ARRAY_FORMAT_TYPE_MASK = 0x1f,
  113.    MESA_ARRAY_FORMAT_TYPE_SIZE_MASK = 0x3,
  114.    MESA_ARRAY_FORMAT_NUM_CHANS_MASK = 0xe0,
  115.    MESA_ARRAY_FORMAT_SWIZZLE_X_MASK = 0x00700,
  116.    MESA_ARRAY_FORMAT_SWIZZLE_Y_MASK = 0x03800,
  117.    MESA_ARRAY_FORMAT_SWIZZLE_Z_MASK = 0x1c000,
  118.    MESA_ARRAY_FORMAT_SWIZZLE_W_MASK = 0xe0000,
  119.    MESA_ARRAY_FORMAT_BIT = 0x80000000
  120. };
  121.  
  122. #define MESA_ARRAY_FORMAT(SIZE, SIGNED, IS_FLOAT, NORM, NUM_CHANS, \
  123.       SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W) (                \
  124.    (((SIZE >> 1)      ) & MESA_ARRAY_FORMAT_TYPE_SIZE_MASK) |      \
  125.    (((SIGNED)    << 2 ) & MESA_ARRAY_FORMAT_TYPE_IS_SIGNED) |      \
  126.    (((IS_FLOAT)  << 3 ) & MESA_ARRAY_FORMAT_TYPE_IS_FLOAT) |       \
  127.    (((NORM)      << 4 ) & MESA_ARRAY_FORMAT_TYPE_NORMALIZED) |     \
  128.    (((NUM_CHANS) << 5 ) & MESA_ARRAY_FORMAT_NUM_CHANS_MASK) |      \
  129.    (((SWIZZLE_X) << 8 ) & MESA_ARRAY_FORMAT_SWIZZLE_X_MASK) |      \
  130.    (((SWIZZLE_Y) << 11) & MESA_ARRAY_FORMAT_SWIZZLE_Y_MASK) |      \
  131.    (((SWIZZLE_Z) << 14) & MESA_ARRAY_FORMAT_SWIZZLE_Z_MASK) |      \
  132.    (((SWIZZLE_W) << 17) & MESA_ARRAY_FORMAT_SWIZZLE_W_MASK) |      \
  133.    MESA_ARRAY_FORMAT_BIT)
  134.  
  135. /**
  136.  * Various helpers to access the data encoded in a mesa_array_format
  137.  */
  138. static inline bool
  139. _mesa_array_format_is_signed(mesa_array_format f)
  140. {
  141.    return (f & MESA_ARRAY_FORMAT_TYPE_IS_SIGNED) != 0;
  142. }
  143.  
  144. static inline bool
  145. _mesa_array_format_is_float(mesa_array_format f)
  146. {
  147.    return (f & MESA_ARRAY_FORMAT_TYPE_IS_FLOAT) != 0;
  148. }
  149.  
  150. static inline bool
  151. _mesa_array_format_is_normalized(mesa_array_format f)
  152. {
  153.    return (f & MESA_ARRAY_FORMAT_TYPE_NORMALIZED) !=0;
  154. }
  155.  
  156. static inline enum mesa_array_format_datatype
  157. _mesa_array_format_get_datatype(mesa_array_format f)
  158. {
  159.    return (enum mesa_array_format_datatype)
  160.             (f & MESA_ARRAY_FORMAT_DATATYPE_MASK);
  161. }
  162.  
  163. static inline int
  164. _mesa_array_format_datatype_get_size(enum mesa_array_format_datatype type)
  165. {
  166.    return 1 << (type & MESA_ARRAY_FORMAT_TYPE_SIZE_MASK);
  167. }
  168.  
  169. static inline int
  170. _mesa_array_format_get_type_size(mesa_array_format f)
  171. {
  172.    return 1 << (f & MESA_ARRAY_FORMAT_TYPE_SIZE_MASK);
  173. }
  174.  
  175. static inline int
  176. _mesa_array_format_get_num_channels(mesa_array_format f)
  177. {
  178.    return (f & MESA_ARRAY_FORMAT_NUM_CHANS_MASK) >> 5;
  179. }
  180.  
  181. static inline void
  182. _mesa_array_format_get_swizzle(mesa_array_format f, uint8_t *swizzle)
  183. {
  184.    swizzle[0] = (f & MESA_ARRAY_FORMAT_SWIZZLE_X_MASK) >> 8;
  185.    swizzle[1] = (f & MESA_ARRAY_FORMAT_SWIZZLE_Y_MASK) >> 11;
  186.    swizzle[2] = (f & MESA_ARRAY_FORMAT_SWIZZLE_Z_MASK) >> 14;
  187.    swizzle[3] = (f & MESA_ARRAY_FORMAT_SWIZZLE_W_MASK) >> 17;
  188. }
  189.  
  190. static inline void
  191. _mesa_array_format_set_swizzle(mesa_array_format *f,
  192.                                int32_t x, int32_t y, int32_t z, int32_t w)
  193. {
  194.    *f |= ((x << 8 ) & MESA_ARRAY_FORMAT_SWIZZLE_X_MASK) |
  195.          ((y << 11) & MESA_ARRAY_FORMAT_SWIZZLE_Y_MASK) |
  196.          ((z << 14) & MESA_ARRAY_FORMAT_SWIZZLE_Z_MASK) |
  197.          ((w << 17) & MESA_ARRAY_FORMAT_SWIZZLE_W_MASK);
  198. }
  199.  
  200. /**
  201.  * A helper to know if the format stored in a uint32_t is a mesa_format
  202.  * or a mesa_array_format
  203.  */
  204. static inline bool
  205. _mesa_format_is_mesa_array_format(uint32_t f)
  206. {
  207.    return (f & MESA_ARRAY_FORMAT_BIT) != 0;
  208. }
  209.  
  210. /**
  211.  * Mesa texture/renderbuffer image formats.
  212.  */
  213. typedef enum
  214. {
  215.    MESA_FORMAT_NONE = 0,
  216.  
  217.    /**
  218.     * \name Basic hardware formats
  219.     *
  220.     * The mesa format name specification is as follows:
  221.     *
  222.     *  There shall be 3 naming format base types: those for component array
  223.     *  formats (type A); those for compressed formats (type C); and those for
  224.     *  packed component formats (type P). With type A formats, color component
  225.     *  order does not change with endianess. Each format name shall begin with
  226.     *  MESA_FORMAT_, followed by a component label (from the Component Label
  227.     *  list below) for each component in the order that the component(s) occur
  228.     *  in the format, except for non-linear color formats where the first
  229.     *  letter shall be 'S'. For type P formats, each component label is
  230.     *  followed by the number of bits that represent it in the fundamental
  231.     *  data type used by the format.
  232.     *
  233.     *  Following the listing of the component labels shall be an underscore; a
  234.     *  compression type followed by an underscore for Type C formats only; a
  235.     *  storage type from the list below; and a bit with for type A formats,
  236.     *  which is the bit width for each array element.
  237.     *
  238.     *
  239.     *  ----------    Format Base Type A: Array ----------
  240.     *  MESA_FORMAT_[component list]_[storage type][array element bit width]
  241.     *
  242.     *  examples:
  243.     *  MESA_FORMAT_A_SNORM8     - uchar[i] = A
  244.     *  MESA_FORMAT_RGBA_16 - ushort[i * 4 + 0] = R, ushort[i * 4 + 1] = G,
  245.     *                             ushort[i * 4 + 2] = B, ushort[i * 4 + 3] = A
  246.     *  MESA_FORMAT_Z_UNORM32    - float[i] = Z
  247.     *
  248.     *
  249.     *
  250.     *  ----------    Format Base Type C: Compressed ----------
  251.     *  MESA_FORMAT_[component list*][_*][compression type][storage type*]
  252.     *  * where required
  253.     *
  254.     *  examples:
  255.     *  MESA_FORMAT_RGB_ETC1
  256.     *  MESA_FORMAT_RGBA_ETC2
  257.     *  MESA_FORMAT_LATC1_UNORM
  258.     *  MESA_FORMAT_RGBA_FXT1
  259.     *
  260.     *
  261.     *
  262.     *  ----------    Format Base Type P: Packed  ----------
  263.     *  MESA_FORMAT_[[component list,bit width][storage type*][_]][_][storage type**]
  264.     *   * when type differs between component
  265.     *   ** when type applies to all components
  266.     *
  267.     *  examples:                   msb <------ TEXEL BITS -----------> lsb
  268.     *  MESA_FORMAT_A8B8G8R8_UNORM, RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA
  269.     *  MESA_FORMAT_R5G6B5_UNORM                        BBBB BGGG GGGR RRRR
  270.     *  MESA_FORMAT_B4G4R4X4_UNORM                      XXXX RRRR GGGG BBBB
  271.     *  MESA_FORMAT_Z32_FLOAT_S8X24_UINT
  272.     *  MESA_FORMAT_R10G10B10A2_UINT
  273.     *  MESA_FORMAT_R9G9B9E5_FLOAT
  274.     *
  275.     *
  276.     *
  277.     *  ----------    Component Labels: ----------
  278.     *  A - Alpha
  279.     *  B - Blue
  280.     *  DU - Delta U
  281.     *  DV - Delta V
  282.     *  E - Shared Exponent
  283.     *  G - Green
  284.     *  I - Intensity
  285.     *  L - Luminance
  286.     *  R - Red
  287.     *  S - Stencil (when not followed by RGB or RGBA)
  288.     *  U - Chrominance
  289.     *  V - Chrominance
  290.     *  Y - Luma
  291.     *  X - Packing bits
  292.     *  Z - Depth
  293.     *
  294.     *
  295.     *
  296.     *  ----------    Type C Compression Types: ----------
  297.     *  DXT1 - Color component labels shall be given
  298.     *  DXT3 - Color component labels shall be given
  299.     *  DXT5 - Color component labels shall be given
  300.     *  ETC1 - No other information required
  301.     *  ETC2 - No other information required
  302.     *  FXT1 - Color component labels shall be given
  303.     *  FXT3 - Color component labels shall be given
  304.     *  LATC1 - Fundamental data type shall be given
  305.     *  LATC2 - Fundamental data type shall be given
  306.     *  RGTC1 - Color component labels and data type shall be given
  307.     *  RGTC2 - Color component labels and data type shall be given
  308.     *
  309.     *
  310.     *
  311.     *  ----------    Storage Types: ----------
  312.     *  FLOAT
  313.     *  SINT
  314.     *  UINT
  315.     *  SNORM
  316.     *  UNORM
  317.     *  SRGB - RGB components, or L are UNORMs in sRGB color space.
  318.     *         Alpha, if present is linear.
  319.     *
  320.     */
  321.  
  322.    /* Packed unorm formats */    /* msb <------ TEXEL BITS -----------> lsb */
  323.                                  /* ---- ---- ---- ---- ---- ---- ---- ---- */
  324.    MESA_FORMAT_A8B8G8R8_UNORM,   /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
  325.    MESA_FORMAT_X8B8G8R8_UNORM,   /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
  326.    MESA_FORMAT_R8G8B8A8_UNORM,   /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
  327.    MESA_FORMAT_R8G8B8X8_UNORM,   /* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
  328.    MESA_FORMAT_B8G8R8A8_UNORM,   /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
  329.    MESA_FORMAT_B8G8R8X8_UNORM,   /* xxxx xxxx RRRR RRRR GGGG GGGG BBBB BBBB */
  330.    MESA_FORMAT_A8R8G8B8_UNORM,   /* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
  331.    MESA_FORMAT_X8R8G8B8_UNORM,   /* BBBB BBBB GGGG GGGG RRRR RRRR xxxx xxxx */
  332.    MESA_FORMAT_L16A16_UNORM,     /* AAAA AAAA AAAA AAAA LLLL LLLL LLLL LLLL */
  333.    MESA_FORMAT_A16L16_UNORM,     /* LLLL LLLL LLLL LLLL AAAA AAAA AAAA AAAA */
  334.    MESA_FORMAT_B5G6R5_UNORM,                         /* RRRR RGGG GGGB BBBB */
  335.    MESA_FORMAT_R5G6B5_UNORM,                         /* BBBB BGGG GGGR RRRR */
  336.    MESA_FORMAT_B4G4R4A4_UNORM,                       /* AAAA RRRR GGGG BBBB */
  337.    MESA_FORMAT_B4G4R4X4_UNORM,                       /* xxxx RRRR GGGG BBBB */
  338.    MESA_FORMAT_A4R4G4B4_UNORM,                       /* BBBB GGGG RRRR AAAA */
  339.    MESA_FORMAT_A1B5G5R5_UNORM,                       /* RRRR RGGG GGBB BBBA */
  340.    MESA_FORMAT_B5G5R5A1_UNORM,                       /* ARRR RRGG GGGB BBBB */
  341.    MESA_FORMAT_B5G5R5X1_UNORM,                       /* xRRR RRGG GGGB BBBB */
  342.    MESA_FORMAT_A1R5G5B5_UNORM,                       /* BBBB BGGG GGRR RRRA */
  343.    MESA_FORMAT_L8A8_UNORM,                           /* AAAA AAAA LLLL LLLL */
  344.    MESA_FORMAT_A8L8_UNORM,                           /* LLLL LLLL AAAA AAAA */
  345.    MESA_FORMAT_R8G8_UNORM,                           /* GGGG GGGG RRRR RRRR */
  346.    MESA_FORMAT_G8R8_UNORM,                           /* RRRR RRRR GGGG GGGG */
  347.    MESA_FORMAT_L4A4_UNORM,                                     /* AAAA LLLL */
  348.    MESA_FORMAT_B2G3R3_UNORM,                                   /* RRRG GGBB */
  349.  
  350.    MESA_FORMAT_R16G16_UNORM,     /* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */
  351.    MESA_FORMAT_G16R16_UNORM,     /* RRRR RRRR RRRR RRRR GGGG GGGG GGGG GGGG */
  352.    MESA_FORMAT_B10G10R10A2_UNORM,/* AARR RRRR RRRR GGGG GGGG GGBB BBBB BBBB */
  353.    MESA_FORMAT_B10G10R10X2_UNORM,/* xxRR RRRR RRRR GGGG GGGG GGBB BBBB BBBB */
  354.    MESA_FORMAT_R10G10B10A2_UNORM,/* AABB BBBB BBBB GGGG GGGG GGRR RRRR RRRR */
  355.    MESA_FORMAT_R10G10B10X2_UNORM,/* xxBB BBBB BBBB GGGG GGGG GGRR RRRR RRRR */
  356.  
  357.    MESA_FORMAT_S8_UINT_Z24_UNORM,/* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ SSSS SSSS */
  358.    MESA_FORMAT_X8_UINT_Z24_UNORM,/* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ xxxx xxxx */
  359.    MESA_FORMAT_Z24_UNORM_S8_UINT,/* SSSS SSSS ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
  360.    MESA_FORMAT_Z24_UNORM_X8_UINT,/* xxxx xxxx ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
  361.  
  362.    /* Other formats */
  363.    MESA_FORMAT_R3G3B2_UNORM,                                   /* BBGG GRRR */
  364.    MESA_FORMAT_A4B4G4R4_UNORM,                       /* RRRR GGGG BBBB AAAA */
  365.    MESA_FORMAT_R4G4B4A4_UNORM,                       /* AAAA BBBB GGGG RRRR */
  366.    MESA_FORMAT_R5G5B5A1_UNORM,                       /* ABBB BBGG GGGR RRRR */
  367.    MESA_FORMAT_A2B10G10R10_UNORM,/* RRRR RRRR RRGG GGGG GGGG BBBB BBBB BBAA */
  368.    MESA_FORMAT_A2R10G10B10_UNORM,/* BBBB BBBB BBGG GGGG GGGG RRRR RRRR RRAA */
  369.  
  370.    MESA_FORMAT_YCBCR,            /*                     YYYY YYYY UorV UorV */
  371.    MESA_FORMAT_YCBCR_REV,        /*                     UorV UorV YYYY YYYY */
  372.  
  373.    /* Array unorm formats */
  374.    MESA_FORMAT_A_UNORM8,      /* ubyte[i] = A */
  375.    MESA_FORMAT_A_UNORM16,     /* ushort[i] = A */
  376.    MESA_FORMAT_L_UNORM8,      /* ubyte[i] = L */
  377.    MESA_FORMAT_L_UNORM16,     /* ushort[i] = L */
  378.    MESA_FORMAT_I_UNORM8,      /* ubyte[i] = I */
  379.    MESA_FORMAT_I_UNORM16,     /* ushort[i] = I */
  380.    MESA_FORMAT_R_UNORM8,      /* ubyte[i] = R */
  381.    MESA_FORMAT_R_UNORM16,     /* ushort[i] = R */
  382.    MESA_FORMAT_BGR_UNORM8,    /* ubyte[i*3] = B, [i*3+1] = G, [i*3+2] = R */
  383.    MESA_FORMAT_RGB_UNORM8,    /* ubyte[i*3] = R, [i*3+1] = G, [i*3+2] = B */
  384.    MESA_FORMAT_RGBA_UNORM16,  /* ushort[i] = R, [1] = G, [2] = B, [3] = A */
  385.    MESA_FORMAT_RGBX_UNORM16,  
  386.  
  387.    MESA_FORMAT_Z_UNORM16,     /* ushort[i] = Z */
  388.    MESA_FORMAT_Z_UNORM32,     /* uint[i] = Z */
  389.    MESA_FORMAT_S_UINT8,       /* ubyte[i] = S */
  390.  
  391.    /* Packed signed/normalized formats */
  392.                                  /* msb <------ TEXEL BITS -----------> lsb */
  393.                                  /* ---- ---- ---- ---- ---- ---- ---- ---- */
  394.    MESA_FORMAT_A8B8G8R8_SNORM,   /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
  395.    MESA_FORMAT_X8B8G8R8_SNORM,   /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
  396.    MESA_FORMAT_R8G8B8A8_SNORM,   /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
  397.    MESA_FORMAT_R8G8B8X8_SNORM,   /* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
  398.    MESA_FORMAT_R16G16_SNORM,     /* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */
  399.    MESA_FORMAT_G16R16_SNORM,     /* RRRR RRRR RRRR RRRR GGGG GGGG GGGG GGGG */
  400.    MESA_FORMAT_R8G8_SNORM,       /*                     GGGG GGGG RRRR RRRR */
  401.    MESA_FORMAT_G8R8_SNORM,       /*                     RRRR RRRR GGGG GGGG */
  402.    MESA_FORMAT_L8A8_SNORM,       /*                     AAAA AAAA LLLL LLLL */
  403.    MESA_FORMAT_A8L8_SNORM,       /*                     LLLL LLLL AAAA AAAA */
  404.  
  405.    /* Array signed/normalized formats */
  406.    MESA_FORMAT_A_SNORM8,      /* byte[i] = A */
  407.    MESA_FORMAT_A_SNORM16,     /* short[i] = A */
  408.    MESA_FORMAT_L_SNORM8,      /* byte[i] = L */
  409.    MESA_FORMAT_L_SNORM16,     /* short[i] = L */
  410.    MESA_FORMAT_I_SNORM8,      /* byte[i] = I */
  411.    MESA_FORMAT_I_SNORM16,     /* short[i] = I */
  412.    MESA_FORMAT_R_SNORM8,      /* byte[i] = R */
  413.    MESA_FORMAT_R_SNORM16,     /* short[i] = R */
  414.    MESA_FORMAT_LA_SNORM16,    /* short[i * 2] = L, [i * 2 + 1] = A */
  415.    MESA_FORMAT_RGB_SNORM16,   /* short[i*3] = R, [i*3+1] = G, [i*3+2] = B */
  416.    MESA_FORMAT_RGBA_SNORM16,  /* ... */
  417.    MESA_FORMAT_RGBX_SNORM16,  /* ... */
  418.  
  419.    /* Packed sRGB formats */
  420.    MESA_FORMAT_A8B8G8R8_SRGB,    /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
  421.    MESA_FORMAT_B8G8R8A8_SRGB,    /* AAAA AAAA RRRR RRRR GGGG GGGG BBBB BBBB */
  422.    MESA_FORMAT_A8R8G8B8_SRGB,    /* BBBB BBBB GGGG GGGG RRRR RRRR AAAA AAAA */
  423.    MESA_FORMAT_B8G8R8X8_SRGB,    /* xxxx xxxx RRRR RRRR GGGG GGGG BBBB BBBB */
  424.    MESA_FORMAT_X8R8G8B8_SRGB,    /* BBBB BBBB GGGG GGGG RRRR RRRR xxxx xxxx */
  425.    MESA_FORMAT_R8G8B8A8_SRGB,    /* AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
  426.    MESA_FORMAT_R8G8B8X8_SRGB,    /* xxxx xxxx BBBB BBBB GGGG GGGG RRRR RRRR */
  427.    MESA_FORMAT_X8B8G8R8_SRGB,    /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
  428.    MESA_FORMAT_L8A8_SRGB,                            /* AAAA AAAA LLLL LLLL */
  429.    MESA_FORMAT_A8L8_SRGB,                            /* LLLL LLLL AAAA AAAA */
  430.  
  431.    /* Array sRGB formats */
  432.    MESA_FORMAT_L_SRGB8,       /* ubyte[i] = L */
  433.    MESA_FORMAT_BGR_SRGB8,     /* ubyte[i*3] = B, [i*3+1] = G, [i*3+2] = R */
  434.  
  435.    /* Packed float formats */
  436.    MESA_FORMAT_R9G9B9E5_FLOAT,
  437.    MESA_FORMAT_R11G11B10_FLOAT,   /* BBBB BBBB BBGG GGGG GGGG GRRR RRRR RRRR */
  438.    MESA_FORMAT_Z32_FLOAT_S8X24_UINT, /* (float, x24s8) */
  439.  
  440.    /* Array float formats */
  441.    MESA_FORMAT_A_FLOAT16,
  442.    MESA_FORMAT_A_FLOAT32,
  443.    MESA_FORMAT_L_FLOAT16,
  444.    MESA_FORMAT_L_FLOAT32,
  445.    MESA_FORMAT_LA_FLOAT16,
  446.    MESA_FORMAT_LA_FLOAT32,
  447.    MESA_FORMAT_I_FLOAT16,
  448.    MESA_FORMAT_I_FLOAT32,
  449.    MESA_FORMAT_R_FLOAT16,
  450.    MESA_FORMAT_R_FLOAT32,
  451.    MESA_FORMAT_RG_FLOAT16,
  452.    MESA_FORMAT_RG_FLOAT32,
  453.    MESA_FORMAT_RGB_FLOAT16,
  454.    MESA_FORMAT_RGB_FLOAT32,
  455.    MESA_FORMAT_RGBA_FLOAT16,
  456.    MESA_FORMAT_RGBA_FLOAT32,  /* float[0] = R, [1] = G, [2] = B, [3] = A */
  457.    MESA_FORMAT_RGBX_FLOAT16,
  458.    MESA_FORMAT_RGBX_FLOAT32,
  459.    MESA_FORMAT_Z_FLOAT32,
  460.  
  461.    /* Packed signed/unsigned non-normalized integer formats */
  462.    MESA_FORMAT_B10G10R10A2_UINT, /* AARR RRRR RRRR GGGG GGGG GGBB BBBB BBBB */
  463.    MESA_FORMAT_R10G10B10A2_UINT, /* AABB BBBB BBBB GGGG GGGG GGRR RRRR RRRR */
  464.    MESA_FORMAT_A2B10G10R10_UINT, /* RRRR RRRR RRGG GGGG GGGG BBBB BBBB BBAA */
  465.    MESA_FORMAT_A2R10G10B10_UINT, /* BBBB BBBB BBGG GGGG GGGG RRRR RRRR RRAA */
  466.  
  467.    /* Array signed/unsigned non-normalized integer formats */
  468.    MESA_FORMAT_A_UINT8,
  469.    MESA_FORMAT_A_UINT16,
  470.    MESA_FORMAT_A_UINT32,
  471.    MESA_FORMAT_A_SINT8,
  472.    MESA_FORMAT_A_SINT16,
  473.    MESA_FORMAT_A_SINT32,
  474.  
  475.    MESA_FORMAT_I_UINT8,
  476.    MESA_FORMAT_I_UINT16,
  477.    MESA_FORMAT_I_UINT32,
  478.    MESA_FORMAT_I_SINT8,
  479.    MESA_FORMAT_I_SINT16,
  480.    MESA_FORMAT_I_SINT32,
  481.  
  482.    MESA_FORMAT_L_UINT8,
  483.    MESA_FORMAT_L_UINT16,
  484.    MESA_FORMAT_L_UINT32,
  485.    MESA_FORMAT_L_SINT8,
  486.    MESA_FORMAT_L_SINT16,
  487.    MESA_FORMAT_L_SINT32,
  488.  
  489.    MESA_FORMAT_LA_UINT8,
  490.    MESA_FORMAT_LA_UINT16,
  491.    MESA_FORMAT_LA_UINT32,
  492.    MESA_FORMAT_LA_SINT8,
  493.    MESA_FORMAT_LA_SINT16,
  494.    MESA_FORMAT_LA_SINT32,
  495.  
  496.    MESA_FORMAT_R_UINT8,
  497.    MESA_FORMAT_R_UINT16,
  498.    MESA_FORMAT_R_UINT32,
  499.    MESA_FORMAT_R_SINT8,
  500.    MESA_FORMAT_R_SINT16,
  501.    MESA_FORMAT_R_SINT32,
  502.  
  503.    MESA_FORMAT_RG_UINT8,
  504.    MESA_FORMAT_RG_UINT16,
  505.    MESA_FORMAT_RG_UINT32,
  506.    MESA_FORMAT_RG_SINT8,
  507.    MESA_FORMAT_RG_SINT16,
  508.    MESA_FORMAT_RG_SINT32,
  509.  
  510.    MESA_FORMAT_RGB_UINT8,
  511.    MESA_FORMAT_RGB_UINT16,
  512.    MESA_FORMAT_RGB_UINT32,
  513.    MESA_FORMAT_RGB_SINT8,
  514.    MESA_FORMAT_RGB_SINT16,
  515.    MESA_FORMAT_RGB_SINT32,
  516.  
  517.    MESA_FORMAT_RGBA_UINT8,
  518.    MESA_FORMAT_RGBA_UINT16,
  519.    MESA_FORMAT_RGBA_UINT32,
  520.    MESA_FORMAT_RGBA_SINT8,
  521.    MESA_FORMAT_RGBA_SINT16,
  522.    MESA_FORMAT_RGBA_SINT32,
  523.  
  524.    MESA_FORMAT_RGBX_UINT8,
  525.    MESA_FORMAT_RGBX_UINT16,
  526.    MESA_FORMAT_RGBX_UINT32,
  527.    MESA_FORMAT_RGBX_SINT8,
  528.    MESA_FORMAT_RGBX_SINT16,
  529.    MESA_FORMAT_RGBX_SINT32,
  530.  
  531.    /* DXT compressed formats */
  532.    MESA_FORMAT_RGB_DXT1,
  533.    MESA_FORMAT_RGBA_DXT1,
  534.    MESA_FORMAT_RGBA_DXT3,
  535.    MESA_FORMAT_RGBA_DXT5,
  536.  
  537.    /* DXT sRGB compressed formats */
  538.    MESA_FORMAT_SRGB_DXT1,
  539.    MESA_FORMAT_SRGBA_DXT1,
  540.    MESA_FORMAT_SRGBA_DXT3,
  541.    MESA_FORMAT_SRGBA_DXT5,
  542.  
  543.    /* FXT1 compressed formats */
  544.    MESA_FORMAT_RGB_FXT1,
  545.    MESA_FORMAT_RGBA_FXT1,
  546.  
  547.    /* RGTC compressed formats */
  548.    MESA_FORMAT_R_RGTC1_UNORM,
  549.    MESA_FORMAT_R_RGTC1_SNORM,
  550.    MESA_FORMAT_RG_RGTC2_UNORM,
  551.    MESA_FORMAT_RG_RGTC2_SNORM,
  552.  
  553.    /* LATC1/2 compressed formats */
  554.    MESA_FORMAT_L_LATC1_UNORM,
  555.    MESA_FORMAT_L_LATC1_SNORM,
  556.    MESA_FORMAT_LA_LATC2_UNORM,
  557.    MESA_FORMAT_LA_LATC2_SNORM,
  558.  
  559.    /* ETC1/2 compressed formats */
  560.    MESA_FORMAT_ETC1_RGB8,
  561.    MESA_FORMAT_ETC2_RGB8,
  562.    MESA_FORMAT_ETC2_SRGB8,
  563.    MESA_FORMAT_ETC2_RGBA8_EAC,
  564.    MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC,
  565.    MESA_FORMAT_ETC2_R11_EAC,
  566.    MESA_FORMAT_ETC2_RG11_EAC,
  567.    MESA_FORMAT_ETC2_SIGNED_R11_EAC,
  568.    MESA_FORMAT_ETC2_SIGNED_RG11_EAC,
  569.    MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,
  570.    MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,
  571.  
  572.    /* BPTC compressed formats */
  573.    MESA_FORMAT_BPTC_RGBA_UNORM,
  574.    MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM,
  575.    MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT,
  576.    MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT,
  577.  
  578.    MESA_FORMAT_COUNT
  579. } mesa_format;
  580.  
  581.  
  582. extern const char *
  583. _mesa_get_format_name(mesa_format format);
  584.  
  585. extern GLint
  586. _mesa_get_format_bytes(mesa_format format);
  587.  
  588. extern GLint
  589. _mesa_get_format_bits(mesa_format format, GLenum pname);
  590.  
  591. extern GLuint
  592. _mesa_get_format_max_bits(mesa_format format);
  593.  
  594. extern enum mesa_format_layout
  595. _mesa_get_format_layout(mesa_format format);
  596.  
  597. extern GLenum
  598. _mesa_get_format_datatype(mesa_format format);
  599.  
  600. extern GLenum
  601. _mesa_get_format_base_format(uint32_t format);
  602.  
  603. extern void
  604. _mesa_get_format_block_size(mesa_format format, GLuint *bw, GLuint *bh);
  605.  
  606. extern mesa_array_format
  607. _mesa_array_format_flip_channels(mesa_array_format format);
  608.  
  609. extern void
  610. _mesa_get_format_swizzle(mesa_format format, uint8_t swizzle_out[4]);
  611.  
  612. extern uint32_t
  613. _mesa_format_to_array_format(mesa_format format);
  614.  
  615. extern mesa_format
  616. _mesa_format_from_array_format(uint32_t array_format);
  617.  
  618. extern GLboolean
  619. _mesa_is_format_compressed(mesa_format format);
  620.  
  621. extern GLboolean
  622. _mesa_is_format_packed_depth_stencil(mesa_format format);
  623.  
  624. extern GLboolean
  625. _mesa_is_format_integer_color(mesa_format format);
  626.  
  627. extern GLboolean
  628. _mesa_is_format_unsigned(mesa_format format);
  629.  
  630. extern GLboolean
  631. _mesa_is_format_signed(mesa_format format);
  632.  
  633. extern GLboolean
  634. _mesa_is_format_integer(mesa_format format);
  635.  
  636. extern bool
  637. _mesa_is_format_etc2(mesa_format format);
  638.  
  639. GLenum
  640. _mesa_is_format_color_format(mesa_format format);
  641.  
  642. extern GLenum
  643. _mesa_get_format_color_encoding(mesa_format format);
  644.  
  645. extern GLuint
  646. _mesa_format_image_size(mesa_format format, GLsizei width,
  647.                         GLsizei height, GLsizei depth);
  648.  
  649. extern uint64_t
  650. _mesa_format_image_size64(mesa_format format, GLsizei width,
  651.                           GLsizei height, GLsizei depth);
  652.  
  653. extern GLint
  654. _mesa_format_row_stride(mesa_format format, GLsizei width);
  655.  
  656. extern void
  657. _mesa_format_to_type_and_comps(mesa_format format,
  658.                                GLenum *datatype, GLuint *comps);
  659.  
  660. extern void
  661. _mesa_test_formats(void);
  662.  
  663. extern mesa_format
  664. _mesa_get_srgb_format_linear(mesa_format format);
  665.  
  666. extern mesa_format
  667. _mesa_get_uncompressed_format(mesa_format format);
  668.  
  669. extern GLuint
  670. _mesa_format_num_components(mesa_format format);
  671.  
  672. extern bool
  673. _mesa_format_has_color_component(mesa_format format, int component);
  674.  
  675. GLboolean
  676. _mesa_format_matches_format_and_type(mesa_format mesa_format,
  677.                                      GLenum format, GLenum type,
  678.                                      GLboolean swapBytes);
  679.  
  680. #ifdef __cplusplus
  681. }
  682. #endif
  683.  
  684. #endif /* FORMATS_H */
  685.