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  *
      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 #include "imports.h"
     28 #include "formats.h"
     29 #include "macros.h"
     30 #include "glformats.h"
     31 #include "c11/threads.h"
     32 #include "util/hash_table.h"
     33 
     34 /**
     35  * Information about texture formats.
     36  */
     37 struct gl_format_info
     38 {
     39    mesa_format Name;
     40 
     41    /** text name for debugging */
     42    const char *StrName;
     43 
     44    enum mesa_format_layout Layout;
     45 
     46    /**
     47     * Base format is one of GL_RED, GL_RG, GL_RGB, GL_RGBA, GL_ALPHA,
     48     * GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY, GL_YCBCR_MESA,
     49     * GL_DEPTH_COMPONENT, GL_STENCIL_INDEX, GL_DEPTH_STENCIL.
     50     */
     51    GLenum BaseFormat;
     52 
     53    /**
     54     * Logical data type: one of  GL_UNSIGNED_NORMALIZED, GL_SIGNED_NORMALIZED,
     55     * GL_UNSIGNED_INT, GL_INT, GL_FLOAT.
     56     */
     57    GLenum DataType;
     58 
     59    GLubyte RedBits;
     60    GLubyte GreenBits;
     61    GLubyte BlueBits;
     62    GLubyte AlphaBits;
     63    GLubyte LuminanceBits;
     64    GLubyte IntensityBits;
     65    GLubyte DepthBits;
     66    GLubyte StencilBits;
     67 
     68    bool IsSRGBFormat;
     69 
     70    /**
     71     * To describe compressed formats.  If not compressed, Width=Height=Depth=1.
     72     */
     73    GLubyte BlockWidth, BlockHeight, BlockDepth;
     74    GLubyte BytesPerBlock;
     75 
     76    uint8_t Swizzle[4];
     77    mesa_array_format ArrayFormat;
     78 };
     79 
     80 #include "format_info.h"
     81 
     82 static const struct gl_format_info *
     83 _mesa_get_format_info(mesa_format format)
     84 {
     85    const struct gl_format_info *info = &format_info[format];
     86    STATIC_ASSERT(ARRAY_SIZE(format_info) == MESA_FORMAT_COUNT);
     87    assert(info->Name == format);
     88    return info;
     89 }
     90 
     91 
     92 /** Return string name of format (for debugging) */
     93 const char *
     94 _mesa_get_format_name(mesa_format format)
     95 {
     96    const struct gl_format_info *info = _mesa_get_format_info(format);
     97    return info->StrName;
     98 }
     99 
    100 
    101 
    102 /**
    103  * Return bytes needed to store a block of pixels in the given format.
    104  * Normally, a block is 1x1 (a single pixel).  But for compressed formats
    105  * a block may be 4x4 or 8x4, etc.
    106  *
    107  * Note: not GLuint, so as not to coerce math to unsigned. cf. fdo #37351
    108  */
    109 GLint
    110 _mesa_get_format_bytes(mesa_format format)
    111 {
    112    if (_mesa_format_is_mesa_array_format(format)) {
    113       return _mesa_array_format_get_type_size(format) *
    114              _mesa_array_format_get_num_channels(format);
    115    }
    116 
    117    const struct gl_format_info *info = _mesa_get_format_info(format);
    118    assert(info->BytesPerBlock);
    119    assert(info->BytesPerBlock <= MAX_PIXEL_BYTES ||
    120           _mesa_is_format_compressed(format));
    121    return info->BytesPerBlock;
    122 }
    123 
    124 
    125 /**
    126  * Return bits per component for the given format.
    127  * \param format  one of MESA_FORMAT_x
    128  * \param pname  the component, such as GL_RED_BITS, GL_TEXTURE_BLUE_BITS, etc.
    129  */
    130 GLint
    131 _mesa_get_format_bits(mesa_format format, GLenum pname)
    132 {
    133    const struct gl_format_info *info = _mesa_get_format_info(format);
    134 
    135    switch (pname) {
    136    case GL_RED_BITS:
    137    case GL_TEXTURE_RED_SIZE:
    138    case GL_RENDERBUFFER_RED_SIZE_EXT:
    139    case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
    140    case GL_INTERNALFORMAT_RED_SIZE:
    141       return info->RedBits;
    142    case GL_GREEN_BITS:
    143    case GL_TEXTURE_GREEN_SIZE:
    144    case GL_RENDERBUFFER_GREEN_SIZE_EXT:
    145    case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
    146    case GL_INTERNALFORMAT_GREEN_SIZE:
    147       return info->GreenBits;
    148    case GL_BLUE_BITS:
    149    case GL_TEXTURE_BLUE_SIZE:
    150    case GL_RENDERBUFFER_BLUE_SIZE_EXT:
    151    case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
    152    case GL_INTERNALFORMAT_BLUE_SIZE:
    153       return info->BlueBits;
    154    case GL_ALPHA_BITS:
    155    case GL_TEXTURE_ALPHA_SIZE:
    156    case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
    157    case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
    158    case GL_INTERNALFORMAT_ALPHA_SIZE:
    159       return info->AlphaBits;
    160    case GL_TEXTURE_INTENSITY_SIZE:
    161       return info->IntensityBits;
    162    case GL_TEXTURE_LUMINANCE_SIZE:
    163       return info->LuminanceBits;
    164    case GL_INDEX_BITS:
    165       return 0;
    166    case GL_DEPTH_BITS:
    167    case GL_TEXTURE_DEPTH_SIZE_ARB:
    168    case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
    169    case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
    170    case GL_INTERNALFORMAT_DEPTH_SIZE:
    171       return info->DepthBits;
    172    case GL_STENCIL_BITS:
    173    case GL_TEXTURE_STENCIL_SIZE_EXT:
    174    case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
    175    case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
    176    case GL_INTERNALFORMAT_STENCIL_SIZE:
    177       return info->StencilBits;
    178    default:
    179       _mesa_problem(NULL, "bad pname in _mesa_get_format_bits()");
    180       return 0;
    181    }
    182 }
    183 
    184 
    185 GLuint
    186 _mesa_get_format_max_bits(mesa_format format)
    187 {
    188    const struct gl_format_info *info = _mesa_get_format_info(format);
    189    GLuint max = MAX2(info->RedBits, info->GreenBits);
    190    max = MAX2(max, info->BlueBits);
    191    max = MAX2(max, info->AlphaBits);
    192    max = MAX2(max, info->LuminanceBits);
    193    max = MAX2(max, info->IntensityBits);
    194    max = MAX2(max, info->DepthBits);
    195    max = MAX2(max, info->StencilBits);
    196    return max;
    197 }
    198 
    199 
    200 /**
    201  * Return the layout type of the given format.
    202  */
    203 extern enum mesa_format_layout
    204 _mesa_get_format_layout(mesa_format format)
    205 {
    206    const struct gl_format_info *info = _mesa_get_format_info(format);
    207    return info->Layout;
    208 }
    209 
    210 
    211 /**
    212  * Return the data type (or more specifically, the data representation)
    213  * for the given format.
    214  * The return value will be one of:
    215  *    GL_UNSIGNED_NORMALIZED = unsigned int representing [0,1]
    216  *    GL_SIGNED_NORMALIZED = signed int representing [-1, 1]
    217  *    GL_UNSIGNED_INT = an ordinary unsigned integer
    218  *    GL_INT = an ordinary signed integer
    219  *    GL_FLOAT = an ordinary float
    220  */
    221 GLenum
    222 _mesa_get_format_datatype(mesa_format format)
    223 {
    224    const struct gl_format_info *info = _mesa_get_format_info(format);
    225    return info->DataType;
    226 }
    227 
    228 static GLenum
    229 get_base_format_for_array_format(mesa_array_format format)
    230 {
    231    uint8_t swizzle[4];
    232    int num_channels;
    233 
    234    _mesa_array_format_get_swizzle(format, swizzle);
    235    num_channels = _mesa_array_format_get_num_channels(format);
    236 
    237    switch (num_channels) {
    238    case 4:
    239       /* FIXME: RGBX formats have 4 channels, but their base format is GL_RGB.
    240        * This is not really a problem for now because we only create array
    241        * formats from GL format/type combinations, and these cannot specify
    242        * RGBX formats.
    243        */
    244       return GL_RGBA;
    245    case 3:
    246       return GL_RGB;
    247    case 2:
    248       if (swizzle[0] == 0 &&
    249           swizzle[1] == 0 &&
    250           swizzle[2] == 0 &&
    251           swizzle[3] == 1)
    252          return GL_LUMINANCE_ALPHA;
    253       if (swizzle[0] == 1 &&
    254           swizzle[1] == 1 &&
    255           swizzle[2] == 1 &&
    256           swizzle[3] == 0)
    257          return GL_LUMINANCE_ALPHA;
    258       if (swizzle[0] == 0 &&
    259           swizzle[1] == 1 &&
    260           swizzle[2] == 4 &&
    261           swizzle[3] == 5)
    262          return GL_RG;
    263       if (swizzle[0] == 1 &&
    264           swizzle[1] == 0 &&
    265           swizzle[2] == 4 &&
    266           swizzle[3] == 5)
    267          return GL_RG;
    268       break;
    269    case 1:
    270       if (swizzle[0] == 0 &&
    271           swizzle[1] == 0 &&
    272           swizzle[2] == 0 &&
    273           swizzle[3] == 5)
    274          return GL_LUMINANCE;
    275       if (swizzle[0] == 0 &&
    276           swizzle[1] == 0 &&
    277           swizzle[2] == 0 &&
    278           swizzle[3] == 0)
    279          return GL_INTENSITY;
    280       if (swizzle[0] <= MESA_FORMAT_SWIZZLE_W)
    281          return GL_RED;
    282       if (swizzle[1] <= MESA_FORMAT_SWIZZLE_W)
    283          return GL_GREEN;
    284       if (swizzle[2] <= MESA_FORMAT_SWIZZLE_W)
    285          return GL_BLUE;
    286       if (swizzle[3] <= MESA_FORMAT_SWIZZLE_W)
    287          return GL_ALPHA;
    288       break;
    289    }
    290 
    291    unreachable("Unsupported format");
    292 }
    293 
    294 /**
    295  * Return the basic format for the given type.  The result will be one of
    296  * GL_RGB, GL_RGBA, GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY,
    297  * GL_YCBCR_MESA, GL_DEPTH_COMPONENT, GL_STENCIL_INDEX, GL_DEPTH_STENCIL.
    298  * This functions accepts a mesa_format or a mesa_array_format.
    299  */
    300 GLenum
    301 _mesa_get_format_base_format(uint32_t format)
    302 {
    303    if (!_mesa_format_is_mesa_array_format(format)) {
    304       const struct gl_format_info *info = _mesa_get_format_info(format);
    305       return info->BaseFormat;
    306    } else {
    307       return get_base_format_for_array_format(format);
    308    }
    309 }
    310 
    311 
    312 /**
    313  * Return the block size (in pixels) for the given format.  Normally
    314  * the block size is 1x1.  But compressed formats will have block sizes
    315  * of 4x4 or 8x4 pixels, etc.
    316  * \param bw  returns block width in pixels
    317  * \param bh  returns block height in pixels
    318  */
    319 void
    320 _mesa_get_format_block_size(mesa_format format, GLuint *bw, GLuint *bh)
    321 {
    322    const struct gl_format_info *info = _mesa_get_format_info(format);
    323    /* Use _mesa_get_format_block_size_3d() for 3D blocks. */
    324    assert(info->BlockDepth == 1);
    325 
    326    *bw = info->BlockWidth;
    327    *bh = info->BlockHeight;
    328 }
    329 
    330 
    331 /**
    332  * Return the block size (in pixels) for the given format. Normally
    333  * the block size is 1x1x1. But compressed formats will have block
    334  * sizes of 4x4x4, 3x3x3 pixels, etc.
    335  * \param bw  returns block width in pixels
    336  * \param bh  returns block height in pixels
    337  * \param bd  returns block depth in pixels
    338  */
    339 void
    340 _mesa_get_format_block_size_3d(mesa_format format,
    341                                GLuint *bw,
    342                                GLuint *bh,
    343                                GLuint *bd)
    344 {
    345    const struct gl_format_info *info = _mesa_get_format_info(format);
    346    *bw = info->BlockWidth;
    347    *bh = info->BlockHeight;
    348    *bd = info->BlockDepth;
    349 }
    350 
    351 
    352 /**
    353  * Returns the an array of four numbers representing the transformation
    354  * from the RGBA or SZ colorspace to the given format.  For array formats,
    355  * the i'th RGBA component is given by:
    356  *
    357  * if (swizzle[i] <= MESA_FORMAT_SWIZZLE_W)
    358  *    comp = data[swizzle[i]];
    359  * else if (swizzle[i] == MESA_FORMAT_SWIZZLE_ZERO)
    360  *    comp = 0;
    361  * else if (swizzle[i] == MESA_FORMAT_SWIZZLE_ONE)
    362  *    comp = 1;
    363  * else if (swizzle[i] == MESA_FORMAT_SWIZZLE_NONE)
    364  *    // data does not contain a channel of this format
    365  *
    366  * For packed formats, the swizzle gives the number of components left of
    367  * the least significant bit.
    368  *
    369  * Compressed formats have no swizzle.
    370  */
    371 void
    372 _mesa_get_format_swizzle(mesa_format format, uint8_t swizzle_out[4])
    373 {
    374    const struct gl_format_info *info = _mesa_get_format_info(format);
    375    memcpy(swizzle_out, info->Swizzle, sizeof(info->Swizzle));
    376 }
    377 
    378 mesa_array_format
    379 _mesa_array_format_flip_channels(mesa_array_format format)
    380 {
    381    int num_channels;
    382    uint8_t swizzle[4];
    383 
    384    num_channels = _mesa_array_format_get_num_channels(format);
    385    _mesa_array_format_get_swizzle(format, swizzle);
    386 
    387    if (num_channels == 1)
    388       return format;
    389 
    390    if (num_channels == 2) {
    391       /* Assert that the swizzle makes sense for 2 channels */
    392       for (unsigned i = 0; i < 4; i++)
    393          assert(swizzle[i] != 2 && swizzle[i] != 3);
    394 
    395       static const uint8_t flip_xy[6] = { 1, 0, 2, 3, 4, 5 };
    396       _mesa_array_format_set_swizzle(&format,
    397                                      flip_xy[swizzle[0]], flip_xy[swizzle[1]],
    398                                      flip_xy[swizzle[2]], flip_xy[swizzle[3]]);
    399       return format;
    400    }
    401 
    402    if (num_channels == 4) {
    403       static const uint8_t flip[6] = { 3, 2, 1, 0, 4, 5 };
    404       _mesa_array_format_set_swizzle(&format,
    405                                      flip[swizzle[0]], flip[swizzle[1]],
    406                                      flip[swizzle[2]], flip[swizzle[3]]);
    407       return format;
    408    }
    409 
    410    unreachable("Invalid array format");
    411 }
    412 
    413 uint32_t
    414 _mesa_format_to_array_format(mesa_format format)
    415 {
    416    const struct gl_format_info *info = _mesa_get_format_info(format);
    417    if (info->ArrayFormat && !_mesa_little_endian() &&
    418        info->Layout == MESA_FORMAT_LAYOUT_PACKED)
    419       return _mesa_array_format_flip_channels(info->ArrayFormat);
    420    else
    421       return info->ArrayFormat;
    422 }
    423 
    424 static struct hash_table *format_array_format_table;
    425 static once_flag format_array_format_table_exists = ONCE_FLAG_INIT;
    426 
    427 static bool
    428 array_formats_equal(const void *a, const void *b)
    429 {
    430    return (intptr_t)a == (intptr_t)b;
    431 }
    432 
    433 static void
    434 format_array_format_table_init(void)
    435 {
    436    const struct gl_format_info *info;
    437    mesa_array_format array_format;
    438    unsigned f;
    439 
    440    format_array_format_table = _mesa_hash_table_create(NULL, NULL,
    441                                                        array_formats_equal);
    442 
    443    if (!format_array_format_table) {
    444       _mesa_error_no_memory(__func__);
    445       return;
    446    }
    447 
    448    for (f = 1; f < MESA_FORMAT_COUNT; ++f) {
    449       info = _mesa_get_format_info(f);
    450       if (!info->ArrayFormat)
    451          continue;
    452 
    453       if (_mesa_little_endian()) {
    454          array_format = info->ArrayFormat;
    455       } else {
    456          array_format = _mesa_array_format_flip_channels(info->ArrayFormat);
    457       }
    458 
    459       /* This can happen and does for some of the BGR formats.  Let's take
    460        * the first one in the list.
    461        */
    462       if (_mesa_hash_table_search_pre_hashed(format_array_format_table,
    463                                              array_format,
    464                                              (void *)(intptr_t)array_format))
    465          continue;
    466 
    467       _mesa_hash_table_insert_pre_hashed(format_array_format_table,
    468                                          array_format,
    469                                          (void *)(intptr_t)array_format,
    470                                          (void *)(intptr_t)f);
    471    }
    472 }
    473 
    474 mesa_format
    475 _mesa_format_from_array_format(uint32_t array_format)
    476 {
    477    struct hash_entry *entry;
    478 
    479    assert(_mesa_format_is_mesa_array_format(array_format));
    480 
    481    call_once(&format_array_format_table_exists, format_array_format_table_init);
    482 
    483    if (!format_array_format_table) {
    484       static const once_flag once_flag_init = ONCE_FLAG_INIT;
    485       format_array_format_table_exists = once_flag_init;
    486       return MESA_FORMAT_NONE;
    487    }
    488 
    489    entry = _mesa_hash_table_search_pre_hashed(format_array_format_table,
    490                                               array_format,
    491                                               (void *)(intptr_t)array_format);
    492    if (entry)
    493       return (intptr_t)entry->data;
    494    else
    495       return MESA_FORMAT_NONE;
    496 }
    497 
    498 /** Is the given format a compressed format? */
    499 GLboolean
    500 _mesa_is_format_compressed(mesa_format format)
    501 {
    502    const struct gl_format_info *info = _mesa_get_format_info(format);
    503    return info->BlockWidth > 1 || info->BlockHeight > 1;
    504 }
    505 
    506 
    507 /**
    508  * Determine if the given format represents a packed depth/stencil buffer.
    509  */
    510 GLboolean
    511 _mesa_is_format_packed_depth_stencil(mesa_format format)
    512 {
    513    const struct gl_format_info *info = _mesa_get_format_info(format);
    514 
    515    return info->BaseFormat == GL_DEPTH_STENCIL;
    516 }
    517 
    518 
    519 /**
    520  * Is the given format a signed/unsigned integer color format?
    521  */
    522 GLboolean
    523 _mesa_is_format_integer_color(mesa_format format)
    524 {
    525    const struct gl_format_info *info = _mesa_get_format_info(format);
    526    return (info->DataType == GL_INT || info->DataType == GL_UNSIGNED_INT) &&
    527       info->BaseFormat != GL_DEPTH_COMPONENT &&
    528       info->BaseFormat != GL_DEPTH_STENCIL &&
    529       info->BaseFormat != GL_STENCIL_INDEX;
    530 }
    531 
    532 
    533 /**
    534  * Is the given format an unsigned integer format?
    535  */
    536 GLboolean
    537 _mesa_is_format_unsigned(mesa_format format)
    538 {
    539    const struct gl_format_info *info = _mesa_get_format_info(format);
    540    return _mesa_is_type_unsigned(info->DataType);
    541 }
    542 
    543 
    544 /**
    545  * Does the given format store signed values?
    546  */
    547 GLboolean
    548 _mesa_is_format_signed(mesa_format format)
    549 {
    550    if (format == MESA_FORMAT_R11G11B10_FLOAT ||
    551        format == MESA_FORMAT_R9G9B9E5_FLOAT) {
    552       /* these packed float formats only store unsigned values */
    553       return GL_FALSE;
    554    }
    555    else {
    556       const struct gl_format_info *info = _mesa_get_format_info(format);
    557       return (info->DataType == GL_SIGNED_NORMALIZED ||
    558               info->DataType == GL_INT ||
    559               info->DataType == GL_FLOAT);
    560    }
    561 }
    562 
    563 /**
    564  * Is the given format an integer format?
    565  */
    566 GLboolean
    567 _mesa_is_format_integer(mesa_format format)
    568 {
    569    const struct gl_format_info *info = _mesa_get_format_info(format);
    570    return (info->DataType == GL_INT || info->DataType == GL_UNSIGNED_INT);
    571 }
    572 
    573 
    574 /**
    575  * Return true if the given format is a color format.
    576  */
    577 GLenum
    578 _mesa_is_format_color_format(mesa_format format)
    579 {
    580    const struct gl_format_info *info = _mesa_get_format_info(format);
    581    switch (info->BaseFormat) {
    582    case GL_DEPTH_COMPONENT:
    583    case GL_STENCIL_INDEX:
    584    case GL_DEPTH_STENCIL:
    585       return false;
    586    default:
    587       return true;
    588    }
    589 }
    590 
    591 
    592 /**
    593  * Return color encoding for given format.
    594  * \return GL_LINEAR or GL_SRGB
    595  */
    596 GLenum
    597 _mesa_get_format_color_encoding(mesa_format format)
    598 {
    599    const struct gl_format_info *info = _mesa_get_format_info(format);
    600    return info->IsSRGBFormat ? GL_SRGB : GL_LINEAR;
    601 }
    602 
    603 
    604 /**
    605  * Return TRUE if format is an ETC2 compressed format specified
    606  * by GL_ARB_ES3_compatibility.
    607  */
    608 bool
    609 _mesa_is_format_etc2(mesa_format format)
    610 {
    611    switch (format) {
    612    case MESA_FORMAT_ETC2_RGB8:
    613    case MESA_FORMAT_ETC2_SRGB8:
    614    case MESA_FORMAT_ETC2_RGBA8_EAC:
    615    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
    616    case MESA_FORMAT_ETC2_R11_EAC:
    617    case MESA_FORMAT_ETC2_RG11_EAC:
    618    case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
    619    case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
    620    case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
    621    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
    622       return GL_TRUE;
    623    default:
    624       return GL_FALSE;
    625    }
    626 }
    627 
    628 
    629 /**
    630  * If the given format is a compressed format, return a corresponding
    631  * uncompressed format.
    632  */
    633 mesa_format
    634 _mesa_get_uncompressed_format(mesa_format format)
    635 {
    636    switch (format) {
    637    case MESA_FORMAT_RGB_FXT1:
    638       return MESA_FORMAT_BGR_UNORM8;
    639    case MESA_FORMAT_RGBA_FXT1:
    640       return MESA_FORMAT_A8B8G8R8_UNORM;
    641    case MESA_FORMAT_RGB_DXT1:
    642    case MESA_FORMAT_SRGB_DXT1:
    643       return MESA_FORMAT_BGR_UNORM8;
    644    case MESA_FORMAT_RGBA_DXT1:
    645    case MESA_FORMAT_SRGBA_DXT1:
    646       return MESA_FORMAT_A8B8G8R8_UNORM;
    647    case MESA_FORMAT_RGBA_DXT3:
    648    case MESA_FORMAT_SRGBA_DXT3:
    649       return MESA_FORMAT_A8B8G8R8_UNORM;
    650    case MESA_FORMAT_RGBA_DXT5:
    651    case MESA_FORMAT_SRGBA_DXT5:
    652       return MESA_FORMAT_A8B8G8R8_UNORM;
    653    case MESA_FORMAT_R_RGTC1_UNORM:
    654       return MESA_FORMAT_R_UNORM8;
    655    case MESA_FORMAT_R_RGTC1_SNORM:
    656       return MESA_FORMAT_R_SNORM8;
    657    case MESA_FORMAT_RG_RGTC2_UNORM:
    658       return MESA_FORMAT_R8G8_UNORM;
    659    case MESA_FORMAT_RG_RGTC2_SNORM:
    660       return MESA_FORMAT_R8G8_SNORM;
    661    case MESA_FORMAT_L_LATC1_UNORM:
    662       return MESA_FORMAT_L_UNORM8;
    663    case MESA_FORMAT_L_LATC1_SNORM:
    664       return MESA_FORMAT_L_SNORM8;
    665    case MESA_FORMAT_LA_LATC2_UNORM:
    666       return MESA_FORMAT_L8A8_UNORM;
    667    case MESA_FORMAT_LA_LATC2_SNORM:
    668       return MESA_FORMAT_L8A8_SNORM;
    669    case MESA_FORMAT_ETC1_RGB8:
    670    case MESA_FORMAT_ETC2_RGB8:
    671    case MESA_FORMAT_ETC2_SRGB8:
    672       return MESA_FORMAT_BGR_UNORM8;
    673    case MESA_FORMAT_ETC2_RGBA8_EAC:
    674    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
    675    case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
    676    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
    677       return MESA_FORMAT_A8B8G8R8_UNORM;
    678    case MESA_FORMAT_ETC2_R11_EAC:
    679    case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
    680       return MESA_FORMAT_R_UNORM16;
    681    case MESA_FORMAT_ETC2_RG11_EAC:
    682    case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
    683       return MESA_FORMAT_R16G16_UNORM;
    684    case MESA_FORMAT_BPTC_RGBA_UNORM:
    685    case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
    686       return MESA_FORMAT_A8B8G8R8_UNORM;
    687    case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
    688    case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
    689       return MESA_FORMAT_RGB_FLOAT32;
    690    default:
    691 #ifdef DEBUG
    692       assert(!_mesa_is_format_compressed(format));
    693 #endif
    694       return format;
    695    }
    696 }
    697 
    698 
    699 GLuint
    700 _mesa_format_num_components(mesa_format format)
    701 {
    702    const struct gl_format_info *info = _mesa_get_format_info(format);
    703    return ((info->RedBits > 0) +
    704            (info->GreenBits > 0) +
    705            (info->BlueBits > 0) +
    706            (info->AlphaBits > 0) +
    707            (info->LuminanceBits > 0) +
    708            (info->IntensityBits > 0) +
    709            (info->DepthBits > 0) +
    710            (info->StencilBits > 0));
    711 }
    712 
    713 
    714 /**
    715  * Returns true if a color format has data stored in the R/G/B/A channels,
    716  * given an index from 0 to 3.
    717  */
    718 bool
    719 _mesa_format_has_color_component(mesa_format format, int component)
    720 {
    721    const struct gl_format_info *info = _mesa_get_format_info(format);
    722 
    723    assert(info->BaseFormat != GL_DEPTH_COMPONENT &&
    724           info->BaseFormat != GL_DEPTH_STENCIL &&
    725           info->BaseFormat != GL_STENCIL_INDEX);
    726 
    727    switch (component) {
    728    case 0:
    729       return (info->RedBits + info->IntensityBits + info->LuminanceBits) > 0;
    730    case 1:
    731       return (info->GreenBits + info->IntensityBits + info->LuminanceBits) > 0;
    732    case 2:
    733       return (info->BlueBits + info->IntensityBits + info->LuminanceBits) > 0;
    734    case 3:
    735       return (info->AlphaBits + info->IntensityBits) > 0;
    736    default:
    737       assert(!"Invalid color component: must be 0..3");
    738       return false;
    739    }
    740 }
    741 
    742 
    743 /**
    744  * Return number of bytes needed to store an image of the given size
    745  * in the given format.
    746  */
    747 GLuint
    748 _mesa_format_image_size(mesa_format format, GLsizei width,
    749                         GLsizei height, GLsizei depth)
    750 {
    751    const struct gl_format_info *info = _mesa_get_format_info(format);
    752    GLuint sz;
    753    /* Strictly speaking, a conditional isn't needed here */
    754    if (info->BlockWidth > 1 || info->BlockHeight > 1 || info->BlockDepth > 1) {
    755       /* compressed format (2D only for now) */
    756       const GLuint bw = info->BlockWidth;
    757       const GLuint bh = info->BlockHeight;
    758       const GLuint bd = info->BlockDepth;
    759       const GLuint wblocks = (width + bw - 1) / bw;
    760       const GLuint hblocks = (height + bh - 1) / bh;
    761       const GLuint dblocks = (depth + bd - 1) / bd;
    762       sz = wblocks * hblocks * dblocks * info->BytesPerBlock;
    763    } else
    764       /* non-compressed */
    765       sz = width * height * depth * info->BytesPerBlock;
    766 
    767    return sz;
    768 }
    769 
    770 
    771 /**
    772  * Same as _mesa_format_image_size() but returns a 64-bit value to
    773  * accommodate very large textures.
    774  */
    775 uint64_t
    776 _mesa_format_image_size64(mesa_format format, GLsizei width,
    777                           GLsizei height, GLsizei depth)
    778 {
    779    const struct gl_format_info *info = _mesa_get_format_info(format);
    780    uint64_t sz;
    781    /* Strictly speaking, a conditional isn't needed here */
    782    if (info->BlockWidth > 1 || info->BlockHeight > 1 || info->BlockDepth > 1) {
    783       /* compressed format (2D only for now) */
    784       const uint64_t bw = info->BlockWidth;
    785       const uint64_t bh = info->BlockHeight;
    786       const uint64_t bd = info->BlockDepth;
    787       const uint64_t wblocks = (width + bw - 1) / bw;
    788       const uint64_t hblocks = (height + bh - 1) / bh;
    789       const uint64_t dblocks = (depth + bd - 1) / bd;
    790       sz = wblocks * hblocks * dblocks * info->BytesPerBlock;
    791    } else
    792       /* non-compressed */
    793       sz = ((uint64_t) width * (uint64_t) height *
    794             (uint64_t) depth * info->BytesPerBlock);
    795 
    796    return sz;
    797 }
    798 
    799 
    800 
    801 GLint
    802 _mesa_format_row_stride(mesa_format format, GLsizei width)
    803 {
    804    const struct gl_format_info *info = _mesa_get_format_info(format);
    805    /* Strictly speaking, a conditional isn't needed here */
    806    if (info->BlockWidth > 1 || info->BlockHeight > 1) {
    807       /* compressed format */
    808       const GLuint bw = info->BlockWidth;
    809       const GLuint wblocks = (width + bw - 1) / bw;
    810       const GLint stride = wblocks * info->BytesPerBlock;
    811       return stride;
    812    }
    813    else {
    814       const GLint stride = width * info->BytesPerBlock;
    815       return stride;
    816    }
    817 }
    818 
    819 
    820 
    821 /**
    822  * Return datatype and number of components per texel for the given
    823  * uncompressed mesa_format. Only used for mipmap generation code.
    824  */
    825 void
    826 _mesa_uncompressed_format_to_type_and_comps(mesa_format format,
    827                                GLenum *datatype, GLuint *comps)
    828 {
    829    switch (format) {
    830    case MESA_FORMAT_A8B8G8R8_UNORM:
    831    case MESA_FORMAT_R8G8B8A8_UNORM:
    832    case MESA_FORMAT_B8G8R8A8_UNORM:
    833    case MESA_FORMAT_A8R8G8B8_UNORM:
    834    case MESA_FORMAT_X8B8G8R8_UNORM:
    835    case MESA_FORMAT_R8G8B8X8_UNORM:
    836    case MESA_FORMAT_B8G8R8X8_UNORM:
    837    case MESA_FORMAT_X8R8G8B8_UNORM:
    838    case MESA_FORMAT_A8B8G8R8_UINT:
    839    case MESA_FORMAT_R8G8B8A8_UINT:
    840    case MESA_FORMAT_B8G8R8A8_UINT:
    841    case MESA_FORMAT_A8R8G8B8_UINT:
    842       *datatype = GL_UNSIGNED_BYTE;
    843       *comps = 4;
    844       return;
    845    case MESA_FORMAT_BGR_UNORM8:
    846    case MESA_FORMAT_RGB_UNORM8:
    847       *datatype = GL_UNSIGNED_BYTE;
    848       *comps = 3;
    849       return;
    850    case MESA_FORMAT_B5G6R5_UNORM:
    851    case MESA_FORMAT_R5G6B5_UNORM:
    852    case MESA_FORMAT_B5G6R5_UINT:
    853    case MESA_FORMAT_R5G6B5_UINT:
    854       *datatype = GL_UNSIGNED_SHORT_5_6_5;
    855       *comps = 3;
    856       return;
    857 
    858    case MESA_FORMAT_B4G4R4A4_UNORM:
    859    case MESA_FORMAT_A4R4G4B4_UNORM:
    860    case MESA_FORMAT_B4G4R4X4_UNORM:
    861    case MESA_FORMAT_B4G4R4A4_UINT:
    862    case MESA_FORMAT_A4R4G4B4_UINT:
    863       *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
    864       *comps = 4;
    865       return;
    866 
    867    case MESA_FORMAT_B5G5R5A1_UNORM:
    868    case MESA_FORMAT_A1R5G5B5_UNORM:
    869    case MESA_FORMAT_B5G5R5X1_UNORM:
    870    case MESA_FORMAT_B5G5R5A1_UINT:
    871    case MESA_FORMAT_A1R5G5B5_UINT:
    872       *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
    873       *comps = 4;
    874       return;
    875 
    876    case MESA_FORMAT_B10G10R10A2_UNORM:
    877       *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
    878       *comps = 4;
    879       return;
    880 
    881    case MESA_FORMAT_A1B5G5R5_UNORM:
    882    case MESA_FORMAT_A1B5G5R5_UINT:
    883    case MESA_FORMAT_X1B5G5R5_UNORM:
    884       *datatype = GL_UNSIGNED_SHORT_5_5_5_1;
    885       *comps = 4;
    886       return;
    887 
    888    case MESA_FORMAT_L4A4_UNORM:
    889       *datatype = MESA_UNSIGNED_BYTE_4_4;
    890       *comps = 2;
    891       return;
    892 
    893    case MESA_FORMAT_L8A8_UNORM:
    894    case MESA_FORMAT_A8L8_UNORM:
    895    case MESA_FORMAT_R8G8_UNORM:
    896    case MESA_FORMAT_G8R8_UNORM:
    897       *datatype = GL_UNSIGNED_BYTE;
    898       *comps = 2;
    899       return;
    900 
    901    case MESA_FORMAT_L16A16_UNORM:
    902    case MESA_FORMAT_A16L16_UNORM:
    903    case MESA_FORMAT_R16G16_UNORM:
    904    case MESA_FORMAT_G16R16_UNORM:
    905       *datatype = GL_UNSIGNED_SHORT;
    906       *comps = 2;
    907       return;
    908 
    909    case MESA_FORMAT_R_UNORM16:
    910    case MESA_FORMAT_A_UNORM16:
    911    case MESA_FORMAT_L_UNORM16:
    912    case MESA_FORMAT_I_UNORM16:
    913       *datatype = GL_UNSIGNED_SHORT;
    914       *comps = 1;
    915       return;
    916 
    917    case MESA_FORMAT_R3G3B2_UNORM:
    918    case MESA_FORMAT_R3G3B2_UINT:
    919       *datatype = GL_UNSIGNED_BYTE_2_3_3_REV;
    920       *comps = 3;
    921       return;
    922    case MESA_FORMAT_A4B4G4R4_UNORM:
    923    case MESA_FORMAT_A4B4G4R4_UINT:
    924       *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
    925       *comps = 4;
    926       return;
    927 
    928    case MESA_FORMAT_R4G4B4A4_UNORM:
    929    case MESA_FORMAT_R4G4B4A4_UINT:
    930       *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
    931       *comps = 4;
    932       return;
    933    case MESA_FORMAT_R5G5B5A1_UNORM:
    934    case MESA_FORMAT_R5G5B5A1_UINT:
    935       *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
    936       *comps = 4;
    937       return;
    938    case MESA_FORMAT_A2B10G10R10_UNORM:
    939    case MESA_FORMAT_A2B10G10R10_UINT:
    940       *datatype = GL_UNSIGNED_INT_10_10_10_2;
    941       *comps = 4;
    942       return;
    943    case MESA_FORMAT_A2R10G10B10_UNORM:
    944    case MESA_FORMAT_A2R10G10B10_UINT:
    945       *datatype = GL_UNSIGNED_INT_10_10_10_2;
    946       *comps = 4;
    947       return;
    948 
    949    case MESA_FORMAT_B2G3R3_UNORM:
    950    case MESA_FORMAT_B2G3R3_UINT:
    951       *datatype = GL_UNSIGNED_BYTE_3_3_2;
    952       *comps = 3;
    953       return;
    954 
    955    case MESA_FORMAT_A_UNORM8:
    956    case MESA_FORMAT_L_UNORM8:
    957    case MESA_FORMAT_I_UNORM8:
    958    case MESA_FORMAT_R_UNORM8:
    959    case MESA_FORMAT_S_UINT8:
    960       *datatype = GL_UNSIGNED_BYTE;
    961       *comps = 1;
    962       return;
    963 
    964    case MESA_FORMAT_YCBCR:
    965    case MESA_FORMAT_YCBCR_REV:
    966       *datatype = GL_UNSIGNED_SHORT;
    967       *comps = 2;
    968       return;
    969 
    970    case MESA_FORMAT_S8_UINT_Z24_UNORM:
    971       *datatype = GL_UNSIGNED_INT_24_8_MESA;
    972       *comps = 2;
    973       return;
    974 
    975    case MESA_FORMAT_Z24_UNORM_S8_UINT:
    976       *datatype = GL_UNSIGNED_INT_8_24_REV_MESA;
    977       *comps = 2;
    978       return;
    979 
    980    case MESA_FORMAT_Z_UNORM16:
    981       *datatype = GL_UNSIGNED_SHORT;
    982       *comps = 1;
    983       return;
    984 
    985    case MESA_FORMAT_Z24_UNORM_X8_UINT:
    986       *datatype = GL_UNSIGNED_INT;
    987       *comps = 1;
    988       return;
    989 
    990    case MESA_FORMAT_X8_UINT_Z24_UNORM:
    991       *datatype = GL_UNSIGNED_INT;
    992       *comps = 1;
    993       return;
    994 
    995    case MESA_FORMAT_Z_UNORM32:
    996       *datatype = GL_UNSIGNED_INT;
    997       *comps = 1;
    998       return;
    999 
   1000    case MESA_FORMAT_Z_FLOAT32:
   1001       *datatype = GL_FLOAT;
   1002       *comps = 1;
   1003       return;
   1004 
   1005    case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
   1006       *datatype = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
   1007       *comps = 1;
   1008       return;
   1009 
   1010    case MESA_FORMAT_R_SNORM8:
   1011    case MESA_FORMAT_A_SNORM8:
   1012    case MESA_FORMAT_L_SNORM8:
   1013    case MESA_FORMAT_I_SNORM8:
   1014       *datatype = GL_BYTE;
   1015       *comps = 1;
   1016       return;
   1017    case MESA_FORMAT_R8G8_SNORM:
   1018    case MESA_FORMAT_L8A8_SNORM:
   1019    case MESA_FORMAT_A8L8_SNORM:
   1020       *datatype = GL_BYTE;
   1021       *comps = 2;
   1022       return;
   1023    case MESA_FORMAT_A8B8G8R8_SNORM:
   1024    case MESA_FORMAT_R8G8B8A8_SNORM:
   1025    case MESA_FORMAT_X8B8G8R8_SNORM:
   1026       *datatype = GL_BYTE;
   1027       *comps = 4;
   1028       return;
   1029 
   1030    case MESA_FORMAT_RGBA_UNORM16:
   1031       *datatype = GL_UNSIGNED_SHORT;
   1032       *comps = 4;
   1033       return;
   1034 
   1035    case MESA_FORMAT_R_SNORM16:
   1036    case MESA_FORMAT_A_SNORM16:
   1037    case MESA_FORMAT_L_SNORM16:
   1038    case MESA_FORMAT_I_SNORM16:
   1039       *datatype = GL_SHORT;
   1040       *comps = 1;
   1041       return;
   1042    case MESA_FORMAT_R16G16_SNORM:
   1043    case MESA_FORMAT_LA_SNORM16:
   1044       *datatype = GL_SHORT;
   1045       *comps = 2;
   1046       return;
   1047    case MESA_FORMAT_RGB_SNORM16:
   1048       *datatype = GL_SHORT;
   1049       *comps = 3;
   1050       return;
   1051    case MESA_FORMAT_RGBA_SNORM16:
   1052       *datatype = GL_SHORT;
   1053       *comps = 4;
   1054       return;
   1055 
   1056    case MESA_FORMAT_BGR_SRGB8:
   1057       *datatype = GL_UNSIGNED_BYTE;
   1058       *comps = 3;
   1059       return;
   1060    case MESA_FORMAT_A8B8G8R8_SRGB:
   1061    case MESA_FORMAT_B8G8R8A8_SRGB:
   1062    case MESA_FORMAT_A8R8G8B8_SRGB:
   1063    case MESA_FORMAT_R8G8B8A8_SRGB:
   1064       *datatype = GL_UNSIGNED_BYTE;
   1065       *comps = 4;
   1066       return;
   1067    case MESA_FORMAT_L_SRGB8:
   1068       *datatype = GL_UNSIGNED_BYTE;
   1069       *comps = 1;
   1070       return;
   1071    case MESA_FORMAT_L8A8_SRGB:
   1072    case MESA_FORMAT_A8L8_SRGB:
   1073       *datatype = GL_UNSIGNED_BYTE;
   1074       *comps = 2;
   1075       return;
   1076 
   1077    case MESA_FORMAT_RGBA_FLOAT32:
   1078       *datatype = GL_FLOAT;
   1079       *comps = 4;
   1080       return;
   1081    case MESA_FORMAT_RGBA_FLOAT16:
   1082       *datatype = GL_HALF_FLOAT_ARB;
   1083       *comps = 4;
   1084       return;
   1085    case MESA_FORMAT_RGB_FLOAT32:
   1086       *datatype = GL_FLOAT;
   1087       *comps = 3;
   1088       return;
   1089    case MESA_FORMAT_RGB_FLOAT16:
   1090       *datatype = GL_HALF_FLOAT_ARB;
   1091       *comps = 3;
   1092       return;
   1093    case MESA_FORMAT_LA_FLOAT32:
   1094    case MESA_FORMAT_RG_FLOAT32:
   1095       *datatype = GL_FLOAT;
   1096       *comps = 2;
   1097       return;
   1098    case MESA_FORMAT_LA_FLOAT16:
   1099    case MESA_FORMAT_RG_FLOAT16:
   1100       *datatype = GL_HALF_FLOAT_ARB;
   1101       *comps = 2;
   1102       return;
   1103    case MESA_FORMAT_A_FLOAT32:
   1104    case MESA_FORMAT_L_FLOAT32:
   1105    case MESA_FORMAT_I_FLOAT32:
   1106    case MESA_FORMAT_R_FLOAT32:
   1107       *datatype = GL_FLOAT;
   1108       *comps = 1;
   1109       return;
   1110    case MESA_FORMAT_A_FLOAT16:
   1111    case MESA_FORMAT_L_FLOAT16:
   1112    case MESA_FORMAT_I_FLOAT16:
   1113    case MESA_FORMAT_R_FLOAT16:
   1114       *datatype = GL_HALF_FLOAT_ARB;
   1115       *comps = 1;
   1116       return;
   1117 
   1118    case MESA_FORMAT_A_UINT8:
   1119    case MESA_FORMAT_L_UINT8:
   1120    case MESA_FORMAT_I_UINT8:
   1121       *datatype = GL_UNSIGNED_BYTE;
   1122       *comps = 1;
   1123       return;
   1124    case MESA_FORMAT_LA_UINT8:
   1125       *datatype = GL_UNSIGNED_BYTE;
   1126       *comps = 2;
   1127       return;
   1128 
   1129    case MESA_FORMAT_A_UINT16:
   1130    case MESA_FORMAT_L_UINT16:
   1131    case MESA_FORMAT_I_UINT16:
   1132       *datatype = GL_UNSIGNED_SHORT;
   1133       *comps = 1;
   1134       return;
   1135    case MESA_FORMAT_LA_UINT16:
   1136       *datatype = GL_UNSIGNED_SHORT;
   1137       *comps = 2;
   1138       return;
   1139    case MESA_FORMAT_A_UINT32:
   1140    case MESA_FORMAT_L_UINT32:
   1141    case MESA_FORMAT_I_UINT32:
   1142       *datatype = GL_UNSIGNED_INT;
   1143       *comps = 1;
   1144       return;
   1145    case MESA_FORMAT_LA_UINT32:
   1146       *datatype = GL_UNSIGNED_INT;
   1147       *comps = 2;
   1148       return;
   1149    case MESA_FORMAT_A_SINT8:
   1150    case MESA_FORMAT_L_SINT8:
   1151    case MESA_FORMAT_I_SINT8:
   1152       *datatype = GL_BYTE;
   1153       *comps = 1;
   1154       return;
   1155    case MESA_FORMAT_LA_SINT8:
   1156       *datatype = GL_BYTE;
   1157       *comps = 2;
   1158       return;
   1159 
   1160    case MESA_FORMAT_A_SINT16:
   1161    case MESA_FORMAT_L_SINT16:
   1162    case MESA_FORMAT_I_SINT16:
   1163       *datatype = GL_SHORT;
   1164       *comps = 1;
   1165       return;
   1166    case MESA_FORMAT_LA_SINT16:
   1167       *datatype = GL_SHORT;
   1168       *comps = 2;
   1169       return;
   1170 
   1171    case MESA_FORMAT_A_SINT32:
   1172    case MESA_FORMAT_L_SINT32:
   1173    case MESA_FORMAT_I_SINT32:
   1174       *datatype = GL_INT;
   1175       *comps = 1;
   1176       return;
   1177    case MESA_FORMAT_LA_SINT32:
   1178       *datatype = GL_INT;
   1179       *comps = 2;
   1180       return;
   1181 
   1182    case MESA_FORMAT_R_SINT8:
   1183       *datatype = GL_BYTE;
   1184       *comps = 1;
   1185       return;
   1186    case MESA_FORMAT_RG_SINT8:
   1187       *datatype = GL_BYTE;
   1188       *comps = 2;
   1189       return;
   1190    case MESA_FORMAT_RGB_SINT8:
   1191       *datatype = GL_BYTE;
   1192       *comps = 3;
   1193       return;
   1194    case MESA_FORMAT_RGBA_SINT8:
   1195       *datatype = GL_BYTE;
   1196       *comps = 4;
   1197       return;
   1198    case MESA_FORMAT_R_SINT16:
   1199       *datatype = GL_SHORT;
   1200       *comps = 1;
   1201       return;
   1202    case MESA_FORMAT_RG_SINT16:
   1203       *datatype = GL_SHORT;
   1204       *comps = 2;
   1205       return;
   1206    case MESA_FORMAT_RGB_SINT16:
   1207       *datatype = GL_SHORT;
   1208       *comps = 3;
   1209       return;
   1210    case MESA_FORMAT_RGBA_SINT16:
   1211       *datatype = GL_SHORT;
   1212       *comps = 4;
   1213       return;
   1214    case MESA_FORMAT_R_SINT32:
   1215       *datatype = GL_INT;
   1216       *comps = 1;
   1217       return;
   1218    case MESA_FORMAT_RG_SINT32:
   1219       *datatype = GL_INT;
   1220       *comps = 2;
   1221       return;
   1222    case MESA_FORMAT_RGB_SINT32:
   1223       *datatype = GL_INT;
   1224       *comps = 3;
   1225       return;
   1226    case MESA_FORMAT_RGBA_SINT32:
   1227       *datatype = GL_INT;
   1228       *comps = 4;
   1229       return;
   1230 
   1231    /**
   1232     * \name Non-normalized unsigned integer formats.
   1233     */
   1234    case MESA_FORMAT_R_UINT8:
   1235       *datatype = GL_UNSIGNED_BYTE;
   1236       *comps = 1;
   1237       return;
   1238    case MESA_FORMAT_RG_UINT8:
   1239       *datatype = GL_UNSIGNED_BYTE;
   1240       *comps = 2;
   1241       return;
   1242    case MESA_FORMAT_RGB_UINT8:
   1243       *datatype = GL_UNSIGNED_BYTE;
   1244       *comps = 3;
   1245       return;
   1246    case MESA_FORMAT_RGBA_UINT8:
   1247       *datatype = GL_UNSIGNED_BYTE;
   1248       *comps = 4;
   1249       return;
   1250    case MESA_FORMAT_R_UINT16:
   1251       *datatype = GL_UNSIGNED_SHORT;
   1252       *comps = 1;
   1253       return;
   1254    case MESA_FORMAT_RG_UINT16:
   1255       *datatype = GL_UNSIGNED_SHORT;
   1256       *comps = 2;
   1257       return;
   1258    case MESA_FORMAT_RGB_UINT16:
   1259       *datatype = GL_UNSIGNED_SHORT;
   1260       *comps = 3;
   1261       return;
   1262    case MESA_FORMAT_RGBA_UINT16:
   1263       *datatype = GL_UNSIGNED_SHORT;
   1264       *comps = 4;
   1265       return;
   1266    case MESA_FORMAT_R_UINT32:
   1267       *datatype = GL_UNSIGNED_INT;
   1268       *comps = 1;
   1269       return;
   1270    case MESA_FORMAT_RG_UINT32:
   1271       *datatype = GL_UNSIGNED_INT;
   1272       *comps = 2;
   1273       return;
   1274    case MESA_FORMAT_RGB_UINT32:
   1275       *datatype = GL_UNSIGNED_INT;
   1276       *comps = 3;
   1277       return;
   1278    case MESA_FORMAT_RGBA_UINT32:
   1279       *datatype = GL_UNSIGNED_INT;
   1280       *comps = 4;
   1281       return;
   1282 
   1283    case MESA_FORMAT_R9G9B9E5_FLOAT:
   1284       *datatype = GL_UNSIGNED_INT_5_9_9_9_REV;
   1285       *comps = 3;
   1286       return;
   1287 
   1288    case MESA_FORMAT_R11G11B10_FLOAT:
   1289       *datatype = GL_UNSIGNED_INT_10F_11F_11F_REV;
   1290       *comps = 3;
   1291       return;
   1292 
   1293    case MESA_FORMAT_B10G10R10A2_UINT:
   1294    case MESA_FORMAT_R10G10B10A2_UINT:
   1295       *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
   1296       *comps = 4;
   1297       return;
   1298 
   1299    case MESA_FORMAT_R8G8B8X8_SRGB:
   1300    case MESA_FORMAT_X8B8G8R8_SRGB:
   1301    case MESA_FORMAT_RGBX_UINT8:
   1302       *datatype = GL_UNSIGNED_BYTE;
   1303       *comps = 4;
   1304       return;
   1305 
   1306    case MESA_FORMAT_R8G8B8X8_SNORM:
   1307    case MESA_FORMAT_RGBX_SINT8:
   1308       *datatype = GL_BYTE;
   1309       *comps = 4;
   1310       return;
   1311 
   1312    case MESA_FORMAT_B10G10R10X2_UNORM:
   1313    case MESA_FORMAT_R10G10B10X2_UNORM:
   1314       *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
   1315       *comps = 4;
   1316       return;
   1317 
   1318    case MESA_FORMAT_RGBX_UNORM16:
   1319    case MESA_FORMAT_RGBX_UINT16:
   1320       *datatype = GL_UNSIGNED_SHORT;
   1321       *comps = 4;
   1322       return;
   1323 
   1324    case MESA_FORMAT_RGBX_SNORM16:
   1325    case MESA_FORMAT_RGBX_SINT16:
   1326       *datatype = GL_SHORT;
   1327       *comps = 4;
   1328       return;
   1329 
   1330    case MESA_FORMAT_RGBX_FLOAT16:
   1331       *datatype = GL_HALF_FLOAT;
   1332       *comps = 4;
   1333       return;
   1334 
   1335    case MESA_FORMAT_RGBX_FLOAT32:
   1336       *datatype = GL_FLOAT;
   1337       *comps = 4;
   1338       return;
   1339 
   1340    case MESA_FORMAT_RGBX_UINT32:
   1341       *datatype = GL_UNSIGNED_INT;
   1342       *comps = 4;
   1343       return;
   1344 
   1345    case MESA_FORMAT_RGBX_SINT32:
   1346       *datatype = GL_INT;
   1347       *comps = 4;
   1348       return;
   1349 
   1350    case MESA_FORMAT_R10G10B10A2_UNORM:
   1351       *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
   1352       *comps = 4;
   1353       return;
   1354 
   1355    case MESA_FORMAT_G8R8_SNORM:
   1356       *datatype = GL_BYTE;
   1357       *comps = 2;
   1358       return;
   1359 
   1360    case MESA_FORMAT_G16R16_SNORM:
   1361       *datatype = GL_SHORT;
   1362       *comps = 2;
   1363       return;
   1364 
   1365    case MESA_FORMAT_B8G8R8X8_SRGB:
   1366    case MESA_FORMAT_X8R8G8B8_SRGB:
   1367       *datatype = GL_UNSIGNED_BYTE;
   1368       *comps = 4;
   1369       return;
   1370 
   1371    case MESA_FORMAT_COUNT:
   1372       assert(0);
   1373       return;
   1374    default:
   1375       /* Warn if any formats are not handled */
   1376       _mesa_problem(NULL, "bad format %s in _mesa_uncompressed_format_to_type_and_comps",
   1377                     _mesa_get_format_name(format));
   1378       assert(format == MESA_FORMAT_NONE ||
   1379              _mesa_is_format_compressed(format));
   1380       *datatype = 0;
   1381       *comps = 1;
   1382    }
   1383 }
   1384 
   1385 /**
   1386  * Check if a mesa_format exactly matches a GL format/type combination
   1387  * such that we can use memcpy() from one to the other.
   1388  * \param mesa_format  a MESA_FORMAT_x value
   1389  * \param format  the user-specified image format
   1390  * \param type  the user-specified image datatype
   1391  * \param swapBytes  typically the current pixel pack/unpack byteswap state
   1392  * \param[out] error GL_NO_ERROR if format is an expected input.
   1393  *                   GL_INVALID_ENUM if format is an unexpected input.
   1394  * \return GL_TRUE if the formats match, GL_FALSE otherwise.
   1395  */
   1396 GLboolean
   1397 _mesa_format_matches_format_and_type(mesa_format mesa_format,
   1398 				     GLenum format, GLenum type,
   1399 				     GLboolean swapBytes, GLenum *error)
   1400 {
   1401    const GLboolean littleEndian = _mesa_little_endian();
   1402    if (error)
   1403       *error = GL_NO_ERROR;
   1404 
   1405    /* Note: When reading a GL format/type combination, the format lists channel
   1406     * assignments from most significant channel in the type to least
   1407     * significant.  A type with _REV indicates that the assignments are
   1408     * swapped, so they are listed from least significant to most significant.
   1409     *
   1410     * Compressed formats will fall through and return GL_FALSE.
   1411     *
   1412     * For sanity, please keep this switch statement ordered the same as the
   1413     * enums in formats.h.
   1414     */
   1415 
   1416    switch (mesa_format) {
   1417 
   1418    case MESA_FORMAT_NONE:
   1419    case MESA_FORMAT_COUNT:
   1420       return GL_FALSE;
   1421 
   1422    case MESA_FORMAT_A8B8G8R8_UNORM:
   1423    case MESA_FORMAT_A8B8G8R8_SRGB:
   1424       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
   1425          return GL_TRUE;
   1426 
   1427       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV && swapBytes)
   1428          return GL_TRUE;
   1429 
   1430       if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !littleEndian)
   1431          return GL_TRUE;
   1432 
   1433       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV
   1434           && !swapBytes)
   1435          return GL_TRUE;
   1436 
   1437       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8
   1438           && swapBytes)
   1439          return GL_TRUE;
   1440 
   1441       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && littleEndian)
   1442          return GL_TRUE;
   1443 
   1444       return GL_FALSE;
   1445 
   1446    case MESA_FORMAT_R8G8B8A8_UNORM:
   1447    case MESA_FORMAT_R8G8B8A8_SRGB:
   1448       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
   1449           !swapBytes)
   1450          return GL_TRUE;
   1451 
   1452       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
   1453          return GL_TRUE;
   1454 
   1455       if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && littleEndian)
   1456          return GL_TRUE;
   1457 
   1458       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8 &&
   1459           !swapBytes)
   1460          return GL_TRUE;
   1461 
   1462       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
   1463           swapBytes)
   1464          return GL_TRUE;
   1465 
   1466       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && !littleEndian)
   1467          return GL_TRUE;
   1468 
   1469       return GL_FALSE;
   1470 
   1471    case MESA_FORMAT_B8G8R8A8_UNORM:
   1472    case MESA_FORMAT_B8G8R8A8_SRGB:
   1473       if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
   1474           !swapBytes)
   1475          return GL_TRUE;
   1476 
   1477       if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
   1478          return GL_TRUE;
   1479 
   1480       if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && littleEndian)
   1481          return GL_TRUE;
   1482 
   1483       return GL_FALSE;
   1484 
   1485    case MESA_FORMAT_A8R8G8B8_UNORM:
   1486    case MESA_FORMAT_A8R8G8B8_SRGB:
   1487       if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
   1488          return GL_TRUE;
   1489 
   1490       if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
   1491           swapBytes)
   1492          return GL_TRUE;
   1493 
   1494       if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && !littleEndian)
   1495          return GL_TRUE;
   1496 
   1497       return GL_FALSE;
   1498 
   1499    case MESA_FORMAT_X8B8G8R8_UNORM:
   1500    case MESA_FORMAT_R8G8B8X8_UNORM:
   1501       return GL_FALSE;
   1502 
   1503    case MESA_FORMAT_B8G8R8X8_UNORM:
   1504    case MESA_FORMAT_X8R8G8B8_UNORM:
   1505       return GL_FALSE;
   1506 
   1507    case MESA_FORMAT_BGR_UNORM8:
   1508    case MESA_FORMAT_BGR_SRGB8:
   1509       return format == GL_BGR && type == GL_UNSIGNED_BYTE && littleEndian;
   1510 
   1511    case MESA_FORMAT_RGB_UNORM8:
   1512       return format == GL_RGB && type == GL_UNSIGNED_BYTE && littleEndian;
   1513 
   1514    case MESA_FORMAT_B5G6R5_UNORM:
   1515       return ((format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5) ||
   1516               (format == GL_BGR && type == GL_UNSIGNED_SHORT_5_6_5_REV)) &&
   1517               !swapBytes;
   1518 
   1519    case MESA_FORMAT_R5G6B5_UNORM:
   1520       return ((format == GL_BGR && type == GL_UNSIGNED_SHORT_5_6_5) ||
   1521               (format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5_REV)) &&
   1522               !swapBytes;
   1523 
   1524    case MESA_FORMAT_B4G4R4A4_UNORM:
   1525       return format == GL_BGRA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV &&
   1526          !swapBytes;
   1527 
   1528    case MESA_FORMAT_A4R4G4B4_UNORM:
   1529       return GL_FALSE;
   1530 
   1531    case MESA_FORMAT_A1B5G5R5_UNORM:
   1532       return format == GL_RGBA && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
   1533          !swapBytes;
   1534 
   1535    case MESA_FORMAT_X1B5G5R5_UNORM:
   1536       return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
   1537          !swapBytes;
   1538 
   1539    case MESA_FORMAT_B5G5R5A1_UNORM:
   1540       return format == GL_BGRA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV &&
   1541          !swapBytes;
   1542 
   1543    case MESA_FORMAT_A1R5G5B5_UNORM:
   1544       return format == GL_BGRA && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
   1545          !swapBytes;
   1546 
   1547    case MESA_FORMAT_L4A4_UNORM:
   1548       return GL_FALSE;
   1549    case MESA_FORMAT_L8A8_UNORM:
   1550    case MESA_FORMAT_L8A8_SRGB:
   1551       return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_BYTE && littleEndian;
   1552    case MESA_FORMAT_A8L8_UNORM:
   1553    case MESA_FORMAT_A8L8_SRGB:
   1554       return GL_FALSE;
   1555 
   1556    case MESA_FORMAT_L16A16_UNORM:
   1557       return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_SHORT && littleEndian && !swapBytes;
   1558    case MESA_FORMAT_A16L16_UNORM:
   1559       return GL_FALSE;
   1560 
   1561    case MESA_FORMAT_B2G3R3_UNORM:
   1562       return format == GL_RGB && type == GL_UNSIGNED_BYTE_3_3_2;
   1563 
   1564    case MESA_FORMAT_R3G3B2_UNORM:
   1565       return format == GL_RGB && type == GL_UNSIGNED_BYTE_2_3_3_REV;
   1566 
   1567    case MESA_FORMAT_A4B4G4R4_UNORM:
   1568       if (format == GL_RGBA && type == GL_UNSIGNED_SHORT_4_4_4_4 && !swapBytes)
   1569          return GL_TRUE;
   1570 
   1571       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && !swapBytes)
   1572          return GL_TRUE;
   1573 
   1574       return GL_FALSE;
   1575 
   1576    case MESA_FORMAT_R4G4B4A4_UNORM:
   1577       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_4_4_4_4 && !swapBytes)
   1578          return GL_TRUE;
   1579 
   1580       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && swapBytes)
   1581          return GL_TRUE;
   1582 
   1583       if (format == GL_RGBA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && !swapBytes)
   1584          return GL_TRUE;
   1585 
   1586       if (format == GL_RGBA && type == GL_UNSIGNED_SHORT_4_4_4_4 && swapBytes)
   1587          return GL_TRUE;
   1588 
   1589       return GL_FALSE;
   1590 
   1591    case MESA_FORMAT_R5G5B5A1_UNORM:
   1592       return format == GL_RGBA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV;
   1593 
   1594    case MESA_FORMAT_A2B10G10R10_UNORM:
   1595       return format == GL_RGBA && type == GL_UNSIGNED_INT_10_10_10_2;
   1596 
   1597    case MESA_FORMAT_A2B10G10R10_UINT:
   1598       return format == GL_RGBA_INTEGER_EXT && type == GL_UNSIGNED_INT_10_10_10_2;
   1599 
   1600    case MESA_FORMAT_A2R10G10B10_UNORM:
   1601       return format == GL_BGRA && type == GL_UNSIGNED_INT_10_10_10_2;
   1602 
   1603    case MESA_FORMAT_A2R10G10B10_UINT:
   1604       return format == GL_BGRA_INTEGER_EXT && type == GL_UNSIGNED_INT_10_10_10_2;
   1605 
   1606    case MESA_FORMAT_A_UNORM8:
   1607       return format == GL_ALPHA && type == GL_UNSIGNED_BYTE;
   1608    case MESA_FORMAT_A_UNORM16:
   1609       return format == GL_ALPHA && type == GL_UNSIGNED_SHORT && !swapBytes;
   1610    case MESA_FORMAT_L_UNORM8:
   1611    case MESA_FORMAT_L_SRGB8:
   1612       return format == GL_LUMINANCE && type == GL_UNSIGNED_BYTE;
   1613    case MESA_FORMAT_L_UNORM16:
   1614       return format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT && !swapBytes;
   1615    case MESA_FORMAT_I_UNORM8:
   1616       return format == GL_RED && type == GL_UNSIGNED_BYTE;
   1617    case MESA_FORMAT_I_UNORM16:
   1618       return format == GL_RED && type == GL_UNSIGNED_SHORT && !swapBytes;
   1619 
   1620    case MESA_FORMAT_YCBCR:
   1621       return format == GL_YCBCR_MESA &&
   1622              ((type == GL_UNSIGNED_SHORT_8_8_MESA && littleEndian != swapBytes) ||
   1623               (type == GL_UNSIGNED_SHORT_8_8_REV_MESA && littleEndian == swapBytes));
   1624    case MESA_FORMAT_YCBCR_REV:
   1625       return format == GL_YCBCR_MESA &&
   1626              ((type == GL_UNSIGNED_SHORT_8_8_MESA && littleEndian == swapBytes) ||
   1627               (type == GL_UNSIGNED_SHORT_8_8_REV_MESA && littleEndian != swapBytes));
   1628 
   1629    case MESA_FORMAT_R_UNORM8:
   1630       return format == GL_RED && type == GL_UNSIGNED_BYTE;
   1631    case MESA_FORMAT_R8G8_UNORM:
   1632       return format == GL_RG && type == GL_UNSIGNED_BYTE && littleEndian;
   1633    case MESA_FORMAT_G8R8_UNORM:
   1634       return GL_FALSE;
   1635 
   1636    case MESA_FORMAT_R_UNORM16:
   1637       return format == GL_RED && type == GL_UNSIGNED_SHORT &&
   1638          !swapBytes;
   1639    case MESA_FORMAT_R16G16_UNORM:
   1640       return format == GL_RG && type == GL_UNSIGNED_SHORT && littleEndian &&
   1641          !swapBytes;
   1642    case MESA_FORMAT_G16R16_UNORM:
   1643       return GL_FALSE;
   1644 
   1645    case MESA_FORMAT_B10G10R10A2_UNORM:
   1646       return format == GL_BGRA && type == GL_UNSIGNED_INT_2_10_10_10_REV &&
   1647          !swapBytes;
   1648 
   1649    case MESA_FORMAT_S8_UINT_Z24_UNORM:
   1650       return format == GL_DEPTH_STENCIL && type == GL_UNSIGNED_INT_24_8 &&
   1651          !swapBytes;
   1652    case MESA_FORMAT_X8_UINT_Z24_UNORM:
   1653    case MESA_FORMAT_Z24_UNORM_S8_UINT:
   1654       return GL_FALSE;
   1655 
   1656    case MESA_FORMAT_Z_UNORM16:
   1657       return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_SHORT &&
   1658          !swapBytes;
   1659 
   1660    case MESA_FORMAT_Z24_UNORM_X8_UINT:
   1661       return GL_FALSE;
   1662 
   1663    case MESA_FORMAT_Z_UNORM32:
   1664       return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_INT &&
   1665          !swapBytes;
   1666 
   1667    case MESA_FORMAT_S_UINT8:
   1668       return format == GL_STENCIL_INDEX && type == GL_UNSIGNED_BYTE;
   1669 
   1670    case MESA_FORMAT_RGBA_FLOAT32:
   1671       return format == GL_RGBA && type == GL_FLOAT && !swapBytes;
   1672    case MESA_FORMAT_RGBA_FLOAT16:
   1673       return format == GL_RGBA && type == GL_HALF_FLOAT && !swapBytes;
   1674 
   1675    case MESA_FORMAT_RGB_FLOAT32:
   1676       return format == GL_RGB && type == GL_FLOAT && !swapBytes;
   1677    case MESA_FORMAT_RGB_FLOAT16:
   1678       return format == GL_RGB && type == GL_HALF_FLOAT && !swapBytes;
   1679 
   1680    case MESA_FORMAT_A_FLOAT32:
   1681       return format == GL_ALPHA && type == GL_FLOAT && !swapBytes;
   1682    case MESA_FORMAT_A_FLOAT16:
   1683       return format == GL_ALPHA && type == GL_HALF_FLOAT && !swapBytes;
   1684 
   1685    case MESA_FORMAT_L_FLOAT32:
   1686       return format == GL_LUMINANCE && type == GL_FLOAT && !swapBytes;
   1687    case MESA_FORMAT_L_FLOAT16:
   1688       return format == GL_LUMINANCE && type == GL_HALF_FLOAT && !swapBytes;
   1689 
   1690    case MESA_FORMAT_LA_FLOAT32:
   1691       return format == GL_LUMINANCE_ALPHA && type == GL_FLOAT && !swapBytes;
   1692    case MESA_FORMAT_LA_FLOAT16:
   1693       return format == GL_LUMINANCE_ALPHA && type == GL_HALF_FLOAT && !swapBytes;
   1694 
   1695    case MESA_FORMAT_I_FLOAT32:
   1696       return format == GL_RED && type == GL_FLOAT && !swapBytes;
   1697    case MESA_FORMAT_I_FLOAT16:
   1698       return format == GL_RED && type == GL_HALF_FLOAT && !swapBytes;
   1699 
   1700    case MESA_FORMAT_R_FLOAT32:
   1701       return format == GL_RED && type == GL_FLOAT && !swapBytes;
   1702    case MESA_FORMAT_R_FLOAT16:
   1703       return format == GL_RED && type == GL_HALF_FLOAT && !swapBytes;
   1704 
   1705    case MESA_FORMAT_RG_FLOAT32:
   1706       return format == GL_RG && type == GL_FLOAT && !swapBytes;
   1707    case MESA_FORMAT_RG_FLOAT16:
   1708       return format == GL_RG && type == GL_HALF_FLOAT && !swapBytes;
   1709 
   1710    case MESA_FORMAT_A_UINT8:
   1711       return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_BYTE;
   1712    case MESA_FORMAT_A_UINT16:
   1713       return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_SHORT &&
   1714              !swapBytes;
   1715    case MESA_FORMAT_A_UINT32:
   1716       return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_INT &&
   1717              !swapBytes;
   1718    case MESA_FORMAT_A_SINT8:
   1719       return format == GL_ALPHA_INTEGER && type == GL_BYTE;
   1720    case MESA_FORMAT_A_SINT16:
   1721       return format == GL_ALPHA_INTEGER && type == GL_SHORT && !swapBytes;
   1722    case MESA_FORMAT_A_SINT32:
   1723       return format == GL_ALPHA_INTEGER && type == GL_INT && !swapBytes;
   1724 
   1725    case MESA_FORMAT_I_UINT8:
   1726       return format == GL_RED_INTEGER && type == GL_UNSIGNED_BYTE;
   1727    case MESA_FORMAT_I_UINT16:
   1728       return format == GL_RED_INTEGER && type == GL_UNSIGNED_SHORT && !swapBytes;
   1729    case MESA_FORMAT_I_UINT32:
   1730       return format == GL_RED_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
   1731    case MESA_FORMAT_I_SINT8:
   1732       return format == GL_RED_INTEGER && type == GL_BYTE;
   1733    case MESA_FORMAT_I_SINT16:
   1734       return format == GL_RED_INTEGER && type == GL_SHORT && !swapBytes;
   1735    case MESA_FORMAT_I_SINT32:
   1736       return format == GL_RED_INTEGER && type == GL_INT && !swapBytes;
   1737 
   1738    case MESA_FORMAT_L_UINT8:
   1739       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_BYTE;
   1740    case MESA_FORMAT_L_UINT16:
   1741       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_SHORT &&
   1742              !swapBytes;
   1743    case MESA_FORMAT_L_UINT32:
   1744       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_INT &&
   1745              !swapBytes;
   1746    case MESA_FORMAT_L_SINT8:
   1747       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_BYTE;
   1748    case MESA_FORMAT_L_SINT16:
   1749       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_SHORT &&
   1750              !swapBytes;
   1751    case MESA_FORMAT_L_SINT32:
   1752       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_INT && !swapBytes;
   1753 
   1754    case MESA_FORMAT_LA_UINT8:
   1755       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
   1756              type == GL_UNSIGNED_BYTE && !swapBytes;
   1757    case MESA_FORMAT_LA_UINT16:
   1758       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
   1759              type == GL_UNSIGNED_SHORT && !swapBytes;
   1760    case MESA_FORMAT_LA_UINT32:
   1761       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
   1762              type == GL_UNSIGNED_INT && !swapBytes;
   1763    case MESA_FORMAT_LA_SINT8:
   1764       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_BYTE &&
   1765              !swapBytes;
   1766    case MESA_FORMAT_LA_SINT16:
   1767       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_SHORT &&
   1768              !swapBytes;
   1769    case MESA_FORMAT_LA_SINT32:
   1770       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_INT &&
   1771              !swapBytes;
   1772 
   1773    case MESA_FORMAT_R_SINT8:
   1774       return format == GL_RED_INTEGER && type == GL_BYTE;
   1775    case MESA_FORMAT_RG_SINT8:
   1776       return format == GL_RG_INTEGER && type == GL_BYTE && !swapBytes;
   1777    case MESA_FORMAT_RGB_SINT8:
   1778       return format == GL_RGB_INTEGER && type == GL_BYTE && !swapBytes;
   1779    case MESA_FORMAT_RGBA_SINT8:
   1780       return format == GL_RGBA_INTEGER && type == GL_BYTE && !swapBytes;
   1781    case MESA_FORMAT_R_SINT16:
   1782       return format == GL_RED_INTEGER && type == GL_SHORT && !swapBytes;
   1783    case MESA_FORMAT_RG_SINT16:
   1784       return format == GL_RG_INTEGER && type == GL_SHORT && !swapBytes;
   1785    case MESA_FORMAT_RGB_SINT16:
   1786       return format == GL_RGB_INTEGER && type == GL_SHORT && !swapBytes;
   1787    case MESA_FORMAT_RGBA_SINT16:
   1788       return format == GL_RGBA_INTEGER && type == GL_SHORT && !swapBytes;
   1789    case MESA_FORMAT_R_SINT32:
   1790       return format == GL_RED_INTEGER && type == GL_INT && !swapBytes;
   1791    case MESA_FORMAT_RG_SINT32:
   1792       return format == GL_RG_INTEGER && type == GL_INT && !swapBytes;
   1793    case MESA_FORMAT_RGB_SINT32:
   1794       return format == GL_RGB_INTEGER && type == GL_INT && !swapBytes;
   1795    case MESA_FORMAT_RGBA_SINT32:
   1796       return format == GL_RGBA_INTEGER && type == GL_INT && !swapBytes;
   1797 
   1798    case MESA_FORMAT_R_UINT8:
   1799       return format == GL_RED_INTEGER && type == GL_UNSIGNED_BYTE;
   1800    case MESA_FORMAT_RG_UINT8:
   1801       return format == GL_RG_INTEGER && type == GL_UNSIGNED_BYTE && !swapBytes;
   1802    case MESA_FORMAT_RGB_UINT8:
   1803       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_BYTE && !swapBytes;
   1804    case MESA_FORMAT_RGBA_UINT8:
   1805       return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_BYTE &&
   1806              !swapBytes;
   1807    case MESA_FORMAT_R_UINT16:
   1808       return format == GL_RED_INTEGER && type == GL_UNSIGNED_SHORT &&
   1809              !swapBytes;
   1810    case MESA_FORMAT_RG_UINT16:
   1811       return format == GL_RG_INTEGER && type == GL_UNSIGNED_SHORT && !swapBytes;
   1812    case MESA_FORMAT_RGB_UINT16:
   1813       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_SHORT &&
   1814              !swapBytes;
   1815    case MESA_FORMAT_RGBA_UINT16:
   1816       return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT &&
   1817              !swapBytes;
   1818    case MESA_FORMAT_R_UINT32:
   1819       return format == GL_RED_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
   1820    case MESA_FORMAT_RG_UINT32:
   1821       return format == GL_RG_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
   1822    case MESA_FORMAT_RGB_UINT32:
   1823       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
   1824    case MESA_FORMAT_RGBA_UINT32:
   1825       return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
   1826 
   1827    case MESA_FORMAT_R_SNORM8:
   1828       return format == GL_RED && type == GL_BYTE;
   1829    case MESA_FORMAT_R8G8_SNORM:
   1830       return format == GL_RG && type == GL_BYTE && littleEndian &&
   1831              !swapBytes;
   1832    case MESA_FORMAT_X8B8G8R8_SNORM:
   1833       return GL_FALSE;
   1834 
   1835    case MESA_FORMAT_A8B8G8R8_SNORM:
   1836       if (format == GL_RGBA && type == GL_BYTE && !littleEndian)
   1837          return GL_TRUE;
   1838 
   1839       if (format == GL_ABGR_EXT && type == GL_BYTE && littleEndian)
   1840          return GL_TRUE;
   1841 
   1842       return GL_FALSE;
   1843 
   1844    case MESA_FORMAT_R8G8B8A8_SNORM:
   1845       if (format == GL_RGBA && type == GL_BYTE && littleEndian)
   1846          return GL_TRUE;
   1847 
   1848       if (format == GL_ABGR_EXT && type == GL_BYTE && !littleEndian)
   1849          return GL_TRUE;
   1850 
   1851       return GL_FALSE;
   1852 
   1853    case MESA_FORMAT_R_SNORM16:
   1854       return format == GL_RED && type == GL_SHORT &&
   1855              !swapBytes;
   1856    case MESA_FORMAT_R16G16_SNORM:
   1857       return format == GL_RG && type == GL_SHORT && littleEndian && !swapBytes;
   1858    case MESA_FORMAT_RGB_SNORM16:
   1859       return format == GL_RGB && type == GL_SHORT && !swapBytes;
   1860    case MESA_FORMAT_RGBA_SNORM16:
   1861       return format == GL_RGBA && type == GL_SHORT && !swapBytes;
   1862    case MESA_FORMAT_RGBA_UNORM16:
   1863       return format == GL_RGBA && type == GL_UNSIGNED_SHORT &&
   1864              !swapBytes;
   1865 
   1866    case MESA_FORMAT_A_SNORM8:
   1867       return format == GL_ALPHA && type == GL_BYTE;
   1868    case MESA_FORMAT_L_SNORM8:
   1869       return format == GL_LUMINANCE && type == GL_BYTE;
   1870    case MESA_FORMAT_L8A8_SNORM:
   1871       return format == GL_LUMINANCE_ALPHA && type == GL_BYTE &&
   1872              littleEndian && !swapBytes;
   1873    case MESA_FORMAT_A8L8_SNORM:
   1874       return format == GL_LUMINANCE_ALPHA && type == GL_BYTE &&
   1875              !littleEndian && !swapBytes;
   1876    case MESA_FORMAT_I_SNORM8:
   1877       return format == GL_RED && type == GL_BYTE;
   1878    case MESA_FORMAT_A_SNORM16:
   1879       return format == GL_ALPHA && type == GL_SHORT && !swapBytes;
   1880    case MESA_FORMAT_L_SNORM16:
   1881       return format == GL_LUMINANCE && type == GL_SHORT && !swapBytes;
   1882    case MESA_FORMAT_LA_SNORM16:
   1883       return format == GL_LUMINANCE_ALPHA && type == GL_SHORT &&
   1884              littleEndian && !swapBytes;
   1885    case MESA_FORMAT_I_SNORM16:
   1886       return format == GL_RED && type == GL_SHORT && littleEndian &&
   1887              !swapBytes;
   1888 
   1889    case MESA_FORMAT_B10G10R10A2_UINT:
   1890       return (format == GL_BGRA_INTEGER_EXT &&
   1891               type == GL_UNSIGNED_INT_2_10_10_10_REV &&
   1892               !swapBytes);
   1893 
   1894    case MESA_FORMAT_R10G10B10A2_UINT:
   1895       return (format == GL_RGBA_INTEGER_EXT &&
   1896               type == GL_UNSIGNED_INT_2_10_10_10_REV &&
   1897               !swapBytes);
   1898 
   1899    case MESA_FORMAT_B5G6R5_UINT:
   1900       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_SHORT_5_6_5;
   1901 
   1902    case MESA_FORMAT_R5G6B5_UINT:
   1903       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_SHORT_5_6_5_REV;
   1904 
   1905    case MESA_FORMAT_B2G3R3_UINT:
   1906       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_BYTE_3_3_2;
   1907 
   1908    case MESA_FORMAT_R3G3B2_UINT:
   1909       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_BYTE_2_3_3_REV;
   1910 
   1911    case MESA_FORMAT_A4B4G4R4_UINT:
   1912       if (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT_4_4_4_4 && !swapBytes)
   1913          return GL_TRUE;
   1914 
   1915       if (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && swapBytes)
   1916          return GL_TRUE;
   1917       return GL_FALSE;
   1918 
   1919    case MESA_FORMAT_R4G4B4A4_UINT:
   1920       if (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT_4_4_4_4_REV && !swapBytes)
   1921          return GL_TRUE;
   1922 
   1923       if (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT_4_4_4_4 && swapBytes)
   1924          return GL_TRUE;
   1925 
   1926       return GL_FALSE;
   1927 
   1928    case MESA_FORMAT_B4G4R4A4_UINT:
   1929       return format == GL_BGRA_INTEGER && type == GL_UNSIGNED_SHORT_4_4_4_4_REV &&
   1930          !swapBytes;
   1931 
   1932    case MESA_FORMAT_A4R4G4B4_UINT:
   1933       return GL_FALSE;
   1934 
   1935    case MESA_FORMAT_A1B5G5R5_UINT:
   1936       return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
   1937          !swapBytes;
   1938 
   1939    case MESA_FORMAT_B5G5R5A1_UINT:
   1940       return format == GL_BGRA_INTEGER && type == GL_UNSIGNED_SHORT_1_5_5_5_REV &&
   1941          !swapBytes;
   1942 
   1943    case MESA_FORMAT_A1R5G5B5_UINT:
   1944       return format == GL_BGRA_INTEGER && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
   1945          !swapBytes;
   1946 
   1947    case MESA_FORMAT_R5G5B5A1_UINT:
   1948       return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT_1_5_5_5_REV;
   1949 
   1950    case MESA_FORMAT_A8B8G8R8_UINT:
   1951       if (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
   1952          return GL_TRUE;
   1953 
   1954       if (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT_8_8_8_8_REV && swapBytes)
   1955          return GL_TRUE;
   1956       return GL_FALSE;
   1957 
   1958    case MESA_FORMAT_A8R8G8B8_UINT:
   1959       if (format == GL_BGRA_INTEGER && type == GL_UNSIGNED_INT_8_8_8_8 &&
   1960           !swapBytes)
   1961          return GL_TRUE;
   1962 
   1963       if (format == GL_BGRA_INTEGER && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
   1964           swapBytes)
   1965          return GL_TRUE;
   1966 
   1967       return GL_FALSE;
   1968 
   1969    case MESA_FORMAT_R8G8B8A8_UINT:
   1970       if (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
   1971           !swapBytes)
   1972          return GL_TRUE;
   1973 
   1974       if (format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
   1975          return GL_TRUE;
   1976 
   1977       return GL_FALSE;
   1978 
   1979    case MESA_FORMAT_B8G8R8A8_UINT:
   1980       if (format == GL_BGRA_INTEGER && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
   1981           !swapBytes)
   1982          return GL_TRUE;
   1983 
   1984       if (format == GL_BGRA_INTEGER && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
   1985          return GL_TRUE;
   1986 
   1987       return GL_FALSE;
   1988 
   1989    case MESA_FORMAT_R9G9B9E5_FLOAT:
   1990       return format == GL_RGB && type == GL_UNSIGNED_INT_5_9_9_9_REV &&
   1991          !swapBytes;
   1992 
   1993    case MESA_FORMAT_R11G11B10_FLOAT:
   1994       return format == GL_RGB && type == GL_UNSIGNED_INT_10F_11F_11F_REV &&
   1995          !swapBytes;
   1996 
   1997    case MESA_FORMAT_Z_FLOAT32:
   1998       return format == GL_DEPTH_COMPONENT && type == GL_FLOAT && !swapBytes;
   1999 
   2000    case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
   2001       return format == GL_DEPTH_STENCIL &&
   2002              type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV && !swapBytes;
   2003 
   2004    case MESA_FORMAT_B4G4R4X4_UNORM:
   2005    case MESA_FORMAT_B5G5R5X1_UNORM:
   2006    case MESA_FORMAT_R8G8B8X8_SNORM:
   2007    case MESA_FORMAT_R8G8B8X8_SRGB:
   2008    case MESA_FORMAT_X8B8G8R8_SRGB:
   2009    case MESA_FORMAT_RGBX_UINT8:
   2010    case MESA_FORMAT_RGBX_SINT8:
   2011    case MESA_FORMAT_B10G10R10X2_UNORM:
   2012    case MESA_FORMAT_RGBX_UNORM16:
   2013    case MESA_FORMAT_RGBX_SNORM16:
   2014    case MESA_FORMAT_RGBX_FLOAT16:
   2015    case MESA_FORMAT_RGBX_UINT16:
   2016    case MESA_FORMAT_RGBX_SINT16:
   2017    case MESA_FORMAT_RGBX_FLOAT32:
   2018    case MESA_FORMAT_RGBX_UINT32:
   2019    case MESA_FORMAT_RGBX_SINT32:
   2020       return GL_FALSE;
   2021 
   2022    case MESA_FORMAT_R10G10B10X2_UNORM:
   2023       return format == GL_RGB && type == GL_UNSIGNED_INT_2_10_10_10_REV &&
   2024          !swapBytes;
   2025    case MESA_FORMAT_R10G10B10A2_UNORM:
   2026       return format == GL_RGBA && type == GL_UNSIGNED_INT_2_10_10_10_REV &&
   2027          !swapBytes;
   2028 
   2029    case MESA_FORMAT_G8R8_SNORM:
   2030       return format == GL_RG && type == GL_BYTE && !littleEndian &&
   2031          !swapBytes;
   2032 
   2033    case MESA_FORMAT_G16R16_SNORM:
   2034       return format == GL_RG && type == GL_SHORT && !littleEndian &&
   2035          !swapBytes;
   2036 
   2037    case MESA_FORMAT_B8G8R8X8_SRGB:
   2038    case MESA_FORMAT_X8R8G8B8_SRGB:
   2039       return GL_FALSE;
   2040    default:
   2041       assert(_mesa_is_format_compressed(mesa_format));
   2042       if (error)
   2043          *error = GL_INVALID_ENUM;
   2044    }
   2045    return GL_FALSE;
   2046 }
   2047 
   2048