Home | History | Annotate | Download | only in main
      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  * Copyright (c) 2012 Intel Corporation
      7  *
      8  * Permission is hereby granted, free of charge, to any person obtaining a
      9  * copy of this software and associated documentation files (the "Software"),
     10  * to deal in the Software without restriction, including without limitation
     11  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     12  * and/or sell copies of the Software, and to permit persons to whom the
     13  * Software is furnished to do so, subject to the following conditions:
     14  *
     15  * The above copyright notice and this permission notice shall be included
     16  * in all copies or substantial portions of the Software.
     17  *
     18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     21  * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     22  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     23  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  */
     25 
     26 
     27 #include "context.h"
     28 #include "glformats.h"
     29 
     30 
     31 /**
     32  * \return GL_TRUE if type is packed pixel type, GL_FALSE otherwise.
     33  */
     34 GLboolean
     35 _mesa_type_is_packed(GLenum type)
     36 {
     37    switch (type) {
     38    case GL_UNSIGNED_BYTE_3_3_2:
     39    case GL_UNSIGNED_BYTE_2_3_3_REV:
     40    case MESA_UNSIGNED_BYTE_4_4:
     41    case GL_UNSIGNED_SHORT_5_6_5:
     42    case GL_UNSIGNED_SHORT_5_6_5_REV:
     43    case GL_UNSIGNED_SHORT_4_4_4_4:
     44    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
     45    case GL_UNSIGNED_SHORT_5_5_5_1:
     46    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
     47    case GL_UNSIGNED_INT_8_8_8_8:
     48    case GL_UNSIGNED_INT_8_8_8_8_REV:
     49    case GL_UNSIGNED_INT_10_10_10_2:
     50    case GL_UNSIGNED_INT_2_10_10_10_REV:
     51    case GL_UNSIGNED_SHORT_8_8_MESA:
     52    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
     53    case GL_UNSIGNED_INT_24_8_EXT:
     54    case GL_UNSIGNED_INT_5_9_9_9_REV:
     55    case GL_UNSIGNED_INT_10F_11F_11F_REV:
     56    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
     57       return GL_TRUE;
     58    }
     59 
     60    return GL_FALSE;
     61 }
     62 
     63 
     64 /**
     65  * Get the size of a GL data type.
     66  *
     67  * \param type GL data type.
     68  *
     69  * \return the size, in bytes, of the given data type, 0 if a GL_BITMAP, or -1
     70  * if an invalid type enum.
     71  */
     72 GLint
     73 _mesa_sizeof_type(GLenum type)
     74 {
     75    switch (type) {
     76    case GL_BITMAP:
     77       return 0;
     78    case GL_UNSIGNED_BYTE:
     79       return sizeof(GLubyte);
     80    case GL_BYTE:
     81       return sizeof(GLbyte);
     82    case GL_UNSIGNED_SHORT:
     83       return sizeof(GLushort);
     84    case GL_SHORT:
     85       return sizeof(GLshort);
     86    case GL_UNSIGNED_INT:
     87       return sizeof(GLuint);
     88    case GL_INT:
     89       return sizeof(GLint);
     90    case GL_FLOAT:
     91       return sizeof(GLfloat);
     92    case GL_DOUBLE:
     93       return sizeof(GLdouble);
     94    case GL_HALF_FLOAT_ARB:
     95       return sizeof(GLhalfARB);
     96    case GL_FIXED:
     97       return sizeof(GLfixed);
     98    default:
     99       return -1;
    100    }
    101 }
    102 
    103 
    104 /**
    105  * Same as _mesa_sizeof_type() but also accepting the packed pixel
    106  * format data types.
    107  */
    108 GLint
    109 _mesa_sizeof_packed_type(GLenum type)
    110 {
    111    switch (type) {
    112    case GL_BITMAP:
    113       return 0;
    114    case GL_UNSIGNED_BYTE:
    115       return sizeof(GLubyte);
    116    case GL_BYTE:
    117       return sizeof(GLbyte);
    118    case GL_UNSIGNED_SHORT:
    119       return sizeof(GLushort);
    120    case GL_SHORT:
    121       return sizeof(GLshort);
    122    case GL_UNSIGNED_INT:
    123       return sizeof(GLuint);
    124    case GL_INT:
    125       return sizeof(GLint);
    126    case GL_HALF_FLOAT_ARB:
    127       return sizeof(GLhalfARB);
    128    case GL_FLOAT:
    129       return sizeof(GLfloat);
    130    case GL_UNSIGNED_BYTE_3_3_2:
    131    case GL_UNSIGNED_BYTE_2_3_3_REV:
    132    case MESA_UNSIGNED_BYTE_4_4:
    133       return sizeof(GLubyte);
    134    case GL_UNSIGNED_SHORT_5_6_5:
    135    case GL_UNSIGNED_SHORT_5_6_5_REV:
    136    case GL_UNSIGNED_SHORT_4_4_4_4:
    137    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
    138    case GL_UNSIGNED_SHORT_5_5_5_1:
    139    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
    140    case GL_UNSIGNED_SHORT_8_8_MESA:
    141    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
    142       return sizeof(GLushort);
    143    case GL_UNSIGNED_INT_8_8_8_8:
    144    case GL_UNSIGNED_INT_8_8_8_8_REV:
    145    case GL_UNSIGNED_INT_10_10_10_2:
    146    case GL_UNSIGNED_INT_2_10_10_10_REV:
    147    case GL_UNSIGNED_INT_24_8_EXT:
    148    case GL_UNSIGNED_INT_5_9_9_9_REV:
    149    case GL_UNSIGNED_INT_10F_11F_11F_REV:
    150       return sizeof(GLuint);
    151    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
    152       return 8;
    153    default:
    154       return -1;
    155    }
    156 }
    157 
    158 
    159 /**
    160  * Get the number of components in a pixel format.
    161  *
    162  * \param format pixel format.
    163  *
    164  * \return the number of components in the given format, or -1 if a bad format.
    165  */
    166 GLint
    167 _mesa_components_in_format(GLenum format)
    168 {
    169    switch (format) {
    170    case GL_COLOR_INDEX:
    171    case GL_STENCIL_INDEX:
    172    case GL_DEPTH_COMPONENT:
    173    case GL_RED:
    174    case GL_RED_INTEGER_EXT:
    175    case GL_GREEN:
    176    case GL_GREEN_INTEGER_EXT:
    177    case GL_BLUE:
    178    case GL_BLUE_INTEGER_EXT:
    179    case GL_ALPHA:
    180    case GL_ALPHA_INTEGER_EXT:
    181    case GL_LUMINANCE:
    182    case GL_LUMINANCE_INTEGER_EXT:
    183    case GL_INTENSITY:
    184       return 1;
    185 
    186    case GL_LUMINANCE_ALPHA:
    187    case GL_LUMINANCE_ALPHA_INTEGER_EXT:
    188    case GL_RG:
    189    case GL_YCBCR_MESA:
    190    case GL_DEPTH_STENCIL_EXT:
    191    case GL_DUDV_ATI:
    192    case GL_DU8DV8_ATI:
    193    case GL_RG_INTEGER:
    194       return 2;
    195 
    196    case GL_RGB:
    197    case GL_BGR:
    198    case GL_RGB_INTEGER_EXT:
    199    case GL_BGR_INTEGER_EXT:
    200       return 3;
    201 
    202    case GL_RGBA:
    203    case GL_BGRA:
    204    case GL_ABGR_EXT:
    205    case GL_RGBA_INTEGER_EXT:
    206    case GL_BGRA_INTEGER_EXT:
    207       return 4;
    208 
    209    default:
    210       return -1;
    211    }
    212 }
    213 
    214 
    215 /**
    216  * Get the bytes per pixel of pixel format type pair.
    217  *
    218  * \param format pixel format.
    219  * \param type pixel type.
    220  *
    221  * \return bytes per pixel, or -1 if a bad format or type was given.
    222  */
    223 GLint
    224 _mesa_bytes_per_pixel(GLenum format, GLenum type)
    225 {
    226    GLint comps = _mesa_components_in_format(format);
    227    if (comps < 0)
    228       return -1;
    229 
    230    switch (type) {
    231    case GL_BITMAP:
    232       return 0;  /* special case */
    233    case GL_BYTE:
    234    case GL_UNSIGNED_BYTE:
    235       return comps * sizeof(GLubyte);
    236    case GL_SHORT:
    237    case GL_UNSIGNED_SHORT:
    238       return comps * sizeof(GLshort);
    239    case GL_INT:
    240    case GL_UNSIGNED_INT:
    241       return comps * sizeof(GLint);
    242    case GL_FLOAT:
    243       return comps * sizeof(GLfloat);
    244    case GL_HALF_FLOAT_ARB:
    245       return comps * sizeof(GLhalfARB);
    246    case GL_UNSIGNED_BYTE_3_3_2:
    247    case GL_UNSIGNED_BYTE_2_3_3_REV:
    248       if (format == GL_RGB || format == GL_BGR ||
    249           format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
    250          return sizeof(GLubyte);
    251       else
    252          return -1;  /* error */
    253    case GL_UNSIGNED_SHORT_5_6_5:
    254    case GL_UNSIGNED_SHORT_5_6_5_REV:
    255       if (format == GL_RGB || format == GL_BGR ||
    256           format == GL_RGB_INTEGER_EXT || format == GL_BGR_INTEGER_EXT)
    257          return sizeof(GLushort);
    258       else
    259          return -1;  /* error */
    260    case GL_UNSIGNED_SHORT_4_4_4_4:
    261    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
    262    case GL_UNSIGNED_SHORT_5_5_5_1:
    263    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
    264       if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
    265           format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
    266          return sizeof(GLushort);
    267       else
    268          return -1;
    269    case GL_UNSIGNED_INT_8_8_8_8:
    270    case GL_UNSIGNED_INT_8_8_8_8_REV:
    271    case GL_UNSIGNED_INT_10_10_10_2:
    272    case GL_UNSIGNED_INT_2_10_10_10_REV:
    273       if (format == GL_RGBA || format == GL_BGRA || format == GL_ABGR_EXT ||
    274           format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT)
    275          return sizeof(GLuint);
    276       else
    277          return -1;
    278    case GL_UNSIGNED_SHORT_8_8_MESA:
    279    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
    280       if (format == GL_YCBCR_MESA)
    281          return sizeof(GLushort);
    282       else
    283          return -1;
    284    case GL_UNSIGNED_INT_24_8_EXT:
    285       if (format == GL_DEPTH_STENCIL_EXT)
    286          return sizeof(GLuint);
    287       else
    288          return -1;
    289    case GL_UNSIGNED_INT_5_9_9_9_REV:
    290       if (format == GL_RGB)
    291          return sizeof(GLuint);
    292       else
    293          return -1;
    294    case GL_UNSIGNED_INT_10F_11F_11F_REV:
    295       if (format == GL_RGB)
    296          return sizeof(GLuint);
    297       else
    298          return -1;
    299    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
    300       if (format == GL_DEPTH_STENCIL)
    301          return 8;
    302       else
    303          return -1;
    304    default:
    305       return -1;
    306    }
    307 }
    308 
    309 
    310 /**
    311  * Test if the given format is an integer (non-normalized) format.
    312  */
    313 GLboolean
    314 _mesa_is_enum_format_integer(GLenum format)
    315 {
    316    switch (format) {
    317    /* generic integer formats */
    318    case GL_RED_INTEGER_EXT:
    319    case GL_GREEN_INTEGER_EXT:
    320    case GL_BLUE_INTEGER_EXT:
    321    case GL_ALPHA_INTEGER_EXT:
    322    case GL_RGB_INTEGER_EXT:
    323    case GL_RGBA_INTEGER_EXT:
    324    case GL_BGR_INTEGER_EXT:
    325    case GL_BGRA_INTEGER_EXT:
    326    case GL_LUMINANCE_INTEGER_EXT:
    327    case GL_LUMINANCE_ALPHA_INTEGER_EXT:
    328    case GL_RG_INTEGER:
    329    /* specific integer formats */
    330    case GL_RGBA32UI_EXT:
    331    case GL_RGB32UI_EXT:
    332    case GL_RG32UI:
    333    case GL_R32UI:
    334    case GL_ALPHA32UI_EXT:
    335    case GL_INTENSITY32UI_EXT:
    336    case GL_LUMINANCE32UI_EXT:
    337    case GL_LUMINANCE_ALPHA32UI_EXT:
    338    case GL_RGBA16UI_EXT:
    339    case GL_RGB16UI_EXT:
    340    case GL_RG16UI:
    341    case GL_R16UI:
    342    case GL_ALPHA16UI_EXT:
    343    case GL_INTENSITY16UI_EXT:
    344    case GL_LUMINANCE16UI_EXT:
    345    case GL_LUMINANCE_ALPHA16UI_EXT:
    346    case GL_RGBA8UI_EXT:
    347    case GL_RGB8UI_EXT:
    348    case GL_RG8UI:
    349    case GL_R8UI:
    350    case GL_ALPHA8UI_EXT:
    351    case GL_INTENSITY8UI_EXT:
    352    case GL_LUMINANCE8UI_EXT:
    353    case GL_LUMINANCE_ALPHA8UI_EXT:
    354    case GL_RGBA32I_EXT:
    355    case GL_RGB32I_EXT:
    356    case GL_RG32I:
    357    case GL_R32I:
    358    case GL_ALPHA32I_EXT:
    359    case GL_INTENSITY32I_EXT:
    360    case GL_LUMINANCE32I_EXT:
    361    case GL_LUMINANCE_ALPHA32I_EXT:
    362    case GL_RGBA16I_EXT:
    363    case GL_RGB16I_EXT:
    364    case GL_RG16I:
    365    case GL_R16I:
    366    case GL_ALPHA16I_EXT:
    367    case GL_INTENSITY16I_EXT:
    368    case GL_LUMINANCE16I_EXT:
    369    case GL_LUMINANCE_ALPHA16I_EXT:
    370    case GL_RGBA8I_EXT:
    371    case GL_RGB8I_EXT:
    372    case GL_RG8I:
    373    case GL_R8I:
    374    case GL_ALPHA8I_EXT:
    375    case GL_INTENSITY8I_EXT:
    376    case GL_LUMINANCE8I_EXT:
    377    case GL_LUMINANCE_ALPHA8I_EXT:
    378    case GL_RGB10_A2UI:
    379       return GL_TRUE;
    380    default:
    381       return GL_FALSE;
    382    }
    383 }
    384 
    385 
    386 /**
    387  * Test if the given type is an integer (non-normalized) format.
    388  */
    389 GLboolean
    390 _mesa_is_type_integer(GLenum type)
    391 {
    392    switch (type) {
    393    case GL_INT:
    394    case GL_UNSIGNED_INT:
    395    case GL_SHORT:
    396    case GL_UNSIGNED_SHORT:
    397    case GL_BYTE:
    398    case GL_UNSIGNED_BYTE:
    399       return GL_TRUE;
    400    default:
    401       return GL_FALSE;
    402    }
    403 }
    404 
    405 
    406 /**
    407  * Test if the given format or type is an integer (non-normalized) format.
    408  */
    409 extern GLboolean
    410 _mesa_is_enum_format_or_type_integer(GLenum format, GLenum type)
    411 {
    412    return _mesa_is_enum_format_integer(format) || _mesa_is_type_integer(type);
    413 }
    414 
    415 
    416 GLboolean
    417 _mesa_is_type_unsigned(GLenum type)
    418 {
    419    switch (type) {
    420    case GL_UNSIGNED_INT:
    421    case GL_UNSIGNED_INT_8_8_8_8:
    422    case GL_UNSIGNED_INT_8_8_8_8_REV:
    423    case GL_UNSIGNED_INT_10_10_10_2:
    424    case GL_UNSIGNED_INT_2_10_10_10_REV:
    425 
    426    case GL_UNSIGNED_SHORT:
    427    case GL_UNSIGNED_SHORT_4_4_4_4:
    428    case GL_UNSIGNED_SHORT_5_5_5_1:
    429    case GL_UNSIGNED_SHORT_5_6_5:
    430    case GL_UNSIGNED_SHORT_5_6_5_REV:
    431    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
    432    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
    433    case GL_UNSIGNED_SHORT_8_8_MESA:
    434    case GL_UNSIGNED_SHORT_8_8_REV_MESA:
    435 
    436    case GL_UNSIGNED_BYTE:
    437    case GL_UNSIGNED_BYTE_3_3_2:
    438    case GL_UNSIGNED_BYTE_2_3_3_REV:
    439       return GL_TRUE;
    440 
    441    default:
    442       return GL_FALSE;
    443    }
    444 }
    445 
    446 
    447 /**
    448  * Test if the given image format is a color/RGBA format (i.e., not color
    449  * index, depth, stencil, etc).
    450  * \param format  the image format value (may by an internal texture format)
    451  * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise.
    452  */
    453 GLboolean
    454 _mesa_is_color_format(GLenum format)
    455 {
    456    switch (format) {
    457       case GL_RED:
    458       case GL_GREEN:
    459       case GL_BLUE:
    460       case GL_ALPHA:
    461       case GL_ALPHA4:
    462       case GL_ALPHA8:
    463       case GL_ALPHA12:
    464       case GL_ALPHA16:
    465       case 1:
    466       case GL_LUMINANCE:
    467       case GL_LUMINANCE4:
    468       case GL_LUMINANCE8:
    469       case GL_LUMINANCE12:
    470       case GL_LUMINANCE16:
    471       case 2:
    472       case GL_LUMINANCE_ALPHA:
    473       case GL_LUMINANCE4_ALPHA4:
    474       case GL_LUMINANCE6_ALPHA2:
    475       case GL_LUMINANCE8_ALPHA8:
    476       case GL_LUMINANCE12_ALPHA4:
    477       case GL_LUMINANCE12_ALPHA12:
    478       case GL_LUMINANCE16_ALPHA16:
    479       case GL_INTENSITY:
    480       case GL_INTENSITY4:
    481       case GL_INTENSITY8:
    482       case GL_INTENSITY12:
    483       case GL_INTENSITY16:
    484       case GL_R8:
    485       case GL_R16:
    486       case GL_RG:
    487       case GL_RG8:
    488       case GL_RG16:
    489       case 3:
    490       case GL_RGB:
    491       case GL_BGR:
    492       case GL_R3_G3_B2:
    493       case GL_RGB4:
    494       case GL_RGB5:
    495       case GL_RGB565:
    496       case GL_RGB8:
    497       case GL_RGB10:
    498       case GL_RGB12:
    499       case GL_RGB16:
    500       case 4:
    501       case GL_ABGR_EXT:
    502       case GL_RGBA:
    503       case GL_BGRA:
    504       case GL_RGBA2:
    505       case GL_RGBA4:
    506       case GL_RGB5_A1:
    507       case GL_RGBA8:
    508       case GL_RGB10_A2:
    509       case GL_RGBA12:
    510       case GL_RGBA16:
    511       /* float texture formats */
    512       case GL_ALPHA16F_ARB:
    513       case GL_ALPHA32F_ARB:
    514       case GL_LUMINANCE16F_ARB:
    515       case GL_LUMINANCE32F_ARB:
    516       case GL_LUMINANCE_ALPHA16F_ARB:
    517       case GL_LUMINANCE_ALPHA32F_ARB:
    518       case GL_INTENSITY16F_ARB:
    519       case GL_INTENSITY32F_ARB:
    520       case GL_R16F:
    521       case GL_R32F:
    522       case GL_RG16F:
    523       case GL_RG32F:
    524       case GL_RGB16F_ARB:
    525       case GL_RGB32F_ARB:
    526       case GL_RGBA16F_ARB:
    527       case GL_RGBA32F_ARB:
    528       /* compressed formats */
    529       case GL_COMPRESSED_ALPHA:
    530       case GL_COMPRESSED_LUMINANCE:
    531       case GL_COMPRESSED_LUMINANCE_ALPHA:
    532       case GL_COMPRESSED_INTENSITY:
    533       case GL_COMPRESSED_RED:
    534       case GL_COMPRESSED_RG:
    535       case GL_COMPRESSED_RGB:
    536       case GL_COMPRESSED_RGBA:
    537       case GL_RGB_S3TC:
    538       case GL_RGB4_S3TC:
    539       case GL_RGBA_S3TC:
    540       case GL_RGBA4_S3TC:
    541       case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
    542       case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
    543       case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
    544       case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
    545       case GL_COMPRESSED_RGB_FXT1_3DFX:
    546       case GL_COMPRESSED_RGBA_FXT1_3DFX:
    547 #if FEATURE_EXT_texture_sRGB
    548       case GL_SRGB_EXT:
    549       case GL_SRGB8_EXT:
    550       case GL_SRGB_ALPHA_EXT:
    551       case GL_SRGB8_ALPHA8_EXT:
    552       case GL_SLUMINANCE_ALPHA_EXT:
    553       case GL_SLUMINANCE8_ALPHA8_EXT:
    554       case GL_SLUMINANCE_EXT:
    555       case GL_SLUMINANCE8_EXT:
    556       case GL_COMPRESSED_SRGB_EXT:
    557       case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
    558       case GL_COMPRESSED_SRGB_ALPHA_EXT:
    559       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
    560       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
    561       case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
    562       case GL_COMPRESSED_SLUMINANCE_EXT:
    563       case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
    564 #endif /* FEATURE_EXT_texture_sRGB */
    565       case GL_COMPRESSED_RED_RGTC1:
    566       case GL_COMPRESSED_SIGNED_RED_RGTC1:
    567       case GL_COMPRESSED_RG_RGTC2:
    568       case GL_COMPRESSED_SIGNED_RG_RGTC2:
    569       case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
    570       case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
    571       case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
    572       case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
    573       case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
    574       case GL_ETC1_RGB8_OES:
    575       /* generic integer formats */
    576       case GL_RED_INTEGER_EXT:
    577       case GL_GREEN_INTEGER_EXT:
    578       case GL_BLUE_INTEGER_EXT:
    579       case GL_ALPHA_INTEGER_EXT:
    580       case GL_RGB_INTEGER_EXT:
    581       case GL_RGBA_INTEGER_EXT:
    582       case GL_BGR_INTEGER_EXT:
    583       case GL_BGRA_INTEGER_EXT:
    584       case GL_RG_INTEGER:
    585       case GL_LUMINANCE_INTEGER_EXT:
    586       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
    587       /* sized integer formats */
    588       case GL_RGBA32UI_EXT:
    589       case GL_RGB32UI_EXT:
    590       case GL_RG32UI:
    591       case GL_R32UI:
    592       case GL_ALPHA32UI_EXT:
    593       case GL_INTENSITY32UI_EXT:
    594       case GL_LUMINANCE32UI_EXT:
    595       case GL_LUMINANCE_ALPHA32UI_EXT:
    596       case GL_RGBA16UI_EXT:
    597       case GL_RGB16UI_EXT:
    598       case GL_RG16UI:
    599       case GL_R16UI:
    600       case GL_ALPHA16UI_EXT:
    601       case GL_INTENSITY16UI_EXT:
    602       case GL_LUMINANCE16UI_EXT:
    603       case GL_LUMINANCE_ALPHA16UI_EXT:
    604       case GL_RGBA8UI_EXT:
    605       case GL_RGB8UI_EXT:
    606       case GL_RG8UI:
    607       case GL_R8UI:
    608       case GL_ALPHA8UI_EXT:
    609       case GL_INTENSITY8UI_EXT:
    610       case GL_LUMINANCE8UI_EXT:
    611       case GL_LUMINANCE_ALPHA8UI_EXT:
    612       case GL_RGBA32I_EXT:
    613       case GL_RGB32I_EXT:
    614       case GL_RG32I:
    615       case GL_R32I:
    616       case GL_ALPHA32I_EXT:
    617       case GL_INTENSITY32I_EXT:
    618       case GL_LUMINANCE32I_EXT:
    619       case GL_LUMINANCE_ALPHA32I_EXT:
    620       case GL_RGBA16I_EXT:
    621       case GL_RGB16I_EXT:
    622       case GL_RG16I:
    623       case GL_R16I:
    624       case GL_ALPHA16I_EXT:
    625       case GL_INTENSITY16I_EXT:
    626       case GL_LUMINANCE16I_EXT:
    627       case GL_LUMINANCE_ALPHA16I_EXT:
    628       case GL_RGBA8I_EXT:
    629       case GL_RGB8I_EXT:
    630       case GL_RG8I:
    631       case GL_R8I:
    632       case GL_ALPHA8I_EXT:
    633       case GL_INTENSITY8I_EXT:
    634       case GL_LUMINANCE8I_EXT:
    635       case GL_LUMINANCE_ALPHA8I_EXT:
    636       /* signed, normalized texture formats */
    637       case GL_RED_SNORM:
    638       case GL_R8_SNORM:
    639       case GL_R16_SNORM:
    640       case GL_RG_SNORM:
    641       case GL_RG8_SNORM:
    642       case GL_RG16_SNORM:
    643       case GL_RGB_SNORM:
    644       case GL_RGB8_SNORM:
    645       case GL_RGB16_SNORM:
    646       case GL_RGBA_SNORM:
    647       case GL_RGBA8_SNORM:
    648       case GL_RGBA16_SNORM:
    649       case GL_ALPHA_SNORM:
    650       case GL_ALPHA8_SNORM:
    651       case GL_ALPHA16_SNORM:
    652       case GL_LUMINANCE_SNORM:
    653       case GL_LUMINANCE8_SNORM:
    654       case GL_LUMINANCE16_SNORM:
    655       case GL_LUMINANCE_ALPHA_SNORM:
    656       case GL_LUMINANCE8_ALPHA8_SNORM:
    657       case GL_LUMINANCE16_ALPHA16_SNORM:
    658       case GL_INTENSITY_SNORM:
    659       case GL_INTENSITY8_SNORM:
    660       case GL_INTENSITY16_SNORM:
    661       case GL_RGB9_E5:
    662       case GL_R11F_G11F_B10F:
    663       case GL_RGB10_A2UI:
    664          return GL_TRUE;
    665       case GL_YCBCR_MESA:  /* not considered to be RGB */
    666          /* fall-through */
    667       default:
    668          return GL_FALSE;
    669    }
    670 }
    671 
    672 
    673 /**
    674  * Test if the given image format is a depth component format.
    675  */
    676 GLboolean
    677 _mesa_is_depth_format(GLenum format)
    678 {
    679    switch (format) {
    680       case GL_DEPTH_COMPONENT:
    681       case GL_DEPTH_COMPONENT16:
    682       case GL_DEPTH_COMPONENT24:
    683       case GL_DEPTH_COMPONENT32:
    684       case GL_DEPTH_COMPONENT32F:
    685          return GL_TRUE;
    686       default:
    687          return GL_FALSE;
    688    }
    689 }
    690 
    691 
    692 /**
    693  * Test if the given image format is a stencil format.
    694  */
    695 GLboolean
    696 _mesa_is_stencil_format(GLenum format)
    697 {
    698    switch (format) {
    699       case GL_STENCIL_INDEX:
    700          return GL_TRUE;
    701       default:
    702          return GL_FALSE;
    703    }
    704 }
    705 
    706 
    707 /**
    708  * Test if the given image format is a YCbCr format.
    709  */
    710 GLboolean
    711 _mesa_is_ycbcr_format(GLenum format)
    712 {
    713    switch (format) {
    714       case GL_YCBCR_MESA:
    715          return GL_TRUE;
    716       default:
    717          return GL_FALSE;
    718    }
    719 }
    720 
    721 
    722 /**
    723  * Test if the given image format is a depth+stencil format.
    724  */
    725 GLboolean
    726 _mesa_is_depthstencil_format(GLenum format)
    727 {
    728    switch (format) {
    729       case GL_DEPTH24_STENCIL8_EXT:
    730       case GL_DEPTH_STENCIL_EXT:
    731       case GL_DEPTH32F_STENCIL8:
    732          return GL_TRUE;
    733       default:
    734          return GL_FALSE;
    735    }
    736 }
    737 
    738 
    739 /**
    740  * Test if the given image format is a depth or stencil format.
    741  */
    742 GLboolean
    743 _mesa_is_depth_or_stencil_format(GLenum format)
    744 {
    745    switch (format) {
    746       case GL_DEPTH_COMPONENT:
    747       case GL_DEPTH_COMPONENT16:
    748       case GL_DEPTH_COMPONENT24:
    749       case GL_DEPTH_COMPONENT32:
    750       case GL_STENCIL_INDEX:
    751       case GL_STENCIL_INDEX1_EXT:
    752       case GL_STENCIL_INDEX4_EXT:
    753       case GL_STENCIL_INDEX8_EXT:
    754       case GL_STENCIL_INDEX16_EXT:
    755       case GL_DEPTH_STENCIL_EXT:
    756       case GL_DEPTH24_STENCIL8_EXT:
    757       case GL_DEPTH_COMPONENT32F:
    758       case GL_DEPTH32F_STENCIL8:
    759          return GL_TRUE;
    760       default:
    761          return GL_FALSE;
    762    }
    763 }
    764 
    765 
    766 /**
    767  * Test if the given image format is a dudv format.
    768  */
    769 GLboolean
    770 _mesa_is_dudv_format(GLenum format)
    771 {
    772    switch (format) {
    773       case GL_DUDV_ATI:
    774       case GL_DU8DV8_ATI:
    775          return GL_TRUE;
    776       default:
    777          return GL_FALSE;
    778    }
    779 }
    780 
    781 
    782 /**
    783  * Test if an image format is a supported compressed format.
    784  * \param format the internal format token provided by the user.
    785  * \return GL_TRUE if compressed, GL_FALSE if uncompressed
    786  */
    787 GLboolean
    788 _mesa_is_compressed_format(struct gl_context *ctx, GLenum format)
    789 {
    790    switch (format) {
    791    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
    792    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
    793       return ctx->Extensions.EXT_texture_compression_s3tc;
    794    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
    795    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
    796       return _mesa_is_desktop_gl(ctx)
    797          && ctx->Extensions.EXT_texture_compression_s3tc;
    798    case GL_RGB_S3TC:
    799    case GL_RGB4_S3TC:
    800    case GL_RGBA_S3TC:
    801    case GL_RGBA4_S3TC:
    802       return _mesa_is_desktop_gl(ctx) && ctx->Extensions.S3_s3tc;
    803    case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
    804    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
    805    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
    806    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
    807       return _mesa_is_desktop_gl(ctx)
    808          && ctx->Extensions.EXT_texture_sRGB
    809          && ctx->Extensions.EXT_texture_compression_s3tc;
    810    case GL_COMPRESSED_RGB_FXT1_3DFX:
    811    case GL_COMPRESSED_RGBA_FXT1_3DFX:
    812       return _mesa_is_desktop_gl(ctx)
    813          && ctx->Extensions.TDFX_texture_compression_FXT1;
    814    case GL_COMPRESSED_RED_RGTC1:
    815    case GL_COMPRESSED_SIGNED_RED_RGTC1:
    816    case GL_COMPRESSED_RG_RGTC2:
    817    case GL_COMPRESSED_SIGNED_RG_RGTC2:
    818       return _mesa_is_desktop_gl(ctx)
    819          && ctx->Extensions.ARB_texture_compression_rgtc;
    820    case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
    821    case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
    822    case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
    823    case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
    824       return ctx->API == API_OPENGL
    825          && ctx->Extensions.EXT_texture_compression_latc;
    826    case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
    827       return ctx->API == API_OPENGL
    828          && ctx->Extensions.ATI_texture_compression_3dc;
    829    case GL_ETC1_RGB8_OES:
    830       return _mesa_is_gles(ctx)
    831          && ctx->Extensions.OES_compressed_ETC1_RGB8_texture;
    832 #if FEATURE_ES
    833    case GL_PALETTE4_RGB8_OES:
    834    case GL_PALETTE4_RGBA8_OES:
    835    case GL_PALETTE4_R5_G6_B5_OES:
    836    case GL_PALETTE4_RGBA4_OES:
    837    case GL_PALETTE4_RGB5_A1_OES:
    838    case GL_PALETTE8_RGB8_OES:
    839    case GL_PALETTE8_RGBA8_OES:
    840    case GL_PALETTE8_R5_G6_B5_OES:
    841    case GL_PALETTE8_RGBA4_OES:
    842    case GL_PALETTE8_RGB5_A1_OES:
    843       return ctx->API == API_OPENGLES;
    844 #endif
    845    default:
    846       return GL_FALSE;
    847    }
    848 }
    849 
    850 
    851 /**
    852  * Convert various base formats to the cooresponding integer format.
    853  */
    854 GLenum
    855 _mesa_base_format_to_integer_format(GLenum format)
    856 {
    857    switch(format) {
    858    case GL_RED:
    859       return GL_RED_INTEGER;
    860    case GL_GREEN:
    861       return GL_GREEN_INTEGER;
    862    case GL_BLUE:
    863       return GL_BLUE_INTEGER;
    864    case GL_RG:
    865       return GL_RG_INTEGER;
    866    case GL_RGB:
    867       return GL_RGB_INTEGER;
    868    case GL_RGBA:
    869       return GL_RGBA_INTEGER;
    870    case GL_BGR:
    871       return GL_BGR_INTEGER;
    872    case GL_BGRA:
    873       return GL_BGRA_INTEGER;
    874    case GL_ALPHA:
    875       return GL_ALPHA_INTEGER;
    876    case GL_LUMINANCE:
    877       return GL_LUMINANCE_INTEGER_EXT;
    878    case GL_LUMINANCE_ALPHA:
    879       return GL_LUMINANCE_ALPHA_INTEGER_EXT;
    880    }
    881 
    882    return format;
    883 }
    884 
    885 
    886 /**
    887  * Does the given base texture/renderbuffer format have the channel
    888  * named by 'pname'?
    889  */
    890 GLboolean
    891 _mesa_base_format_has_channel(GLenum base_format, GLenum pname)
    892 {
    893    switch (pname) {
    894    case GL_TEXTURE_RED_SIZE:
    895    case GL_TEXTURE_RED_TYPE:
    896    case GL_RENDERBUFFER_RED_SIZE_EXT:
    897    case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
    898       if (base_format == GL_RED ||
    899 	  base_format == GL_RG ||
    900 	  base_format == GL_RGB ||
    901 	  base_format == GL_RGBA) {
    902 	 return GL_TRUE;
    903       }
    904       return GL_FALSE;
    905    case GL_TEXTURE_GREEN_SIZE:
    906    case GL_TEXTURE_GREEN_TYPE:
    907    case GL_RENDERBUFFER_GREEN_SIZE_EXT:
    908    case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
    909       if (base_format == GL_RG ||
    910 	  base_format == GL_RGB ||
    911 	  base_format == GL_RGBA) {
    912 	 return GL_TRUE;
    913       }
    914       return GL_FALSE;
    915    case GL_TEXTURE_BLUE_SIZE:
    916    case GL_TEXTURE_BLUE_TYPE:
    917    case GL_RENDERBUFFER_BLUE_SIZE_EXT:
    918    case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
    919       if (base_format == GL_RGB ||
    920 	  base_format == GL_RGBA) {
    921 	 return GL_TRUE;
    922       }
    923       return GL_FALSE;
    924    case GL_TEXTURE_ALPHA_SIZE:
    925    case GL_TEXTURE_ALPHA_TYPE:
    926    case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
    927    case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
    928       if (base_format == GL_RGBA ||
    929 	  base_format == GL_ALPHA ||
    930 	  base_format == GL_LUMINANCE_ALPHA) {
    931 	 return GL_TRUE;
    932       }
    933       return GL_FALSE;
    934    case GL_TEXTURE_LUMINANCE_SIZE:
    935    case GL_TEXTURE_LUMINANCE_TYPE:
    936       if (base_format == GL_LUMINANCE ||
    937 	  base_format == GL_LUMINANCE_ALPHA) {
    938 	 return GL_TRUE;
    939       }
    940       return GL_FALSE;
    941    case GL_TEXTURE_INTENSITY_SIZE:
    942    case GL_TEXTURE_INTENSITY_TYPE:
    943       if (base_format == GL_INTENSITY) {
    944 	 return GL_TRUE;
    945       }
    946       return GL_FALSE;
    947    case GL_TEXTURE_DEPTH_SIZE:
    948    case GL_TEXTURE_DEPTH_TYPE:
    949    case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
    950    case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
    951       if (base_format == GL_DEPTH_STENCIL ||
    952 	  base_format == GL_DEPTH_COMPONENT) {
    953 	 return GL_TRUE;
    954       }
    955       return GL_FALSE;
    956    case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
    957    case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
    958       if (base_format == GL_DEPTH_STENCIL ||
    959 	  base_format == GL_STENCIL_INDEX) {
    960 	 return GL_TRUE;
    961       }
    962       return GL_FALSE;
    963    default:
    964       _mesa_warning(NULL, "%s: Unexpected channel token 0x%x\n",
    965 		    __FUNCTION__, pname);
    966       return GL_FALSE;
    967    }
    968 
    969    return GL_FALSE;
    970 }
    971 
    972 
    973 /**
    974  * If format is a generic compressed format, return the corresponding
    975  * non-compressed format.  For other formats, return the format as-is.
    976  */
    977 GLenum
    978 _mesa_generic_compressed_format_to_uncompressed_format(GLenum format)
    979 {
    980    switch (format) {
    981    case GL_COMPRESSED_RED:
    982       return GL_RED;
    983    case GL_COMPRESSED_RG:
    984       return GL_RG;
    985    case GL_COMPRESSED_RGB:
    986       return GL_RGB;
    987    case GL_COMPRESSED_RGBA:
    988       return GL_RGBA;
    989    case GL_COMPRESSED_ALPHA:
    990       return GL_ALPHA;
    991    case GL_COMPRESSED_LUMINANCE:
    992       return GL_LUMINANCE;
    993    case GL_COMPRESSED_LUMINANCE_ALPHA:
    994       return GL_LUMINANCE_ALPHA;
    995    case GL_COMPRESSED_INTENSITY:
    996       return GL_INTENSITY;
    997    /* sRGB formats */
    998    case GL_COMPRESSED_SRGB:
    999       return GL_SRGB;
   1000    case GL_COMPRESSED_SRGB_ALPHA:
   1001       return GL_SRGB_ALPHA;
   1002    case GL_COMPRESSED_SLUMINANCE:
   1003       return GL_SLUMINANCE;
   1004    case GL_COMPRESSED_SLUMINANCE_ALPHA:
   1005       return GL_SLUMINANCE_ALPHA;
   1006    default:
   1007       return format;
   1008    }
   1009 }
   1010 
   1011 
   1012 /**
   1013  * Do error checking of format/type combinations for glReadPixels,
   1014  * glDrawPixels and glTex[Sub]Image.  Note that depending on the format
   1015  * and type values, we may either generate GL_INVALID_OPERATION or
   1016  * GL_INVALID_ENUM.
   1017  *
   1018  * \param format pixel format.
   1019  * \param type pixel type.
   1020  *
   1021  * \return GL_INVALID_ENUM, GL_INVALID_OPERATION or GL_NO_ERROR
   1022  */
   1023 GLenum
   1024 _mesa_error_check_format_and_type(const struct gl_context *ctx,
   1025                                   GLenum format, GLenum type)
   1026 {
   1027    /* special type-based checks (see glReadPixels, glDrawPixels error lists) */
   1028    switch (type) {
   1029    case GL_BITMAP:
   1030       if (format != GL_COLOR_INDEX && format != GL_STENCIL_INDEX) {
   1031          return GL_INVALID_ENUM;
   1032       }
   1033       break;
   1034 
   1035    case GL_UNSIGNED_BYTE_3_3_2:
   1036    case GL_UNSIGNED_BYTE_2_3_3_REV:
   1037    case GL_UNSIGNED_SHORT_5_6_5:
   1038    case GL_UNSIGNED_SHORT_5_6_5_REV:
   1039       if (format == GL_RGB) {
   1040          break; /* OK */
   1041       }
   1042       if (format == GL_RGB_INTEGER_EXT &&
   1043           ctx->Extensions.ARB_texture_rgb10_a2ui) {
   1044          break; /* OK */
   1045       }
   1046       return GL_INVALID_OPERATION;
   1047 
   1048    case GL_UNSIGNED_SHORT_4_4_4_4:
   1049    case GL_UNSIGNED_SHORT_4_4_4_4_REV:
   1050    case GL_UNSIGNED_SHORT_5_5_5_1:
   1051    case GL_UNSIGNED_SHORT_1_5_5_5_REV:
   1052    case GL_UNSIGNED_INT_8_8_8_8:
   1053    case GL_UNSIGNED_INT_8_8_8_8_REV:
   1054    case GL_UNSIGNED_INT_10_10_10_2:
   1055    case GL_UNSIGNED_INT_2_10_10_10_REV:
   1056       if (format == GL_RGBA ||
   1057           format == GL_BGRA ||
   1058           format == GL_ABGR_EXT) {
   1059          break; /* OK */
   1060       }
   1061       if ((format == GL_RGBA_INTEGER_EXT || format == GL_BGRA_INTEGER_EXT) &&
   1062           ctx->Extensions.ARB_texture_rgb10_a2ui) {
   1063          break; /* OK */
   1064       }
   1065       return GL_INVALID_OPERATION;
   1066 
   1067    case GL_UNSIGNED_INT_24_8:
   1068       if (!ctx->Extensions.EXT_packed_depth_stencil) {
   1069          return GL_INVALID_ENUM;
   1070       }
   1071       if (format != GL_DEPTH_STENCIL) {
   1072          return GL_INVALID_OPERATION;
   1073       }
   1074       return GL_NO_ERROR;
   1075 
   1076    case GL_FLOAT_32_UNSIGNED_INT_24_8_REV:
   1077       if (!ctx->Extensions.ARB_depth_buffer_float) {
   1078          return GL_INVALID_ENUM;
   1079       }
   1080       if (format != GL_DEPTH_STENCIL) {
   1081          return GL_INVALID_OPERATION;
   1082       }
   1083       return GL_NO_ERROR;
   1084 
   1085    case GL_UNSIGNED_INT_10F_11F_11F_REV:
   1086       if (!ctx->Extensions.EXT_packed_float) {
   1087          return GL_INVALID_ENUM;
   1088       }
   1089       if (format != GL_RGB) {
   1090          return GL_INVALID_OPERATION;
   1091       }
   1092       return GL_NO_ERROR;
   1093 
   1094    default:
   1095       ; /* fall-through */
   1096    }
   1097 
   1098    /* now, for each format, check the type for compatibility */
   1099    switch (format) {
   1100       case GL_COLOR_INDEX:
   1101       case GL_STENCIL_INDEX:
   1102          switch (type) {
   1103             case GL_BITMAP:
   1104             case GL_BYTE:
   1105             case GL_UNSIGNED_BYTE:
   1106             case GL_SHORT:
   1107             case GL_UNSIGNED_SHORT:
   1108             case GL_INT:
   1109             case GL_UNSIGNED_INT:
   1110             case GL_FLOAT:
   1111                return GL_NO_ERROR;
   1112             case GL_HALF_FLOAT:
   1113                return ctx->Extensions.ARB_half_float_pixel
   1114                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1115             default:
   1116                return GL_INVALID_ENUM;
   1117          }
   1118 
   1119       case GL_RED:
   1120       case GL_GREEN:
   1121       case GL_BLUE:
   1122       case GL_ALPHA:
   1123 #if 0 /* not legal!  see table 3.6 of the 1.5 spec */
   1124       case GL_INTENSITY:
   1125 #endif
   1126       case GL_LUMINANCE:
   1127       case GL_LUMINANCE_ALPHA:
   1128       case GL_DEPTH_COMPONENT:
   1129          switch (type) {
   1130             case GL_BYTE:
   1131             case GL_UNSIGNED_BYTE:
   1132             case GL_SHORT:
   1133             case GL_UNSIGNED_SHORT:
   1134             case GL_INT:
   1135             case GL_UNSIGNED_INT:
   1136             case GL_FLOAT:
   1137                return GL_NO_ERROR;
   1138             case GL_HALF_FLOAT:
   1139                return ctx->Extensions.ARB_half_float_pixel
   1140                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1141             default:
   1142                return GL_INVALID_ENUM;
   1143          }
   1144 
   1145       case GL_RG:
   1146 	 if (!ctx->Extensions.ARB_texture_rg)
   1147 	    return GL_INVALID_ENUM;
   1148          switch (type) {
   1149             case GL_BYTE:
   1150             case GL_UNSIGNED_BYTE:
   1151             case GL_SHORT:
   1152             case GL_UNSIGNED_SHORT:
   1153             case GL_INT:
   1154             case GL_UNSIGNED_INT:
   1155             case GL_FLOAT:
   1156                return GL_NO_ERROR;
   1157             case GL_HALF_FLOAT:
   1158                return ctx->Extensions.ARB_half_float_pixel
   1159                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1160             default:
   1161                return GL_INVALID_ENUM;
   1162          }
   1163 
   1164       case GL_RGB:
   1165          switch (type) {
   1166             case GL_BYTE:
   1167             case GL_UNSIGNED_BYTE:
   1168             case GL_SHORT:
   1169             case GL_UNSIGNED_SHORT:
   1170             case GL_INT:
   1171             case GL_UNSIGNED_INT:
   1172             case GL_FLOAT:
   1173             case GL_UNSIGNED_BYTE_3_3_2:
   1174             case GL_UNSIGNED_BYTE_2_3_3_REV:
   1175             case GL_UNSIGNED_SHORT_5_6_5:
   1176             case GL_UNSIGNED_SHORT_5_6_5_REV:
   1177                return GL_NO_ERROR;
   1178             case GL_HALF_FLOAT:
   1179                return ctx->Extensions.ARB_half_float_pixel
   1180                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1181             case GL_UNSIGNED_INT_5_9_9_9_REV:
   1182                return ctx->Extensions.EXT_texture_shared_exponent
   1183                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1184             case GL_UNSIGNED_INT_10F_11F_11F_REV:
   1185                return ctx->Extensions.EXT_packed_float
   1186                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1187             default:
   1188                return GL_INVALID_ENUM;
   1189          }
   1190 
   1191       case GL_BGR:
   1192          switch (type) {
   1193             /* NOTE: no packed types are supported with BGR.  That's
   1194              * intentional, according to the GL spec.
   1195              */
   1196             case GL_BYTE:
   1197             case GL_UNSIGNED_BYTE:
   1198             case GL_SHORT:
   1199             case GL_UNSIGNED_SHORT:
   1200             case GL_INT:
   1201             case GL_UNSIGNED_INT:
   1202             case GL_FLOAT:
   1203                return GL_NO_ERROR;
   1204             case GL_HALF_FLOAT:
   1205                return ctx->Extensions.ARB_half_float_pixel
   1206                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1207             default:
   1208                return GL_INVALID_ENUM;
   1209          }
   1210 
   1211       case GL_RGBA:
   1212       case GL_BGRA:
   1213       case GL_ABGR_EXT:
   1214          switch (type) {
   1215             case GL_BYTE:
   1216             case GL_UNSIGNED_BYTE:
   1217             case GL_SHORT:
   1218             case GL_UNSIGNED_SHORT:
   1219             case GL_INT:
   1220             case GL_UNSIGNED_INT:
   1221             case GL_FLOAT:
   1222             case GL_UNSIGNED_SHORT_4_4_4_4:
   1223             case GL_UNSIGNED_SHORT_4_4_4_4_REV:
   1224             case GL_UNSIGNED_SHORT_5_5_5_1:
   1225             case GL_UNSIGNED_SHORT_1_5_5_5_REV:
   1226             case GL_UNSIGNED_INT_8_8_8_8:
   1227             case GL_UNSIGNED_INT_8_8_8_8_REV:
   1228             case GL_UNSIGNED_INT_10_10_10_2:
   1229             case GL_UNSIGNED_INT_2_10_10_10_REV:
   1230                return GL_NO_ERROR;
   1231             case GL_HALF_FLOAT:
   1232                return ctx->Extensions.ARB_half_float_pixel
   1233                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1234             default:
   1235                return GL_INVALID_ENUM;
   1236          }
   1237 
   1238       case GL_YCBCR_MESA:
   1239          if (!ctx->Extensions.MESA_ycbcr_texture)
   1240             return GL_INVALID_ENUM;
   1241          if (type == GL_UNSIGNED_SHORT_8_8_MESA ||
   1242              type == GL_UNSIGNED_SHORT_8_8_REV_MESA)
   1243             return GL_NO_ERROR;
   1244          else
   1245             return GL_INVALID_OPERATION;
   1246 
   1247       case GL_DEPTH_STENCIL_EXT:
   1248          if (ctx->Extensions.EXT_packed_depth_stencil &&
   1249              type == GL_UNSIGNED_INT_24_8)
   1250             return GL_NO_ERROR;
   1251          else if (ctx->Extensions.ARB_depth_buffer_float &&
   1252              type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV)
   1253             return GL_NO_ERROR;
   1254          else
   1255             return GL_INVALID_ENUM;
   1256 
   1257       case GL_DUDV_ATI:
   1258       case GL_DU8DV8_ATI:
   1259          if (!ctx->Extensions.ATI_envmap_bumpmap)
   1260             return GL_INVALID_ENUM;
   1261          switch (type) {
   1262             case GL_BYTE:
   1263             case GL_UNSIGNED_BYTE:
   1264             case GL_SHORT:
   1265             case GL_UNSIGNED_SHORT:
   1266             case GL_INT:
   1267             case GL_UNSIGNED_INT:
   1268             case GL_FLOAT:
   1269                return GL_NO_ERROR;
   1270             default:
   1271                return GL_INVALID_ENUM;
   1272          }
   1273 
   1274       /* integer-valued formats */
   1275       case GL_RED_INTEGER_EXT:
   1276       case GL_GREEN_INTEGER_EXT:
   1277       case GL_BLUE_INTEGER_EXT:
   1278       case GL_ALPHA_INTEGER_EXT:
   1279       case GL_RG_INTEGER:
   1280          switch (type) {
   1281             case GL_BYTE:
   1282             case GL_UNSIGNED_BYTE:
   1283             case GL_SHORT:
   1284             case GL_UNSIGNED_SHORT:
   1285             case GL_INT:
   1286             case GL_UNSIGNED_INT:
   1287                return (ctx->Version >= 30 ||
   1288                        ctx->Extensions.EXT_texture_integer)
   1289                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1290             default:
   1291                return GL_INVALID_ENUM;
   1292          }
   1293 
   1294       case GL_RGB_INTEGER_EXT:
   1295          switch (type) {
   1296             case GL_BYTE:
   1297             case GL_UNSIGNED_BYTE:
   1298             case GL_SHORT:
   1299             case GL_UNSIGNED_SHORT:
   1300             case GL_INT:
   1301             case GL_UNSIGNED_INT:
   1302                return (ctx->Version >= 30 ||
   1303                        ctx->Extensions.EXT_texture_integer)
   1304                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1305             case GL_UNSIGNED_BYTE_3_3_2:
   1306             case GL_UNSIGNED_BYTE_2_3_3_REV:
   1307             case GL_UNSIGNED_SHORT_5_6_5:
   1308             case GL_UNSIGNED_SHORT_5_6_5_REV:
   1309                return ctx->Extensions.ARB_texture_rgb10_a2ui
   1310                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1311             default:
   1312                return GL_INVALID_ENUM;
   1313          }
   1314 
   1315       case GL_BGR_INTEGER_EXT:
   1316          switch (type) {
   1317             case GL_BYTE:
   1318             case GL_UNSIGNED_BYTE:
   1319             case GL_SHORT:
   1320             case GL_UNSIGNED_SHORT:
   1321             case GL_INT:
   1322             case GL_UNSIGNED_INT:
   1323             /* NOTE: no packed formats w/ BGR format */
   1324                return (ctx->Version >= 30 ||
   1325                        ctx->Extensions.EXT_texture_integer)
   1326                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1327             default:
   1328                return GL_INVALID_ENUM;
   1329          }
   1330 
   1331       case GL_RGBA_INTEGER_EXT:
   1332       case GL_BGRA_INTEGER_EXT:
   1333          switch (type) {
   1334             case GL_BYTE:
   1335             case GL_UNSIGNED_BYTE:
   1336             case GL_SHORT:
   1337             case GL_UNSIGNED_SHORT:
   1338             case GL_INT:
   1339             case GL_UNSIGNED_INT:
   1340                return (ctx->Version >= 30 ||
   1341                        ctx->Extensions.EXT_texture_integer)
   1342                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1343             case GL_UNSIGNED_SHORT_4_4_4_4:
   1344             case GL_UNSIGNED_SHORT_4_4_4_4_REV:
   1345             case GL_UNSIGNED_SHORT_5_5_5_1:
   1346             case GL_UNSIGNED_SHORT_1_5_5_5_REV:
   1347             case GL_UNSIGNED_INT_8_8_8_8:
   1348             case GL_UNSIGNED_INT_8_8_8_8_REV:
   1349             case GL_UNSIGNED_INT_10_10_10_2:
   1350             case GL_UNSIGNED_INT_2_10_10_10_REV:
   1351                return ctx->Extensions.ARB_texture_rgb10_a2ui
   1352                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1353             default:
   1354                return GL_INVALID_ENUM;
   1355          }
   1356 
   1357       case GL_LUMINANCE_INTEGER_EXT:
   1358       case GL_LUMINANCE_ALPHA_INTEGER_EXT:
   1359          switch (type) {
   1360             case GL_BYTE:
   1361             case GL_UNSIGNED_BYTE:
   1362             case GL_SHORT:
   1363             case GL_UNSIGNED_SHORT:
   1364             case GL_INT:
   1365             case GL_UNSIGNED_INT:
   1366                return ctx->Extensions.EXT_texture_integer
   1367                   ? GL_NO_ERROR : GL_INVALID_ENUM;
   1368             default:
   1369                return GL_INVALID_ENUM;
   1370          }
   1371 
   1372       default:
   1373          return GL_INVALID_ENUM;
   1374    }
   1375    return GL_NO_ERROR;
   1376 }
   1377