Home | History | Annotate | Download | only in state_tracker
      1 /**************************************************************************
      2  *
      3  * Copyright 2007 VMware, Inc.
      4  * Copyright (c) 2008-2010 VMware, Inc.
      5  * All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the
      9  * "Software"), to deal in the Software without restriction, including
     10  * without limitation the rights to use, copy, modify, merge, publish,
     11  * distribute, sub license, and/or sell copies of the Software, and to
     12  * permit persons to whom the Software is furnished to do so, subject to
     13  * the following conditions:
     14  *
     15  * The above copyright notice and this permission notice (including the
     16  * next paragraph) shall be included in all copies or substantial portions
     17  * of the Software.
     18  *
     19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     22  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
     23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     26  *
     27  **************************************************************************/
     28 
     29 
     30 /**
     31  * Mesa / Gallium format conversion and format selection code.
     32  * \author Brian Paul
     33  */
     34 
     35 #include "main/imports.h"
     36 #include "main/context.h"
     37 #include "main/enums.h"
     38 #include "main/formats.h"
     39 #include "main/glformats.h"
     40 #include "main/texcompress.h"
     41 #include "main/texgetimage.h"
     42 #include "main/teximage.h"
     43 #include "main/texstore.h"
     44 #include "main/image.h"
     45 #include "main/macros.h"
     46 #include "main/formatquery.h"
     47 
     48 #include "pipe/p_context.h"
     49 #include "pipe/p_defines.h"
     50 #include "pipe/p_screen.h"
     51 #include "util/u_format.h"
     52 #include "st_cb_texture.h"
     53 #include "st_context.h"
     54 #include "st_format.h"
     55 
     56 
     57 /**
     58  * Translate Mesa format to Gallium format.
     59  */
     60 enum pipe_format
     61 st_mesa_format_to_pipe_format(struct st_context *st, mesa_format mesaFormat)
     62 {
     63    switch (mesaFormat) {
     64    case MESA_FORMAT_A8B8G8R8_UNORM:
     65       return PIPE_FORMAT_ABGR8888_UNORM;
     66    case MESA_FORMAT_R8G8B8A8_UNORM:
     67       return PIPE_FORMAT_RGBA8888_UNORM;
     68    case MESA_FORMAT_B8G8R8A8_UNORM:
     69       return PIPE_FORMAT_BGRA8888_UNORM;
     70    case MESA_FORMAT_A8R8G8B8_UNORM:
     71       return PIPE_FORMAT_ARGB8888_UNORM;
     72    case MESA_FORMAT_X8B8G8R8_UNORM:
     73       return PIPE_FORMAT_XBGR8888_UNORM;
     74    case MESA_FORMAT_R8G8B8X8_UNORM:
     75       return PIPE_FORMAT_RGBX8888_UNORM;
     76    case MESA_FORMAT_B8G8R8X8_UNORM:
     77       return PIPE_FORMAT_BGRX8888_UNORM;
     78    case MESA_FORMAT_X8R8G8B8_UNORM:
     79       return PIPE_FORMAT_XRGB8888_UNORM;
     80    case MESA_FORMAT_B5G5R5A1_UNORM:
     81       return PIPE_FORMAT_B5G5R5A1_UNORM;
     82    case MESA_FORMAT_B4G4R4A4_UNORM:
     83       return PIPE_FORMAT_B4G4R4A4_UNORM;
     84    case MESA_FORMAT_B5G6R5_UNORM:
     85       return PIPE_FORMAT_B5G6R5_UNORM;
     86    case MESA_FORMAT_B2G3R3_UNORM:
     87       return PIPE_FORMAT_B2G3R3_UNORM;
     88    case MESA_FORMAT_B10G10R10A2_UNORM:
     89       return PIPE_FORMAT_B10G10R10A2_UNORM;
     90    case MESA_FORMAT_R10G10B10A2_UNORM:
     91       return PIPE_FORMAT_R10G10B10A2_UNORM;
     92    case MESA_FORMAT_L4A4_UNORM:
     93       return PIPE_FORMAT_L4A4_UNORM;
     94    case MESA_FORMAT_L8A8_UNORM:
     95       return PIPE_FORMAT_LA88_UNORM;
     96    case MESA_FORMAT_A8L8_UNORM:
     97       return PIPE_FORMAT_AL88_UNORM;
     98    case MESA_FORMAT_L16A16_UNORM:
     99       return PIPE_FORMAT_LA1616_UNORM;
    100    case MESA_FORMAT_A16L16_UNORM:
    101       return PIPE_FORMAT_AL1616_UNORM;
    102    case MESA_FORMAT_A_UNORM8:
    103       return PIPE_FORMAT_A8_UNORM;
    104    case MESA_FORMAT_A_UNORM16:
    105       return PIPE_FORMAT_A16_UNORM;
    106    case MESA_FORMAT_L_UNORM8:
    107       return PIPE_FORMAT_L8_UNORM;
    108    case MESA_FORMAT_L_UNORM16:
    109       return PIPE_FORMAT_L16_UNORM;
    110    case MESA_FORMAT_I_UNORM8:
    111       return PIPE_FORMAT_I8_UNORM;
    112    case MESA_FORMAT_I_UNORM16:
    113       return PIPE_FORMAT_I16_UNORM;
    114    case MESA_FORMAT_Z_UNORM16:
    115       return PIPE_FORMAT_Z16_UNORM;
    116    case MESA_FORMAT_Z_UNORM32:
    117       return PIPE_FORMAT_Z32_UNORM;
    118    case MESA_FORMAT_S8_UINT_Z24_UNORM:
    119       return PIPE_FORMAT_S8_UINT_Z24_UNORM;
    120    case MESA_FORMAT_Z24_UNORM_S8_UINT:
    121       return PIPE_FORMAT_Z24_UNORM_S8_UINT;
    122    case MESA_FORMAT_X8_UINT_Z24_UNORM:
    123       return PIPE_FORMAT_X8Z24_UNORM;
    124    case MESA_FORMAT_Z24_UNORM_X8_UINT:
    125       return PIPE_FORMAT_Z24X8_UNORM;
    126    case MESA_FORMAT_S_UINT8:
    127       return PIPE_FORMAT_S8_UINT;
    128    case MESA_FORMAT_Z_FLOAT32:
    129       return PIPE_FORMAT_Z32_FLOAT;
    130    case MESA_FORMAT_Z32_FLOAT_S8X24_UINT:
    131       return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT;
    132    case MESA_FORMAT_YCBCR:
    133       return PIPE_FORMAT_UYVY;
    134    case MESA_FORMAT_YCBCR_REV:
    135       return PIPE_FORMAT_YUYV;
    136    case MESA_FORMAT_RGB_DXT1:
    137       return PIPE_FORMAT_DXT1_RGB;
    138    case MESA_FORMAT_RGBA_DXT1:
    139       return PIPE_FORMAT_DXT1_RGBA;
    140    case MESA_FORMAT_RGBA_DXT3:
    141       return PIPE_FORMAT_DXT3_RGBA;
    142    case MESA_FORMAT_RGBA_DXT5:
    143       return PIPE_FORMAT_DXT5_RGBA;
    144    case MESA_FORMAT_SRGB_DXT1:
    145       return PIPE_FORMAT_DXT1_SRGB;
    146    case MESA_FORMAT_SRGBA_DXT1:
    147       return PIPE_FORMAT_DXT1_SRGBA;
    148    case MESA_FORMAT_SRGBA_DXT3:
    149       return PIPE_FORMAT_DXT3_SRGBA;
    150    case MESA_FORMAT_SRGBA_DXT5:
    151       return PIPE_FORMAT_DXT5_SRGBA;
    152    case MESA_FORMAT_L8A8_SRGB:
    153       return PIPE_FORMAT_LA88_SRGB;
    154    case MESA_FORMAT_A8L8_SRGB:
    155       return PIPE_FORMAT_AL88_SRGB;
    156    case MESA_FORMAT_L_SRGB8:
    157       return PIPE_FORMAT_L8_SRGB;
    158    case MESA_FORMAT_BGR_SRGB8:
    159       return PIPE_FORMAT_R8G8B8_SRGB;
    160    case MESA_FORMAT_A8B8G8R8_SRGB:
    161       return PIPE_FORMAT_ABGR8888_SRGB;
    162    case MESA_FORMAT_R8G8B8A8_SRGB:
    163       return PIPE_FORMAT_RGBA8888_SRGB;
    164    case MESA_FORMAT_B8G8R8A8_SRGB:
    165       return PIPE_FORMAT_BGRA8888_SRGB;
    166    case MESA_FORMAT_A8R8G8B8_SRGB:
    167       return PIPE_FORMAT_ARGB8888_SRGB;
    168    case MESA_FORMAT_RGBA_FLOAT32:
    169       return PIPE_FORMAT_R32G32B32A32_FLOAT;
    170    case MESA_FORMAT_RGBA_FLOAT16:
    171       return PIPE_FORMAT_R16G16B16A16_FLOAT;
    172    case MESA_FORMAT_RGB_FLOAT32:
    173       return PIPE_FORMAT_R32G32B32_FLOAT;
    174    case MESA_FORMAT_RGB_FLOAT16:
    175       return PIPE_FORMAT_R16G16B16_FLOAT;
    176    case MESA_FORMAT_LA_FLOAT32:
    177       return PIPE_FORMAT_L32A32_FLOAT;
    178    case MESA_FORMAT_LA_FLOAT16:
    179       return PIPE_FORMAT_L16A16_FLOAT;
    180    case MESA_FORMAT_L_FLOAT32:
    181       return PIPE_FORMAT_L32_FLOAT;
    182    case MESA_FORMAT_L_FLOAT16:
    183       return PIPE_FORMAT_L16_FLOAT;
    184    case MESA_FORMAT_A_FLOAT32:
    185       return PIPE_FORMAT_A32_FLOAT;
    186    case MESA_FORMAT_A_FLOAT16:
    187       return PIPE_FORMAT_A16_FLOAT;
    188    case MESA_FORMAT_I_FLOAT32:
    189       return PIPE_FORMAT_I32_FLOAT;
    190    case MESA_FORMAT_I_FLOAT16:
    191       return PIPE_FORMAT_I16_FLOAT;
    192    case MESA_FORMAT_R_FLOAT32:
    193       return PIPE_FORMAT_R32_FLOAT;
    194    case MESA_FORMAT_R_FLOAT16:
    195       return PIPE_FORMAT_R16_FLOAT;
    196    case MESA_FORMAT_RG_FLOAT32:
    197       return PIPE_FORMAT_R32G32_FLOAT;
    198    case MESA_FORMAT_RG_FLOAT16:
    199       return PIPE_FORMAT_R16G16_FLOAT;
    200 
    201    case MESA_FORMAT_R_UNORM8:
    202       return PIPE_FORMAT_R8_UNORM;
    203    case MESA_FORMAT_R_UNORM16:
    204       return PIPE_FORMAT_R16_UNORM;
    205    case MESA_FORMAT_R8G8_UNORM:
    206       return PIPE_FORMAT_RG88_UNORM;
    207    case MESA_FORMAT_G8R8_UNORM:
    208       return PIPE_FORMAT_GR88_UNORM;
    209    case MESA_FORMAT_R16G16_UNORM:
    210       return PIPE_FORMAT_RG1616_UNORM;
    211    case MESA_FORMAT_G16R16_UNORM:
    212       return PIPE_FORMAT_GR1616_UNORM;
    213    case MESA_FORMAT_RGBA_UNORM16:
    214       return PIPE_FORMAT_R16G16B16A16_UNORM;
    215 
    216    /* signed int formats */
    217    case MESA_FORMAT_A_UINT8:
    218       return PIPE_FORMAT_A8_UINT;
    219    case MESA_FORMAT_A_UINT16:
    220       return PIPE_FORMAT_A16_UINT;
    221    case MESA_FORMAT_A_UINT32:
    222       return PIPE_FORMAT_A32_UINT;
    223 
    224    case MESA_FORMAT_A_SINT8:
    225       return PIPE_FORMAT_A8_SINT;
    226    case MESA_FORMAT_A_SINT16:
    227       return PIPE_FORMAT_A16_SINT;
    228    case MESA_FORMAT_A_SINT32:
    229       return PIPE_FORMAT_A32_SINT;
    230 
    231    case MESA_FORMAT_I_UINT8:
    232       return PIPE_FORMAT_I8_UINT;
    233    case MESA_FORMAT_I_UINT16:
    234       return PIPE_FORMAT_I16_UINT;
    235    case MESA_FORMAT_I_UINT32:
    236       return PIPE_FORMAT_I32_UINT;
    237 
    238    case MESA_FORMAT_I_SINT8:
    239       return PIPE_FORMAT_I8_SINT;
    240    case MESA_FORMAT_I_SINT16:
    241       return PIPE_FORMAT_I16_SINT;
    242    case MESA_FORMAT_I_SINT32:
    243       return PIPE_FORMAT_I32_SINT;
    244 
    245    case MESA_FORMAT_L_UINT8:
    246       return PIPE_FORMAT_L8_UINT;
    247    case MESA_FORMAT_L_UINT16:
    248       return PIPE_FORMAT_L16_UINT;
    249    case MESA_FORMAT_L_UINT32:
    250       return PIPE_FORMAT_L32_UINT;
    251 
    252    case MESA_FORMAT_L_SINT8:
    253       return PIPE_FORMAT_L8_SINT;
    254    case MESA_FORMAT_L_SINT16:
    255       return PIPE_FORMAT_L16_SINT;
    256    case MESA_FORMAT_L_SINT32:
    257       return PIPE_FORMAT_L32_SINT;
    258 
    259    case MESA_FORMAT_LA_UINT8:
    260       return PIPE_FORMAT_L8A8_UINT;
    261    case MESA_FORMAT_LA_UINT16:
    262       return PIPE_FORMAT_L16A16_UINT;
    263    case MESA_FORMAT_LA_UINT32:
    264       return PIPE_FORMAT_L32A32_UINT;
    265 
    266    case MESA_FORMAT_LA_SINT8:
    267       return PIPE_FORMAT_L8A8_SINT;
    268    case MESA_FORMAT_LA_SINT16:
    269       return PIPE_FORMAT_L16A16_SINT;
    270    case MESA_FORMAT_LA_SINT32:
    271       return PIPE_FORMAT_L32A32_SINT;
    272 
    273    case MESA_FORMAT_R_SINT8:
    274       return PIPE_FORMAT_R8_SINT;
    275    case MESA_FORMAT_RG_SINT8:
    276       return PIPE_FORMAT_R8G8_SINT;
    277    case MESA_FORMAT_RGB_SINT8:
    278       return PIPE_FORMAT_R8G8B8_SINT;
    279    case MESA_FORMAT_RGBA_SINT8:
    280       return PIPE_FORMAT_R8G8B8A8_SINT;
    281    case MESA_FORMAT_R_SINT16:
    282       return PIPE_FORMAT_R16_SINT;
    283    case MESA_FORMAT_RG_SINT16:
    284       return PIPE_FORMAT_R16G16_SINT;
    285    case MESA_FORMAT_RGB_SINT16:
    286       return PIPE_FORMAT_R16G16B16_SINT;
    287    case MESA_FORMAT_RGBA_SINT16:
    288       return PIPE_FORMAT_R16G16B16A16_SINT;
    289    case MESA_FORMAT_R_SINT32:
    290       return PIPE_FORMAT_R32_SINT;
    291    case MESA_FORMAT_RG_SINT32:
    292       return PIPE_FORMAT_R32G32_SINT;
    293    case MESA_FORMAT_RGB_SINT32:
    294       return PIPE_FORMAT_R32G32B32_SINT;
    295    case MESA_FORMAT_RGBA_SINT32:
    296       return PIPE_FORMAT_R32G32B32A32_SINT;
    297 
    298    /* unsigned int formats */
    299    case MESA_FORMAT_R_UINT8:
    300       return PIPE_FORMAT_R8_UINT;
    301    case MESA_FORMAT_RG_UINT8:
    302       return PIPE_FORMAT_R8G8_UINT;
    303    case MESA_FORMAT_RGB_UINT8:
    304       return PIPE_FORMAT_R8G8B8_UINT;
    305    case MESA_FORMAT_RGBA_UINT8:
    306       return PIPE_FORMAT_R8G8B8A8_UINT;
    307    case MESA_FORMAT_R_UINT16:
    308       return PIPE_FORMAT_R16_UINT;
    309    case MESA_FORMAT_RG_UINT16:
    310       return PIPE_FORMAT_R16G16_UINT;
    311    case MESA_FORMAT_RGB_UINT16:
    312       return PIPE_FORMAT_R16G16B16_UINT;
    313    case MESA_FORMAT_RGBA_UINT16:
    314       return PIPE_FORMAT_R16G16B16A16_UINT;
    315    case MESA_FORMAT_R_UINT32:
    316       return PIPE_FORMAT_R32_UINT;
    317    case MESA_FORMAT_RG_UINT32:
    318       return PIPE_FORMAT_R32G32_UINT;
    319    case MESA_FORMAT_RGB_UINT32:
    320       return PIPE_FORMAT_R32G32B32_UINT;
    321    case MESA_FORMAT_RGBA_UINT32:
    322       return PIPE_FORMAT_R32G32B32A32_UINT;
    323 
    324    case MESA_FORMAT_R_RGTC1_UNORM:
    325       return PIPE_FORMAT_RGTC1_UNORM;
    326    case MESA_FORMAT_R_RGTC1_SNORM:
    327       return PIPE_FORMAT_RGTC1_SNORM;
    328    case MESA_FORMAT_RG_RGTC2_UNORM:
    329       return PIPE_FORMAT_RGTC2_UNORM;
    330    case MESA_FORMAT_RG_RGTC2_SNORM:
    331       return PIPE_FORMAT_RGTC2_SNORM;
    332 
    333    case MESA_FORMAT_L_LATC1_UNORM:
    334       return PIPE_FORMAT_LATC1_UNORM;
    335    case MESA_FORMAT_L_LATC1_SNORM:
    336       return PIPE_FORMAT_LATC1_SNORM;
    337    case MESA_FORMAT_LA_LATC2_UNORM:
    338       return PIPE_FORMAT_LATC2_UNORM;
    339    case MESA_FORMAT_LA_LATC2_SNORM:
    340       return PIPE_FORMAT_LATC2_SNORM;
    341 
    342    /* The destination RGBA format mustn't be changed, because it's also
    343     * a destination format of the unpack/decompression function. */
    344    case MESA_FORMAT_ETC1_RGB8:
    345       return st->has_etc1 ? PIPE_FORMAT_ETC1_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM;
    346 
    347    case MESA_FORMAT_BPTC_RGBA_UNORM:
    348       return PIPE_FORMAT_BPTC_RGBA_UNORM;
    349    case MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM:
    350       return PIPE_FORMAT_BPTC_SRGBA;
    351    case MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT:
    352       return PIPE_FORMAT_BPTC_RGB_FLOAT;
    353    case MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT:
    354       return PIPE_FORMAT_BPTC_RGB_UFLOAT;
    355 
    356    /* signed normalized formats */
    357    case MESA_FORMAT_R_SNORM8:
    358       return PIPE_FORMAT_R8_SNORM;
    359    case MESA_FORMAT_R8G8_SNORM:
    360       return PIPE_FORMAT_RG88_SNORM;
    361    case MESA_FORMAT_G8R8_SNORM:
    362       return PIPE_FORMAT_GR88_SNORM;
    363    case MESA_FORMAT_R8G8B8A8_SNORM:
    364       return PIPE_FORMAT_RGBA8888_SNORM;
    365    case MESA_FORMAT_A8B8G8R8_SNORM:
    366       return PIPE_FORMAT_ABGR8888_SNORM;
    367 
    368    case MESA_FORMAT_A_SNORM8:
    369       return PIPE_FORMAT_A8_SNORM;
    370    case MESA_FORMAT_L_SNORM8:
    371       return PIPE_FORMAT_L8_SNORM;
    372    case MESA_FORMAT_L8A8_SNORM:
    373       return PIPE_FORMAT_LA88_SNORM;
    374    case MESA_FORMAT_A8L8_SNORM:
    375       return PIPE_FORMAT_AL88_SNORM;
    376    case MESA_FORMAT_I_SNORM8:
    377       return PIPE_FORMAT_I8_SNORM;
    378 
    379    case MESA_FORMAT_R_SNORM16:
    380       return PIPE_FORMAT_R16_SNORM;
    381    case MESA_FORMAT_R16G16_SNORM:
    382       return PIPE_FORMAT_RG1616_SNORM;
    383    case MESA_FORMAT_G16R16_SNORM:
    384       return PIPE_FORMAT_GR1616_SNORM;
    385    case MESA_FORMAT_RGBA_SNORM16:
    386       return PIPE_FORMAT_R16G16B16A16_SNORM;
    387 
    388    case MESA_FORMAT_A_SNORM16:
    389       return PIPE_FORMAT_A16_SNORM;
    390    case MESA_FORMAT_L_SNORM16:
    391       return PIPE_FORMAT_L16_SNORM;
    392    case MESA_FORMAT_LA_SNORM16:
    393       return PIPE_FORMAT_L16A16_SNORM;
    394    case MESA_FORMAT_I_SNORM16:
    395       return PIPE_FORMAT_I16_SNORM;
    396 
    397    case MESA_FORMAT_R9G9B9E5_FLOAT:
    398       return PIPE_FORMAT_R9G9B9E5_FLOAT;
    399    case MESA_FORMAT_R11G11B10_FLOAT:
    400       return PIPE_FORMAT_R11G11B10_FLOAT;
    401    case MESA_FORMAT_B10G10R10A2_UINT:
    402       return PIPE_FORMAT_B10G10R10A2_UINT;
    403    case MESA_FORMAT_R10G10B10A2_UINT:
    404       return PIPE_FORMAT_R10G10B10A2_UINT;
    405 
    406    case MESA_FORMAT_B4G4R4X4_UNORM:
    407       return PIPE_FORMAT_B4G4R4X4_UNORM;
    408    case MESA_FORMAT_B5G5R5X1_UNORM:
    409       return PIPE_FORMAT_B5G5R5X1_UNORM;
    410    case MESA_FORMAT_R8G8B8X8_SNORM:
    411       return PIPE_FORMAT_RGBX8888_SNORM;
    412    case MESA_FORMAT_X8B8G8R8_SNORM:
    413       return PIPE_FORMAT_XBGR8888_SNORM;
    414    case MESA_FORMAT_R8G8B8X8_SRGB:
    415       return PIPE_FORMAT_RGBX8888_SRGB;
    416    case MESA_FORMAT_X8B8G8R8_SRGB:
    417       return PIPE_FORMAT_XBGR8888_SRGB;
    418    case MESA_FORMAT_RGBX_UINT8:
    419       return PIPE_FORMAT_R8G8B8X8_UINT;
    420    case MESA_FORMAT_RGBX_SINT8:
    421       return PIPE_FORMAT_R8G8B8X8_SINT;
    422    case MESA_FORMAT_B10G10R10X2_UNORM:
    423       return PIPE_FORMAT_B10G10R10X2_UNORM;
    424    case MESA_FORMAT_RGBX_UNORM16:
    425       return PIPE_FORMAT_R16G16B16X16_UNORM;
    426    case MESA_FORMAT_RGBX_SNORM16:
    427       return PIPE_FORMAT_R16G16B16X16_SNORM;
    428    case MESA_FORMAT_RGBX_FLOAT16:
    429       return PIPE_FORMAT_R16G16B16X16_FLOAT;
    430    case MESA_FORMAT_RGBX_UINT16:
    431       return PIPE_FORMAT_R16G16B16X16_UINT;
    432    case MESA_FORMAT_RGBX_SINT16:
    433       return PIPE_FORMAT_R16G16B16X16_SINT;
    434    case MESA_FORMAT_RGBX_FLOAT32:
    435       return PIPE_FORMAT_R32G32B32X32_FLOAT;
    436    case MESA_FORMAT_RGBX_UINT32:
    437       return PIPE_FORMAT_R32G32B32X32_UINT;
    438    case MESA_FORMAT_RGBX_SINT32:
    439       return PIPE_FORMAT_R32G32B32X32_SINT;
    440 
    441    case MESA_FORMAT_B8G8R8X8_SRGB:
    442       return PIPE_FORMAT_BGRX8888_SRGB;
    443    case MESA_FORMAT_X8R8G8B8_SRGB:
    444       return PIPE_FORMAT_XRGB8888_SRGB;
    445 
    446    /* ETC2 formats are emulated as uncompressed ones.
    447     * The destination formats mustn't be changed, because they are also
    448     * destination formats of the unpack/decompression function. */
    449    case MESA_FORMAT_ETC2_RGB8:
    450       return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8 : PIPE_FORMAT_R8G8B8A8_UNORM;
    451    case MESA_FORMAT_ETC2_SRGB8:
    452       return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8 : PIPE_FORMAT_B8G8R8A8_SRGB;
    453    case MESA_FORMAT_ETC2_RGBA8_EAC:
    454       return st->has_etc2 ? PIPE_FORMAT_ETC2_RGBA8 : PIPE_FORMAT_R8G8B8A8_UNORM;
    455    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
    456       return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGBA8 : PIPE_FORMAT_B8G8R8A8_SRGB;
    457    case MESA_FORMAT_ETC2_R11_EAC:
    458       return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_UNORM : PIPE_FORMAT_R16_UNORM;
    459    case MESA_FORMAT_ETC2_RG11_EAC:
    460       return st->has_etc2 ? PIPE_FORMAT_ETC2_RG11_UNORM : PIPE_FORMAT_R16G16_UNORM;
    461    case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
    462       return st->has_etc2 ? PIPE_FORMAT_ETC2_R11_SNORM : PIPE_FORMAT_R16_SNORM;
    463    case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
    464       return st->has_etc2 ? PIPE_FORMAT_ETC2_RG11_SNORM : PIPE_FORMAT_R16G16_SNORM;
    465    case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
    466       return st->has_etc2 ? PIPE_FORMAT_ETC2_RGB8A1 : PIPE_FORMAT_R8G8B8A8_UNORM;
    467    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
    468       return st->has_etc2 ? PIPE_FORMAT_ETC2_SRGB8A1 : PIPE_FORMAT_B8G8R8A8_SRGB;
    469 
    470    case MESA_FORMAT_RGBA_ASTC_4x4:
    471       return PIPE_FORMAT_ASTC_4x4;
    472    case MESA_FORMAT_RGBA_ASTC_5x4:
    473       return PIPE_FORMAT_ASTC_5x4;
    474    case MESA_FORMAT_RGBA_ASTC_5x5:
    475       return PIPE_FORMAT_ASTC_5x5;
    476    case MESA_FORMAT_RGBA_ASTC_6x5:
    477       return PIPE_FORMAT_ASTC_6x5;
    478    case MESA_FORMAT_RGBA_ASTC_6x6:
    479       return PIPE_FORMAT_ASTC_6x6;
    480    case MESA_FORMAT_RGBA_ASTC_8x5:
    481       return PIPE_FORMAT_ASTC_8x5;
    482    case MESA_FORMAT_RGBA_ASTC_8x6:
    483       return PIPE_FORMAT_ASTC_8x6;
    484    case MESA_FORMAT_RGBA_ASTC_8x8:
    485       return PIPE_FORMAT_ASTC_8x8;
    486    case MESA_FORMAT_RGBA_ASTC_10x5:
    487       return PIPE_FORMAT_ASTC_10x5;
    488    case MESA_FORMAT_RGBA_ASTC_10x6:
    489       return PIPE_FORMAT_ASTC_10x6;
    490    case MESA_FORMAT_RGBA_ASTC_10x8:
    491       return PIPE_FORMAT_ASTC_10x8;
    492    case MESA_FORMAT_RGBA_ASTC_10x10:
    493       return PIPE_FORMAT_ASTC_10x10;
    494    case MESA_FORMAT_RGBA_ASTC_12x10:
    495       return PIPE_FORMAT_ASTC_12x10;
    496    case MESA_FORMAT_RGBA_ASTC_12x12:
    497       return PIPE_FORMAT_ASTC_12x12;
    498 
    499    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4:
    500       return PIPE_FORMAT_ASTC_4x4_SRGB;
    501    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4:
    502       return PIPE_FORMAT_ASTC_5x4_SRGB;
    503    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5:
    504       return PIPE_FORMAT_ASTC_5x5_SRGB;
    505    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5:
    506       return PIPE_FORMAT_ASTC_6x5_SRGB;
    507    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6:
    508       return PIPE_FORMAT_ASTC_6x6_SRGB;
    509    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5:
    510       return PIPE_FORMAT_ASTC_8x5_SRGB;
    511    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6:
    512       return PIPE_FORMAT_ASTC_8x6_SRGB;
    513    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8:
    514       return PIPE_FORMAT_ASTC_8x8_SRGB;
    515    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5:
    516       return PIPE_FORMAT_ASTC_10x5_SRGB;
    517    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6:
    518       return PIPE_FORMAT_ASTC_10x6_SRGB;
    519    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8:
    520       return PIPE_FORMAT_ASTC_10x8_SRGB;
    521    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10:
    522       return PIPE_FORMAT_ASTC_10x10_SRGB;
    523    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10:
    524       return PIPE_FORMAT_ASTC_12x10_SRGB;
    525    case MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12:
    526       return PIPE_FORMAT_ASTC_12x12_SRGB;
    527 
    528    default:
    529       return PIPE_FORMAT_NONE;
    530    }
    531 }
    532 
    533 
    534 /**
    535  * Translate Gallium format to Mesa format.
    536  */
    537 mesa_format
    538 st_pipe_format_to_mesa_format(enum pipe_format format)
    539 {
    540    switch (format) {
    541    case PIPE_FORMAT_ABGR8888_UNORM:
    542       return MESA_FORMAT_A8B8G8R8_UNORM;
    543    case PIPE_FORMAT_RGBA8888_UNORM:
    544       return MESA_FORMAT_R8G8B8A8_UNORM;
    545    case PIPE_FORMAT_BGRA8888_UNORM:
    546       return MESA_FORMAT_B8G8R8A8_UNORM;
    547    case PIPE_FORMAT_ARGB8888_UNORM:
    548       return MESA_FORMAT_A8R8G8B8_UNORM;
    549    case PIPE_FORMAT_XBGR8888_UNORM:
    550       return MESA_FORMAT_X8B8G8R8_UNORM;
    551    case PIPE_FORMAT_RGBX8888_UNORM:
    552       return MESA_FORMAT_R8G8B8X8_UNORM;
    553    case PIPE_FORMAT_BGRX8888_UNORM:
    554       return MESA_FORMAT_B8G8R8X8_UNORM;
    555    case PIPE_FORMAT_XRGB8888_UNORM:
    556       return MESA_FORMAT_X8R8G8B8_UNORM;
    557    case PIPE_FORMAT_B5G5R5A1_UNORM:
    558       return MESA_FORMAT_B5G5R5A1_UNORM;
    559    case PIPE_FORMAT_B4G4R4A4_UNORM:
    560       return MESA_FORMAT_B4G4R4A4_UNORM;
    561    case PIPE_FORMAT_B5G6R5_UNORM:
    562       return MESA_FORMAT_B5G6R5_UNORM;
    563    case PIPE_FORMAT_B2G3R3_UNORM:
    564       return MESA_FORMAT_B2G3R3_UNORM;
    565    case PIPE_FORMAT_B10G10R10A2_UNORM:
    566       return MESA_FORMAT_B10G10R10A2_UNORM;
    567    case PIPE_FORMAT_R10G10B10A2_UNORM:
    568       return MESA_FORMAT_R10G10B10A2_UNORM;
    569    case PIPE_FORMAT_L4A4_UNORM:
    570       return MESA_FORMAT_L4A4_UNORM;
    571    case PIPE_FORMAT_LA88_UNORM:
    572       return MESA_FORMAT_L8A8_UNORM;
    573    case PIPE_FORMAT_AL88_UNORM:
    574       return MESA_FORMAT_A8L8_UNORM;
    575    case PIPE_FORMAT_LA1616_UNORM:
    576       return MESA_FORMAT_L16A16_UNORM;
    577    case PIPE_FORMAT_AL1616_UNORM:
    578       return MESA_FORMAT_A16L16_UNORM;
    579    case PIPE_FORMAT_A8_UNORM:
    580       return MESA_FORMAT_A_UNORM8;
    581    case PIPE_FORMAT_A16_UNORM:
    582       return MESA_FORMAT_A_UNORM16;
    583    case PIPE_FORMAT_L8_UNORM:
    584       return MESA_FORMAT_L_UNORM8;
    585    case PIPE_FORMAT_L16_UNORM:
    586       return MESA_FORMAT_L_UNORM16;
    587    case PIPE_FORMAT_I8_UNORM:
    588       return MESA_FORMAT_I_UNORM8;
    589    case PIPE_FORMAT_I16_UNORM:
    590       return MESA_FORMAT_I_UNORM16;
    591    case PIPE_FORMAT_S8_UINT:
    592       return MESA_FORMAT_S_UINT8;
    593 
    594    case PIPE_FORMAT_R16G16B16A16_UNORM:
    595       return MESA_FORMAT_RGBA_UNORM16;
    596 
    597    case PIPE_FORMAT_Z16_UNORM:
    598       return MESA_FORMAT_Z_UNORM16;
    599    case PIPE_FORMAT_Z32_UNORM:
    600       return MESA_FORMAT_Z_UNORM32;
    601    case PIPE_FORMAT_S8_UINT_Z24_UNORM:
    602       return MESA_FORMAT_S8_UINT_Z24_UNORM;
    603    case PIPE_FORMAT_X8Z24_UNORM:
    604       return MESA_FORMAT_X8_UINT_Z24_UNORM;
    605    case PIPE_FORMAT_Z24X8_UNORM:
    606       return MESA_FORMAT_Z24_UNORM_X8_UINT;
    607    case PIPE_FORMAT_Z24_UNORM_S8_UINT:
    608       return MESA_FORMAT_Z24_UNORM_S8_UINT;
    609    case PIPE_FORMAT_Z32_FLOAT:
    610       return MESA_FORMAT_Z_FLOAT32;
    611    case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
    612       return MESA_FORMAT_Z32_FLOAT_S8X24_UINT;
    613 
    614    case PIPE_FORMAT_UYVY:
    615       return MESA_FORMAT_YCBCR;
    616    case PIPE_FORMAT_YUYV:
    617       return MESA_FORMAT_YCBCR_REV;
    618 
    619    case PIPE_FORMAT_DXT1_RGB:
    620       return MESA_FORMAT_RGB_DXT1;
    621    case PIPE_FORMAT_DXT1_RGBA:
    622       return MESA_FORMAT_RGBA_DXT1;
    623    case PIPE_FORMAT_DXT3_RGBA:
    624       return MESA_FORMAT_RGBA_DXT3;
    625    case PIPE_FORMAT_DXT5_RGBA:
    626       return MESA_FORMAT_RGBA_DXT5;
    627    case PIPE_FORMAT_DXT1_SRGB:
    628       return MESA_FORMAT_SRGB_DXT1;
    629    case PIPE_FORMAT_DXT1_SRGBA:
    630       return MESA_FORMAT_SRGBA_DXT1;
    631    case PIPE_FORMAT_DXT3_SRGBA:
    632       return MESA_FORMAT_SRGBA_DXT3;
    633    case PIPE_FORMAT_DXT5_SRGBA:
    634       return MESA_FORMAT_SRGBA_DXT5;
    635    case PIPE_FORMAT_LA88_SRGB:
    636       return MESA_FORMAT_L8A8_SRGB;
    637    case PIPE_FORMAT_AL88_SRGB:
    638       return MESA_FORMAT_A8L8_SRGB;
    639    case PIPE_FORMAT_L8_SRGB:
    640       return MESA_FORMAT_L_SRGB8;
    641    case PIPE_FORMAT_R8G8B8_SRGB:
    642       return MESA_FORMAT_BGR_SRGB8;
    643    case PIPE_FORMAT_ABGR8888_SRGB:
    644       return MESA_FORMAT_A8B8G8R8_SRGB;
    645    case PIPE_FORMAT_RGBA8888_SRGB:
    646       return MESA_FORMAT_R8G8B8A8_SRGB;
    647    case PIPE_FORMAT_BGRA8888_SRGB:
    648       return MESA_FORMAT_B8G8R8A8_SRGB;
    649    case PIPE_FORMAT_ARGB8888_SRGB:
    650       return MESA_FORMAT_A8R8G8B8_SRGB;
    651    case PIPE_FORMAT_R32G32B32A32_FLOAT:
    652       return MESA_FORMAT_RGBA_FLOAT32;
    653    case PIPE_FORMAT_R16G16B16A16_FLOAT:
    654       return MESA_FORMAT_RGBA_FLOAT16;
    655    case PIPE_FORMAT_R32G32B32_FLOAT:
    656       return MESA_FORMAT_RGB_FLOAT32;
    657    case PIPE_FORMAT_R16G16B16_FLOAT:
    658       return MESA_FORMAT_RGB_FLOAT16;
    659    case PIPE_FORMAT_L32A32_FLOAT:
    660       return MESA_FORMAT_LA_FLOAT32;
    661    case PIPE_FORMAT_L16A16_FLOAT:
    662       return MESA_FORMAT_LA_FLOAT16;
    663    case PIPE_FORMAT_L32_FLOAT:
    664       return MESA_FORMAT_L_FLOAT32;
    665    case PIPE_FORMAT_L16_FLOAT:
    666       return MESA_FORMAT_L_FLOAT16;
    667    case PIPE_FORMAT_A32_FLOAT:
    668       return MESA_FORMAT_A_FLOAT32;
    669    case PIPE_FORMAT_A16_FLOAT:
    670       return MESA_FORMAT_A_FLOAT16;
    671    case PIPE_FORMAT_I32_FLOAT:
    672       return MESA_FORMAT_I_FLOAT32;
    673    case PIPE_FORMAT_I16_FLOAT:
    674       return MESA_FORMAT_I_FLOAT16;
    675    case PIPE_FORMAT_R32_FLOAT:
    676       return MESA_FORMAT_R_FLOAT32;
    677    case PIPE_FORMAT_R16_FLOAT:
    678       return MESA_FORMAT_R_FLOAT16;
    679    case PIPE_FORMAT_R32G32_FLOAT:
    680       return MESA_FORMAT_RG_FLOAT32;
    681    case PIPE_FORMAT_R16G16_FLOAT:
    682       return MESA_FORMAT_RG_FLOAT16;
    683 
    684    case PIPE_FORMAT_R8_UNORM:
    685       return MESA_FORMAT_R_UNORM8;
    686    case PIPE_FORMAT_R16_UNORM:
    687       return MESA_FORMAT_R_UNORM16;
    688    case PIPE_FORMAT_RG88_UNORM:
    689       return MESA_FORMAT_R8G8_UNORM;
    690    case PIPE_FORMAT_GR88_UNORM:
    691       return MESA_FORMAT_G8R8_UNORM;
    692    case PIPE_FORMAT_RG1616_UNORM:
    693       return MESA_FORMAT_R16G16_UNORM;
    694    case PIPE_FORMAT_GR1616_UNORM:
    695       return MESA_FORMAT_G16R16_UNORM;
    696 
    697    case PIPE_FORMAT_A8_UINT:
    698       return MESA_FORMAT_A_UINT8;
    699    case PIPE_FORMAT_A16_UINT:
    700       return MESA_FORMAT_A_UINT16;
    701    case PIPE_FORMAT_A32_UINT:
    702       return MESA_FORMAT_A_UINT32;
    703    case PIPE_FORMAT_A8_SINT:
    704       return MESA_FORMAT_A_SINT8;
    705    case PIPE_FORMAT_A16_SINT:
    706       return MESA_FORMAT_A_SINT16;
    707    case PIPE_FORMAT_A32_SINT:
    708       return MESA_FORMAT_A_SINT32;
    709 
    710    case PIPE_FORMAT_I8_UINT:
    711       return MESA_FORMAT_I_UINT8;
    712    case PIPE_FORMAT_I16_UINT:
    713       return MESA_FORMAT_I_UINT16;
    714    case PIPE_FORMAT_I32_UINT:
    715       return MESA_FORMAT_I_UINT32;
    716    case PIPE_FORMAT_I8_SINT:
    717       return MESA_FORMAT_I_SINT8;
    718    case PIPE_FORMAT_I16_SINT:
    719       return MESA_FORMAT_I_SINT16;
    720    case PIPE_FORMAT_I32_SINT:
    721       return MESA_FORMAT_I_SINT32;
    722 
    723   case PIPE_FORMAT_L8_UINT:
    724       return MESA_FORMAT_L_UINT8;
    725    case PIPE_FORMAT_L16_UINT:
    726       return MESA_FORMAT_L_UINT16;
    727    case PIPE_FORMAT_L32_UINT:
    728       return MESA_FORMAT_L_UINT32;
    729    case PIPE_FORMAT_L8_SINT:
    730       return MESA_FORMAT_L_SINT8;
    731    case PIPE_FORMAT_L16_SINT:
    732       return MESA_FORMAT_L_SINT16;
    733    case PIPE_FORMAT_L32_SINT:
    734       return MESA_FORMAT_L_SINT32;
    735 
    736    case PIPE_FORMAT_L8A8_UINT:
    737       return MESA_FORMAT_LA_UINT8;
    738    case PIPE_FORMAT_L16A16_UINT:
    739       return MESA_FORMAT_LA_UINT16;
    740    case PIPE_FORMAT_L32A32_UINT:
    741       return MESA_FORMAT_LA_UINT32;
    742    case PIPE_FORMAT_L8A8_SINT:
    743       return MESA_FORMAT_LA_SINT8;
    744    case PIPE_FORMAT_L16A16_SINT:
    745       return MESA_FORMAT_LA_SINT16;
    746    case PIPE_FORMAT_L32A32_SINT:
    747       return MESA_FORMAT_LA_SINT32;
    748 
    749    case PIPE_FORMAT_R8_SINT:
    750       return MESA_FORMAT_R_SINT8;
    751    case PIPE_FORMAT_R8G8_SINT:
    752       return MESA_FORMAT_RG_SINT8;
    753    case PIPE_FORMAT_R8G8B8_SINT:
    754       return MESA_FORMAT_RGB_SINT8;
    755    case PIPE_FORMAT_R8G8B8A8_SINT:
    756       return MESA_FORMAT_RGBA_SINT8;
    757 
    758    case PIPE_FORMAT_R16_SINT:
    759       return MESA_FORMAT_R_SINT16;
    760    case PIPE_FORMAT_R16G16_SINT:
    761       return MESA_FORMAT_RG_SINT16;
    762    case PIPE_FORMAT_R16G16B16_SINT:
    763       return MESA_FORMAT_RGB_SINT16;
    764    case PIPE_FORMAT_R16G16B16A16_SINT:
    765       return MESA_FORMAT_RGBA_SINT16;
    766 
    767    case PIPE_FORMAT_R32_SINT:
    768       return MESA_FORMAT_R_SINT32;
    769    case PIPE_FORMAT_R32G32_SINT:
    770       return MESA_FORMAT_RG_SINT32;
    771    case PIPE_FORMAT_R32G32B32_SINT:
    772       return MESA_FORMAT_RGB_SINT32;
    773    case PIPE_FORMAT_R32G32B32A32_SINT:
    774       return MESA_FORMAT_RGBA_SINT32;
    775 
    776    /* unsigned int formats */
    777    case PIPE_FORMAT_R8_UINT:
    778       return MESA_FORMAT_R_UINT8;
    779    case PIPE_FORMAT_R8G8_UINT:
    780       return MESA_FORMAT_RG_UINT8;
    781    case PIPE_FORMAT_R8G8B8_UINT:
    782       return MESA_FORMAT_RGB_UINT8;
    783    case PIPE_FORMAT_R8G8B8A8_UINT:
    784       return MESA_FORMAT_RGBA_UINT8;
    785 
    786    case PIPE_FORMAT_R16_UINT:
    787       return MESA_FORMAT_R_UINT16;
    788    case PIPE_FORMAT_R16G16_UINT:
    789       return MESA_FORMAT_RG_UINT16;
    790    case PIPE_FORMAT_R16G16B16_UINT:
    791       return MESA_FORMAT_RGB_UINT16;
    792    case PIPE_FORMAT_R16G16B16A16_UINT:
    793       return MESA_FORMAT_RGBA_UINT16;
    794 
    795    case PIPE_FORMAT_R32_UINT:
    796       return MESA_FORMAT_R_UINT32;
    797    case PIPE_FORMAT_R32G32_UINT:
    798       return MESA_FORMAT_RG_UINT32;
    799    case PIPE_FORMAT_R32G32B32_UINT:
    800       return MESA_FORMAT_RGB_UINT32;
    801    case PIPE_FORMAT_R32G32B32A32_UINT:
    802       return MESA_FORMAT_RGBA_UINT32;
    803 
    804    case PIPE_FORMAT_RGTC1_UNORM:
    805       return MESA_FORMAT_R_RGTC1_UNORM;
    806    case PIPE_FORMAT_RGTC1_SNORM:
    807       return MESA_FORMAT_R_RGTC1_SNORM;
    808    case PIPE_FORMAT_RGTC2_UNORM:
    809       return MESA_FORMAT_RG_RGTC2_UNORM;
    810    case PIPE_FORMAT_RGTC2_SNORM:
    811       return MESA_FORMAT_RG_RGTC2_SNORM;
    812 
    813    case PIPE_FORMAT_LATC1_UNORM:
    814       return MESA_FORMAT_L_LATC1_UNORM;
    815    case PIPE_FORMAT_LATC1_SNORM:
    816       return MESA_FORMAT_L_LATC1_SNORM;
    817    case PIPE_FORMAT_LATC2_UNORM:
    818       return MESA_FORMAT_LA_LATC2_UNORM;
    819    case PIPE_FORMAT_LATC2_SNORM:
    820       return MESA_FORMAT_LA_LATC2_SNORM;
    821 
    822    case PIPE_FORMAT_ETC1_RGB8:
    823       return MESA_FORMAT_ETC1_RGB8;
    824 
    825    case PIPE_FORMAT_BPTC_RGBA_UNORM:
    826       return MESA_FORMAT_BPTC_RGBA_UNORM;
    827    case PIPE_FORMAT_BPTC_SRGBA:
    828       return MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM;
    829    case PIPE_FORMAT_BPTC_RGB_FLOAT:
    830       return MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT;
    831    case PIPE_FORMAT_BPTC_RGB_UFLOAT:
    832       return MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT;
    833 
    834    /* signed normalized formats */
    835    case PIPE_FORMAT_R8_SNORM:
    836       return MESA_FORMAT_R_SNORM8;
    837    case PIPE_FORMAT_RG88_SNORM:
    838       return MESA_FORMAT_R8G8_SNORM;
    839    case PIPE_FORMAT_GR88_SNORM:
    840       return MESA_FORMAT_G8R8_SNORM;
    841    case PIPE_FORMAT_RGBA8888_SNORM:
    842       return MESA_FORMAT_R8G8B8A8_SNORM;
    843    case PIPE_FORMAT_ABGR8888_SNORM:
    844       return MESA_FORMAT_A8B8G8R8_SNORM;
    845 
    846    case PIPE_FORMAT_A8_SNORM:
    847       return MESA_FORMAT_A_SNORM8;
    848    case PIPE_FORMAT_L8_SNORM:
    849       return MESA_FORMAT_L_SNORM8;
    850    case PIPE_FORMAT_LA88_SNORM:
    851       return MESA_FORMAT_L8A8_SNORM;
    852    case PIPE_FORMAT_AL88_SNORM:
    853       return MESA_FORMAT_A8L8_SNORM;
    854    case PIPE_FORMAT_I8_SNORM:
    855       return MESA_FORMAT_I_SNORM8;
    856 
    857    case PIPE_FORMAT_R16_SNORM:
    858       return MESA_FORMAT_R_SNORM16;
    859    case PIPE_FORMAT_RG1616_SNORM:
    860       return MESA_FORMAT_R16G16_SNORM;
    861    case PIPE_FORMAT_GR1616_SNORM:
    862       return MESA_FORMAT_G16R16_SNORM;
    863    case PIPE_FORMAT_R16G16B16A16_SNORM:
    864       return MESA_FORMAT_RGBA_SNORM16;
    865 
    866    case PIPE_FORMAT_A16_SNORM:
    867       return MESA_FORMAT_A_SNORM16;
    868    case PIPE_FORMAT_L16_SNORM:
    869       return MESA_FORMAT_L_SNORM16;
    870    case PIPE_FORMAT_L16A16_SNORM:
    871       return MESA_FORMAT_LA_SNORM16;
    872    case PIPE_FORMAT_I16_SNORM:
    873       return MESA_FORMAT_I_SNORM16;
    874 
    875    case PIPE_FORMAT_R9G9B9E5_FLOAT:
    876       return MESA_FORMAT_R9G9B9E5_FLOAT;
    877    case PIPE_FORMAT_R11G11B10_FLOAT:
    878       return MESA_FORMAT_R11G11B10_FLOAT;
    879 
    880    case PIPE_FORMAT_B10G10R10A2_UINT:
    881       return MESA_FORMAT_B10G10R10A2_UINT;
    882    case PIPE_FORMAT_R10G10B10A2_UINT:
    883       return MESA_FORMAT_R10G10B10A2_UINT;
    884 
    885    case PIPE_FORMAT_B4G4R4X4_UNORM:
    886       return MESA_FORMAT_B4G4R4X4_UNORM;
    887    case PIPE_FORMAT_B5G5R5X1_UNORM:
    888       return MESA_FORMAT_B5G5R5X1_UNORM;
    889    case PIPE_FORMAT_RGBX8888_SNORM:
    890       return MESA_FORMAT_R8G8B8X8_SNORM;
    891    case PIPE_FORMAT_XBGR8888_SNORM:
    892       return MESA_FORMAT_X8B8G8R8_SNORM;
    893    case PIPE_FORMAT_RGBX8888_SRGB:
    894       return MESA_FORMAT_R8G8B8X8_SRGB;
    895    case PIPE_FORMAT_XBGR8888_SRGB:
    896       return MESA_FORMAT_X8B8G8R8_SRGB;
    897    case PIPE_FORMAT_R8G8B8X8_UINT:
    898       return MESA_FORMAT_RGBX_UINT8;
    899    case PIPE_FORMAT_R8G8B8X8_SINT:
    900       return MESA_FORMAT_RGBX_SINT8;
    901    case PIPE_FORMAT_B10G10R10X2_UNORM:
    902       return MESA_FORMAT_B10G10R10X2_UNORM;
    903    case PIPE_FORMAT_R16G16B16X16_UNORM:
    904       return MESA_FORMAT_RGBX_UNORM16;
    905    case PIPE_FORMAT_R16G16B16X16_SNORM:
    906       return MESA_FORMAT_RGBX_SNORM16;
    907    case PIPE_FORMAT_R16G16B16X16_FLOAT:
    908       return MESA_FORMAT_RGBX_FLOAT16;
    909    case PIPE_FORMAT_R16G16B16X16_UINT:
    910       return MESA_FORMAT_RGBX_UINT16;
    911    case PIPE_FORMAT_R16G16B16X16_SINT:
    912       return MESA_FORMAT_RGBX_SINT16;
    913    case PIPE_FORMAT_R32G32B32X32_FLOAT:
    914       return MESA_FORMAT_RGBX_FLOAT32;
    915    case PIPE_FORMAT_R32G32B32X32_UINT:
    916       return MESA_FORMAT_RGBX_UINT32;
    917    case PIPE_FORMAT_R32G32B32X32_SINT:
    918       return MESA_FORMAT_RGBX_SINT32;
    919 
    920    case PIPE_FORMAT_BGRX8888_SRGB:
    921       return MESA_FORMAT_B8G8R8X8_SRGB;
    922    case PIPE_FORMAT_XRGB8888_SRGB:
    923       return MESA_FORMAT_X8R8G8B8_SRGB;
    924 
    925    case PIPE_FORMAT_ETC2_RGB8:
    926       return MESA_FORMAT_ETC2_RGB8;
    927    case PIPE_FORMAT_ETC2_SRGB8:
    928       return MESA_FORMAT_ETC2_SRGB8;
    929    case PIPE_FORMAT_ETC2_RGB8A1:
    930       return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
    931    case PIPE_FORMAT_ETC2_SRGB8A1:
    932       return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
    933    case PIPE_FORMAT_ETC2_RGBA8:
    934       return MESA_FORMAT_ETC2_RGBA8_EAC;
    935    case PIPE_FORMAT_ETC2_SRGBA8:
    936       return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
    937    case PIPE_FORMAT_ETC2_R11_UNORM:
    938       return MESA_FORMAT_ETC2_R11_EAC;
    939    case PIPE_FORMAT_ETC2_R11_SNORM:
    940       return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
    941    case PIPE_FORMAT_ETC2_RG11_UNORM:
    942       return MESA_FORMAT_ETC2_RG11_EAC;
    943    case PIPE_FORMAT_ETC2_RG11_SNORM:
    944       return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
    945 
    946    case PIPE_FORMAT_ASTC_4x4:
    947       return MESA_FORMAT_RGBA_ASTC_4x4;
    948    case PIPE_FORMAT_ASTC_5x4:
    949       return MESA_FORMAT_RGBA_ASTC_5x4;
    950    case PIPE_FORMAT_ASTC_5x5:
    951       return MESA_FORMAT_RGBA_ASTC_5x5;
    952    case PIPE_FORMAT_ASTC_6x5:
    953       return MESA_FORMAT_RGBA_ASTC_6x5;
    954    case PIPE_FORMAT_ASTC_6x6:
    955       return MESA_FORMAT_RGBA_ASTC_6x6;
    956    case PIPE_FORMAT_ASTC_8x5:
    957       return MESA_FORMAT_RGBA_ASTC_8x5;
    958    case PIPE_FORMAT_ASTC_8x6:
    959       return MESA_FORMAT_RGBA_ASTC_8x6;
    960    case PIPE_FORMAT_ASTC_8x8:
    961       return MESA_FORMAT_RGBA_ASTC_8x8;
    962    case PIPE_FORMAT_ASTC_10x5:
    963       return MESA_FORMAT_RGBA_ASTC_10x5;
    964    case PIPE_FORMAT_ASTC_10x6:
    965       return MESA_FORMAT_RGBA_ASTC_10x6;
    966    case PIPE_FORMAT_ASTC_10x8:
    967       return MESA_FORMAT_RGBA_ASTC_10x8;
    968    case PIPE_FORMAT_ASTC_10x10:
    969       return MESA_FORMAT_RGBA_ASTC_10x10;
    970    case PIPE_FORMAT_ASTC_12x10:
    971       return MESA_FORMAT_RGBA_ASTC_12x10;
    972    case PIPE_FORMAT_ASTC_12x12:
    973       return MESA_FORMAT_RGBA_ASTC_12x12;
    974 
    975    case PIPE_FORMAT_ASTC_4x4_SRGB:
    976       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_4x4;
    977    case PIPE_FORMAT_ASTC_5x4_SRGB:
    978       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x4;
    979    case PIPE_FORMAT_ASTC_5x5_SRGB:
    980       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_5x5;
    981    case PIPE_FORMAT_ASTC_6x5_SRGB:
    982       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x5;
    983    case PIPE_FORMAT_ASTC_6x6_SRGB:
    984       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_6x6;
    985    case PIPE_FORMAT_ASTC_8x5_SRGB:
    986       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x5;
    987    case PIPE_FORMAT_ASTC_8x6_SRGB:
    988       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x6;
    989    case PIPE_FORMAT_ASTC_8x8_SRGB:
    990       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_8x8;
    991    case PIPE_FORMAT_ASTC_10x5_SRGB:
    992       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x5;
    993    case PIPE_FORMAT_ASTC_10x6_SRGB:
    994       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x6;
    995    case PIPE_FORMAT_ASTC_10x8_SRGB:
    996       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x8;
    997    case PIPE_FORMAT_ASTC_10x10_SRGB:
    998       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_10x10;
    999    case PIPE_FORMAT_ASTC_12x10_SRGB:
   1000       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x10;
   1001    case PIPE_FORMAT_ASTC_12x12_SRGB:
   1002       return MESA_FORMAT_SRGB8_ALPHA8_ASTC_12x12;
   1003 
   1004    default:
   1005       return MESA_FORMAT_NONE;
   1006    }
   1007 }
   1008 
   1009 
   1010 /**
   1011  * Debug only: check that the two functions above correctly map
   1012  * Mesa formats to Gallium formats and back again.
   1013  */
   1014 static void
   1015 test_format_conversion(struct st_context *st)
   1016 {
   1017    GLuint i;
   1018 
   1019    /* test all Mesa formats */
   1020    for (i = 1; i < MESA_FORMAT_COUNT; i++) {
   1021       enum pipe_format pf;
   1022 
   1023       /* ETC formats are translated differently, skip them. */
   1024       if (_mesa_is_format_etc2(i))
   1025          continue;
   1026       if (i == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1)
   1027          continue;
   1028 
   1029       pf = st_mesa_format_to_pipe_format(st, i);
   1030       if (pf != PIPE_FORMAT_NONE) {
   1031          mesa_format mf = st_pipe_format_to_mesa_format(pf);
   1032          assert(mf == i);
   1033       }
   1034    }
   1035 
   1036    /* Test all Gallium formats */
   1037    for (i = 1; i < PIPE_FORMAT_COUNT; i++) {
   1038       mesa_format mf = st_pipe_format_to_mesa_format(i);
   1039 
   1040       /* ETC formats are translated differently, skip them. */
   1041       if (i == PIPE_FORMAT_ETC1_RGB8 && !st->has_etc1)
   1042          continue;
   1043 
   1044       if (_mesa_is_format_etc2(mf) && !st->has_etc2)
   1045          continue;
   1046 
   1047       if (mf != MESA_FORMAT_NONE) {
   1048          enum pipe_format pf = st_mesa_format_to_pipe_format(st, mf);
   1049          assert(pf == i);
   1050       }
   1051    }
   1052 }
   1053 
   1054 
   1055 /**
   1056  * Map GL texture formats to Gallium pipe formats.
   1057  */
   1058 struct format_mapping
   1059 {
   1060    GLenum glFormats[18];       /**< list of GLenum formats, 0-terminated */
   1061    enum pipe_format pipeFormats[13]; /**< list of pipe formats, 0-terminated */
   1062 };
   1063 
   1064 
   1065 #define DEFAULT_RGBA_FORMATS \
   1066       PIPE_FORMAT_R8G8B8A8_UNORM, \
   1067       PIPE_FORMAT_B8G8R8A8_UNORM, \
   1068       PIPE_FORMAT_A8R8G8B8_UNORM, \
   1069       PIPE_FORMAT_A8B8G8R8_UNORM, \
   1070       0
   1071 
   1072 #define DEFAULT_RGB_FORMATS \
   1073       PIPE_FORMAT_R8G8B8X8_UNORM, \
   1074       PIPE_FORMAT_B8G8R8X8_UNORM, \
   1075       PIPE_FORMAT_X8R8G8B8_UNORM, \
   1076       PIPE_FORMAT_X8B8G8R8_UNORM, \
   1077       PIPE_FORMAT_B5G6R5_UNORM, \
   1078       DEFAULT_RGBA_FORMATS
   1079 
   1080 #define DEFAULT_SRGBA_FORMATS \
   1081       PIPE_FORMAT_R8G8B8A8_SRGB, \
   1082       PIPE_FORMAT_B8G8R8A8_SRGB, \
   1083       PIPE_FORMAT_A8R8G8B8_SRGB, \
   1084       PIPE_FORMAT_A8B8G8R8_SRGB, \
   1085       0
   1086 
   1087 #define DEFAULT_DEPTH_FORMATS \
   1088       PIPE_FORMAT_Z24X8_UNORM, \
   1089       PIPE_FORMAT_X8Z24_UNORM, \
   1090       PIPE_FORMAT_Z16_UNORM, \
   1091       PIPE_FORMAT_Z24_UNORM_S8_UINT, \
   1092       PIPE_FORMAT_S8_UINT_Z24_UNORM, \
   1093       0
   1094 
   1095 #define DEFAULT_SNORM8_RGBA_FORMATS \
   1096       PIPE_FORMAT_R8G8B8A8_SNORM, \
   1097       0
   1098 
   1099 #define DEFAULT_UNORM16_RGBA_FORMATS \
   1100       PIPE_FORMAT_R16G16B16A16_UNORM, \
   1101       DEFAULT_RGBA_FORMATS
   1102 
   1103 
   1104 /**
   1105  * This table maps OpenGL texture format enums to Gallium pipe_format enums.
   1106  * Multiple GL enums might map to multiple pipe_formats.
   1107  * The first pipe format in the list that's supported is the one that's chosen.
   1108  */
   1109 static const struct format_mapping format_map[] = {
   1110    /* Basic RGB, RGBA formats */
   1111    {
   1112       { GL_RGB10, 0 },
   1113       { PIPE_FORMAT_B10G10R10X2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
   1114         PIPE_FORMAT_R10G10B10A2_UNORM, DEFAULT_RGB_FORMATS }
   1115    },
   1116    {
   1117       { GL_RGB10_A2, 0 },
   1118       { PIPE_FORMAT_R10G10B10A2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
   1119         DEFAULT_RGBA_FORMATS }
   1120    },
   1121    {
   1122       { 4, GL_RGBA, GL_RGBA8, 0 },
   1123       { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
   1124    },
   1125    {
   1126       { GL_BGRA, 0 },
   1127       { DEFAULT_RGBA_FORMATS }
   1128    },
   1129    {
   1130       { 3, GL_RGB, GL_RGB8, 0 },
   1131       { PIPE_FORMAT_R8G8B8X8_UNORM, DEFAULT_RGB_FORMATS }
   1132    },
   1133    {
   1134       { GL_RGB12, GL_RGB16, 0 },
   1135       { PIPE_FORMAT_R16G16B16X16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
   1136         DEFAULT_RGB_FORMATS }
   1137    },
   1138    {
   1139       { GL_RGBA12, GL_RGBA16, 0 },
   1140       { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS }
   1141    },
   1142    {
   1143       { GL_RGBA4, GL_RGBA2, 0 },
   1144       { PIPE_FORMAT_B4G4R4A4_UNORM, DEFAULT_RGBA_FORMATS }
   1145    },
   1146    {
   1147       { GL_RGB5_A1, 0 },
   1148       { PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS }
   1149    },
   1150    {
   1151       { GL_R3_G3_B2, 0 },
   1152       { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM,
   1153         PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGB_FORMATS }
   1154    },
   1155    {
   1156       { GL_RGB4 },
   1157       { PIPE_FORMAT_B4G4R4X4_UNORM, PIPE_FORMAT_B4G4R4A4_UNORM,
   1158         DEFAULT_RGB_FORMATS }
   1159    },
   1160    {
   1161       { GL_RGB5 },
   1162       { PIPE_FORMAT_B5G5R5X1_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
   1163         DEFAULT_RGB_FORMATS }
   1164    },
   1165    {
   1166       { GL_RGB565 },
   1167       { PIPE_FORMAT_B5G6R5_UNORM, DEFAULT_RGB_FORMATS }
   1168    },
   1169 
   1170    /* basic Alpha formats */
   1171    {
   1172       { GL_ALPHA12, GL_ALPHA16, 0 },
   1173       { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
   1174         PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
   1175    },
   1176    {
   1177       { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
   1178       { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
   1179    },
   1180 
   1181    /* basic Luminance formats */
   1182    {
   1183       { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
   1184       { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
   1185         PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
   1186    },
   1187    {
   1188       { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
   1189       { PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
   1190    },
   1191 
   1192    /* basic Luminance/Alpha formats */
   1193    {
   1194       { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
   1195         GL_LUMINANCE16_ALPHA16, 0},
   1196       { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
   1197         PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
   1198    },
   1199    {
   1200       { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
   1201       { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
   1202    },
   1203    {
   1204       { GL_LUMINANCE4_ALPHA4, 0 },
   1205       { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM,
   1206         DEFAULT_RGBA_FORMATS }
   1207    },
   1208 
   1209    /* basic Intensity formats */
   1210    {
   1211       { GL_INTENSITY12, GL_INTENSITY16, 0 },
   1212       { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
   1213         PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
   1214    },
   1215    {
   1216       { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
   1217         GL_COMPRESSED_INTENSITY, 0 },
   1218       { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
   1219    },
   1220 
   1221    /* YCbCr */
   1222    {
   1223       { GL_YCBCR_MESA, 0 },
   1224       { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
   1225    },
   1226 
   1227    /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
   1228    {
   1229       { GL_COMPRESSED_RGB, 0 },
   1230       { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS }
   1231    },
   1232    {
   1233       { GL_COMPRESSED_RGBA, 0 },
   1234       { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS }
   1235    },
   1236    {
   1237       { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
   1238       { PIPE_FORMAT_DXT1_RGB, 0 }
   1239    },
   1240    {
   1241       { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
   1242       { PIPE_FORMAT_DXT1_RGBA, 0 }
   1243    },
   1244    {
   1245       { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
   1246       { PIPE_FORMAT_DXT3_RGBA, 0 }
   1247    },
   1248    {
   1249       { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
   1250       { PIPE_FORMAT_DXT5_RGBA, 0 }
   1251    },
   1252 
   1253 #if 0
   1254    {
   1255       { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
   1256       { PIPE_FORMAT_RGB_FXT1, 0 }
   1257    },
   1258    {
   1259       { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
   1260       { PIPE_FORMAT_RGBA_FXT1, 0 }
   1261    },
   1262 #endif
   1263 
   1264    /* Depth formats */
   1265    {
   1266       { GL_DEPTH_COMPONENT16, 0 },
   1267       { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS }
   1268    },
   1269    {
   1270       { GL_DEPTH_COMPONENT24, 0 },
   1271       { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
   1272         DEFAULT_DEPTH_FORMATS }
   1273    },
   1274    {
   1275       { GL_DEPTH_COMPONENT32, 0 },
   1276       { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS }
   1277    },
   1278    {
   1279       { GL_DEPTH_COMPONENT, 0 },
   1280       { DEFAULT_DEPTH_FORMATS }
   1281    },
   1282    {
   1283       { GL_DEPTH_COMPONENT32F, 0 },
   1284       { PIPE_FORMAT_Z32_FLOAT, 0 }
   1285    },
   1286 
   1287    /* stencil formats */
   1288    {
   1289       { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
   1290         GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
   1291       {
   1292          PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT,
   1293          PIPE_FORMAT_S8_UINT_Z24_UNORM, 0
   1294       }
   1295    },
   1296 
   1297    /* Depth / Stencil formats */
   1298    {
   1299       { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
   1300       { PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 }
   1301    },
   1302    {
   1303       { GL_DEPTH32F_STENCIL8, 0 },
   1304       { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, 0 }
   1305    },
   1306 
   1307    /* sRGB formats */
   1308    {
   1309       { GL_SRGB_EXT, GL_SRGB8_EXT, 0 },
   1310       { PIPE_FORMAT_R8G8B8X8_SRGB, PIPE_FORMAT_B8G8R8X8_SRGB,
   1311         DEFAULT_SRGBA_FORMATS }
   1312    },
   1313    {
   1314       { GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
   1315       { PIPE_FORMAT_R8G8B8A8_SRGB, DEFAULT_SRGBA_FORMATS }
   1316    },
   1317    {
   1318       { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
   1319       { PIPE_FORMAT_DXT1_SRGB, PIPE_FORMAT_R8G8B8X8_SRGB,
   1320         PIPE_FORMAT_B8G8R8X8_SRGB, DEFAULT_SRGBA_FORMATS }
   1321    },
   1322    {
   1323       { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
   1324       { PIPE_FORMAT_DXT1_SRGBA, 0 }
   1325    },
   1326    {
   1327       { GL_COMPRESSED_SRGB_ALPHA_EXT,
   1328         GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
   1329       { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
   1330    },
   1331    {
   1332       { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
   1333       { PIPE_FORMAT_DXT5_SRGBA, 0 }
   1334    },
   1335    {
   1336       { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
   1337         GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
   1338       { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
   1339    },
   1340    {
   1341       { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, GL_COMPRESSED_SLUMINANCE_EXT,
   1342         0 },
   1343       { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
   1344    },
   1345 
   1346    /* 16-bit float formats */
   1347    {
   1348       { GL_RGBA16F_ARB, 0 },
   1349       { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1350    },
   1351    {
   1352       { GL_RGB16F_ARB, 0 },
   1353       { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16X16_FLOAT,
   1354         PIPE_FORMAT_R16G16B16A16_FLOAT,
   1355         PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1356    },
   1357    {
   1358       { GL_LUMINANCE_ALPHA16F_ARB, 0 },
   1359       { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
   1360         PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1361    },
   1362    {
   1363       { GL_ALPHA16F_ARB, 0 },
   1364       { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
   1365         PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
   1366         PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1367    },
   1368    {
   1369       { GL_INTENSITY16F_ARB, 0 },
   1370       { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
   1371         PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
   1372         PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1373    },
   1374    {
   1375       { GL_LUMINANCE16F_ARB, 0 },
   1376       { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
   1377         PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
   1378         PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1379    },
   1380    {
   1381       { GL_R16F, 0 },
   1382       { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
   1383         PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
   1384         PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1385    },
   1386    {
   1387       { GL_RG16F, 0 },
   1388       { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
   1389         PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1390    },
   1391 
   1392    /* 32-bit float formats */
   1393    {
   1394       { GL_RGBA32F_ARB, 0 },
   1395       { PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1396    },
   1397    {
   1398       { GL_RGB32F_ARB, 0 },
   1399       { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32X32_FLOAT,
   1400         PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1401    },
   1402    {
   1403       { GL_LUMINANCE_ALPHA32F_ARB, 0 },
   1404       { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1405    },
   1406    {
   1407       { GL_ALPHA32F_ARB, 0 },
   1408       { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
   1409         PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1410    },
   1411    {
   1412       { GL_INTENSITY32F_ARB, 0 },
   1413       { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
   1414         PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1415    },
   1416    {
   1417       { GL_LUMINANCE32F_ARB, 0 },
   1418       { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
   1419         PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1420    },
   1421    {
   1422       { GL_R32F, 0 },
   1423       { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
   1424         PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1425    },
   1426    {
   1427       { GL_RG32F, 0 },
   1428       { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
   1429    },
   1430 
   1431    /* R, RG formats */
   1432    {
   1433       { GL_RED, GL_R8, 0 },
   1434       { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
   1435    },
   1436    {
   1437       { GL_RG, GL_RG8, 0 },
   1438       { PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
   1439    },
   1440    {
   1441       { GL_R16, 0 },
   1442       { PIPE_FORMAT_R16_UNORM, PIPE_FORMAT_R16G16_UNORM,
   1443         DEFAULT_UNORM16_RGBA_FORMATS }
   1444    },
   1445    {
   1446       { GL_RG16, 0 },
   1447       { PIPE_FORMAT_R16G16_UNORM, DEFAULT_UNORM16_RGBA_FORMATS }
   1448    },
   1449 
   1450    /* compressed R, RG formats */
   1451    {
   1452       { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 },
   1453       { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, DEFAULT_RGBA_FORMATS }
   1454    },
   1455    {
   1456       { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
   1457       { PIPE_FORMAT_RGTC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
   1458    },
   1459    {
   1460       { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 },
   1461       { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
   1462    },
   1463    {
   1464       { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
   1465       { PIPE_FORMAT_RGTC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
   1466    },
   1467    {
   1468       { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
   1469       { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS }
   1470    },
   1471    {
   1472       { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
   1473       { PIPE_FORMAT_LATC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
   1474    },
   1475    {
   1476       { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT,
   1477         GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
   1478       { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
   1479    },
   1480    {
   1481       { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
   1482       { PIPE_FORMAT_LATC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
   1483    },
   1484 
   1485    /* ETC1 */
   1486    {
   1487       { GL_ETC1_RGB8_OES, 0 },
   1488       { PIPE_FORMAT_ETC1_RGB8, 0 }
   1489    },
   1490 
   1491    /* ETC2 */
   1492    {
   1493       { GL_COMPRESSED_RGB8_ETC2, 0 },
   1494       { PIPE_FORMAT_ETC2_RGB8, 0 }
   1495    },
   1496    {
   1497       { GL_COMPRESSED_SRGB8_ETC2, 0 },
   1498       { PIPE_FORMAT_ETC2_SRGB8, 0 }
   1499    },
   1500    {
   1501       { GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0 },
   1502       { PIPE_FORMAT_ETC2_RGB8A1, 0 }
   1503    },
   1504    {
   1505       { GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, 0 },
   1506       { PIPE_FORMAT_ETC2_SRGB8A1, 0 }
   1507    },
   1508    {
   1509       { GL_COMPRESSED_RGBA8_ETC2_EAC, 0 },
   1510       { PIPE_FORMAT_ETC2_RGBA8, 0 }
   1511    },
   1512    {
   1513       { GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, 0 },
   1514       { PIPE_FORMAT_ETC2_SRGBA8, 0 }
   1515    },
   1516    {
   1517       { GL_COMPRESSED_R11_EAC, 0 },
   1518       { PIPE_FORMAT_ETC2_R11_UNORM, 0 }
   1519    },
   1520    {
   1521       { GL_COMPRESSED_SIGNED_R11_EAC, 0 },
   1522       { PIPE_FORMAT_ETC2_R11_SNORM, 0 }
   1523    },
   1524    {
   1525       { GL_COMPRESSED_RG11_EAC, 0 },
   1526       { PIPE_FORMAT_ETC2_RG11_UNORM, 0 }
   1527    },
   1528    {
   1529       { GL_COMPRESSED_SIGNED_RG11_EAC, 0 },
   1530       { PIPE_FORMAT_ETC2_RG11_SNORM, 0 }
   1531    },
   1532 
   1533    /* BPTC */
   1534    {
   1535       { GL_COMPRESSED_RGBA_BPTC_UNORM, 0 },
   1536       { PIPE_FORMAT_BPTC_RGBA_UNORM, 0 },
   1537    },
   1538    {
   1539       { GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM, 0 },
   1540       { PIPE_FORMAT_BPTC_SRGBA, 0 },
   1541    },
   1542    {
   1543       { GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT, 0 },
   1544       { PIPE_FORMAT_BPTC_RGB_FLOAT, 0 },
   1545    },
   1546    {
   1547       { GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT, 0 },
   1548       { PIPE_FORMAT_BPTC_RGB_UFLOAT, 0 },
   1549    },
   1550 
   1551    /* ASTC */
   1552    {
   1553       { GL_COMPRESSED_RGBA_ASTC_4x4_KHR, 0 },
   1554       { PIPE_FORMAT_ASTC_4x4, 0},
   1555    },
   1556    {
   1557       { GL_COMPRESSED_RGBA_ASTC_5x4_KHR, 0 },
   1558       { PIPE_FORMAT_ASTC_5x4, 0},
   1559    },
   1560    {
   1561       { GL_COMPRESSED_RGBA_ASTC_5x5_KHR, 0 },
   1562       { PIPE_FORMAT_ASTC_5x5, 0},
   1563    },
   1564    {
   1565       { GL_COMPRESSED_RGBA_ASTC_6x5_KHR, 0 },
   1566       { PIPE_FORMAT_ASTC_6x5, 0},
   1567    },
   1568    {
   1569       { GL_COMPRESSED_RGBA_ASTC_6x6_KHR, 0 },
   1570       { PIPE_FORMAT_ASTC_6x6, 0},
   1571    },
   1572    {
   1573       { GL_COMPRESSED_RGBA_ASTC_8x5_KHR, 0 },
   1574       { PIPE_FORMAT_ASTC_8x5, 0},
   1575    },
   1576    {
   1577       { GL_COMPRESSED_RGBA_ASTC_8x6_KHR, 0 },
   1578       { PIPE_FORMAT_ASTC_8x6, 0},
   1579    },
   1580    {
   1581       { GL_COMPRESSED_RGBA_ASTC_8x8_KHR, 0 },
   1582       { PIPE_FORMAT_ASTC_8x8, 0},
   1583    },
   1584    {
   1585       { GL_COMPRESSED_RGBA_ASTC_10x5_KHR, 0 },
   1586       { PIPE_FORMAT_ASTC_10x5, 0},
   1587    },
   1588    {
   1589       { GL_COMPRESSED_RGBA_ASTC_10x6_KHR, 0 },
   1590       { PIPE_FORMAT_ASTC_10x6, 0},
   1591    },
   1592    {
   1593       { GL_COMPRESSED_RGBA_ASTC_10x8_KHR, 0 },
   1594       { PIPE_FORMAT_ASTC_10x8, 0},
   1595    },
   1596    {
   1597       { GL_COMPRESSED_RGBA_ASTC_10x10_KHR, 0 },
   1598       { PIPE_FORMAT_ASTC_10x10, 0},
   1599    },
   1600    {
   1601       { GL_COMPRESSED_RGBA_ASTC_12x10_KHR, 0 },
   1602       { PIPE_FORMAT_ASTC_12x10, 0},
   1603    },
   1604    {
   1605       { GL_COMPRESSED_RGBA_ASTC_12x12_KHR, 0 },
   1606       { PIPE_FORMAT_ASTC_12x12, 0},
   1607    },
   1608 
   1609    {
   1610       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, 0 },
   1611       { PIPE_FORMAT_ASTC_4x4_SRGB, 0},
   1612    },
   1613    {
   1614       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, 0 },
   1615       { PIPE_FORMAT_ASTC_5x4_SRGB, 0},
   1616    },
   1617    {
   1618       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, 0 },
   1619       { PIPE_FORMAT_ASTC_5x5_SRGB, 0},
   1620    },
   1621    {
   1622       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, 0 },
   1623       { PIPE_FORMAT_ASTC_6x5_SRGB, 0},
   1624    },
   1625    {
   1626       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, 0 },
   1627       { PIPE_FORMAT_ASTC_6x6_SRGB, 0},
   1628    },
   1629    {
   1630       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, 0 },
   1631       { PIPE_FORMAT_ASTC_8x5_SRGB, 0},
   1632    },
   1633    {
   1634       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, 0 },
   1635       { PIPE_FORMAT_ASTC_8x6_SRGB, 0},
   1636    },
   1637    {
   1638       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, 0 },
   1639       { PIPE_FORMAT_ASTC_8x8_SRGB, 0},
   1640    },
   1641    {
   1642       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, 0 },
   1643       { PIPE_FORMAT_ASTC_10x5_SRGB, 0},
   1644    },
   1645    {
   1646       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, 0 },
   1647       { PIPE_FORMAT_ASTC_10x6_SRGB, 0},
   1648    },
   1649    {
   1650       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, 0 },
   1651       { PIPE_FORMAT_ASTC_10x8_SRGB, 0},
   1652    },
   1653    {
   1654       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, 0 },
   1655       { PIPE_FORMAT_ASTC_10x10_SRGB, 0},
   1656    },
   1657    {
   1658       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, 0 },
   1659       { PIPE_FORMAT_ASTC_12x10_SRGB, 0},
   1660    },
   1661    {
   1662       { GL_COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, 0 },
   1663       { PIPE_FORMAT_ASTC_12x12_SRGB, 0},
   1664    },
   1665 
   1666    /* signed/unsigned integer formats.
   1667     */
   1668    {
   1669       { GL_RGBA_INTEGER_EXT,
   1670         GL_BGRA_INTEGER_EXT,
   1671         GL_RGBA8I_EXT, 0 },
   1672       { PIPE_FORMAT_R8G8B8A8_SINT, 0 }
   1673    },
   1674    {
   1675       { GL_RGB_INTEGER_EXT,
   1676         GL_BGR_INTEGER_EXT,
   1677         GL_RGB8I_EXT,
   1678         GL_BLUE_INTEGER_EXT, 0 },
   1679       { PIPE_FORMAT_R8G8B8_SINT, PIPE_FORMAT_R8G8B8X8_SINT,
   1680         PIPE_FORMAT_R8G8B8A8_SINT, 0 }
   1681    },
   1682    {
   1683       { GL_ALPHA_INTEGER_EXT,
   1684         GL_ALPHA8I_EXT, 0 },
   1685       { PIPE_FORMAT_A8_SINT, 0 }
   1686    },
   1687    {
   1688       { GL_ALPHA16I_EXT, 0 },
   1689       { PIPE_FORMAT_A16_SINT, 0 }
   1690    },
   1691    {
   1692       { GL_ALPHA32I_EXT, 0 },
   1693       { PIPE_FORMAT_A32_SINT, 0 }
   1694    },
   1695    {
   1696       { GL_ALPHA8UI_EXT, 0 },
   1697       { PIPE_FORMAT_A8_UINT, 0 }
   1698    },
   1699    {
   1700       { GL_ALPHA16UI_EXT, 0 },
   1701       { PIPE_FORMAT_A16_UINT, 0 }
   1702    },
   1703    {
   1704       { GL_ALPHA32UI_EXT, 0 },
   1705       { PIPE_FORMAT_A32_UINT, 0 }
   1706    },
   1707    {
   1708       { GL_INTENSITY8I_EXT, 0 },
   1709       { PIPE_FORMAT_I8_SINT, 0 }
   1710    },
   1711    {
   1712       { GL_INTENSITY16I_EXT, 0 },
   1713       { PIPE_FORMAT_I16_SINT, 0 }
   1714    },
   1715    {
   1716       { GL_INTENSITY32I_EXT, 0 },
   1717       { PIPE_FORMAT_I32_SINT, 0 }
   1718    },
   1719    {
   1720       { GL_INTENSITY8UI_EXT, 0 },
   1721       { PIPE_FORMAT_I8_UINT, 0 }
   1722    },
   1723    {
   1724       { GL_INTENSITY16UI_EXT, 0 },
   1725       { PIPE_FORMAT_I16_UINT, 0 }
   1726    },
   1727    {
   1728       { GL_INTENSITY32UI_EXT, 0 },
   1729       { PIPE_FORMAT_I32_UINT, 0 }
   1730    },
   1731    {
   1732       { GL_LUMINANCE8I_EXT, 0 },
   1733       { PIPE_FORMAT_L8_SINT, 0 }
   1734    },
   1735    {
   1736       { GL_LUMINANCE16I_EXT, 0 },
   1737       { PIPE_FORMAT_L16_SINT, 0 }
   1738    },
   1739    {
   1740       { GL_LUMINANCE32I_EXT, 0 },
   1741       { PIPE_FORMAT_L32_SINT, 0 }
   1742    },
   1743    {
   1744       { GL_LUMINANCE_INTEGER_EXT,
   1745         GL_LUMINANCE8UI_EXT, 0 },
   1746       { PIPE_FORMAT_L8_UINT, 0 }
   1747    },
   1748    {
   1749       { GL_LUMINANCE16UI_EXT, 0 },
   1750       { PIPE_FORMAT_L16_UINT, 0 }
   1751    },
   1752    {
   1753       { GL_LUMINANCE32UI_EXT, 0 },
   1754       { PIPE_FORMAT_L32_UINT, 0 }
   1755    },
   1756    {
   1757       { GL_LUMINANCE_ALPHA_INTEGER_EXT,
   1758         GL_LUMINANCE_ALPHA8I_EXT, 0 },
   1759       { PIPE_FORMAT_L8A8_SINT, 0 }
   1760    },
   1761    {
   1762       { GL_LUMINANCE_ALPHA16I_EXT, 0 },
   1763       { PIPE_FORMAT_L16A16_SINT, 0 }
   1764    },
   1765    {
   1766       { GL_LUMINANCE_ALPHA32I_EXT, 0 },
   1767       { PIPE_FORMAT_L32A32_SINT, 0 }
   1768    },
   1769    {
   1770       { GL_LUMINANCE_ALPHA8UI_EXT, 0 },
   1771       { PIPE_FORMAT_L8A8_UINT, 0 }
   1772    },
   1773    {
   1774       { GL_LUMINANCE_ALPHA16UI_EXT, 0 },
   1775       { PIPE_FORMAT_L16A16_UINT, 0 }
   1776    },
   1777    {
   1778       { GL_LUMINANCE_ALPHA32UI_EXT, 0 },
   1779       { PIPE_FORMAT_L32A32_UINT, 0 }
   1780    },
   1781    {
   1782       { GL_RGB16I_EXT, 0 },
   1783       { PIPE_FORMAT_R16G16B16_SINT, PIPE_FORMAT_R16G16B16X16_SINT,
   1784         PIPE_FORMAT_R16G16B16A16_SINT, 0 },
   1785    },
   1786    {
   1787       { GL_RGBA16I_EXT, 0 },
   1788       { PIPE_FORMAT_R16G16B16A16_SINT, 0 },
   1789    },
   1790    {
   1791       { GL_RGB32I_EXT, 0 },
   1792       { PIPE_FORMAT_R32G32B32_SINT, PIPE_FORMAT_R32G32B32X32_SINT,
   1793         PIPE_FORMAT_R32G32B32A32_SINT, 0 },
   1794    },
   1795    {
   1796       { GL_RGBA32I_EXT, 0 },
   1797       { PIPE_FORMAT_R32G32B32A32_SINT, 0 }
   1798    },
   1799    {
   1800       { GL_RGBA8UI_EXT, 0 },
   1801       { PIPE_FORMAT_R8G8B8A8_UINT, 0 }
   1802    },
   1803    {
   1804       { GL_RGB8UI_EXT, 0 },
   1805       { PIPE_FORMAT_R8G8B8_UINT, PIPE_FORMAT_R8G8B8X8_UINT,
   1806         PIPE_FORMAT_R8G8B8A8_UINT, 0 }
   1807    },
   1808    {
   1809       { GL_RGB16UI_EXT, 0 },
   1810       { PIPE_FORMAT_R16G16B16_UINT, PIPE_FORMAT_R16G16B16X16_UINT,
   1811         PIPE_FORMAT_R16G16B16A16_UINT, 0 }
   1812    },
   1813    {
   1814       { GL_RGBA16UI_EXT, 0 },
   1815       { PIPE_FORMAT_R16G16B16A16_UINT, 0 }
   1816    },
   1817    {
   1818       { GL_RGB32UI_EXT, 0},
   1819       { PIPE_FORMAT_R32G32B32_UINT, PIPE_FORMAT_R32G32B32X32_UINT,
   1820         PIPE_FORMAT_R32G32B32A32_UINT, 0 }
   1821    },
   1822    {
   1823       { GL_RGBA32UI_EXT, 0},
   1824       { PIPE_FORMAT_R32G32B32A32_UINT, 0 }
   1825    },
   1826    {
   1827      { GL_R8I, GL_RED_INTEGER_EXT, 0},
   1828      { PIPE_FORMAT_R8_SINT, 0},
   1829    },
   1830    {
   1831      { GL_R16I, 0},
   1832      { PIPE_FORMAT_R16_SINT, 0},
   1833    },
   1834    {
   1835      { GL_R32I, 0},
   1836      { PIPE_FORMAT_R32_SINT, 0},
   1837    },
   1838   {
   1839      { GL_R8UI, 0},
   1840      { PIPE_FORMAT_R8_UINT, 0},
   1841    },
   1842    {
   1843      { GL_R16UI, 0},
   1844      { PIPE_FORMAT_R16_UINT, 0},
   1845    },
   1846    {
   1847      { GL_R32UI, 0},
   1848      { PIPE_FORMAT_R32_UINT, 0},
   1849    },
   1850    {
   1851      { GL_RG8I, GL_GREEN_INTEGER_EXT, 0},
   1852      { PIPE_FORMAT_R8G8_SINT, 0},
   1853    },
   1854    {
   1855      { GL_RG16I, 0},
   1856      { PIPE_FORMAT_R16G16_SINT, 0},
   1857    },
   1858    {
   1859      { GL_RG32I, 0},
   1860      { PIPE_FORMAT_R32G32_SINT, 0},
   1861    },
   1862   {
   1863      { GL_RG8UI, 0},
   1864      { PIPE_FORMAT_R8G8_UINT, 0},
   1865    },
   1866    {
   1867      { GL_RG16UI, 0},
   1868      { PIPE_FORMAT_R16G16_UINT, 0},
   1869    },
   1870    {
   1871      { GL_RG32UI, 0},
   1872      { PIPE_FORMAT_R32G32_UINT, 0},
   1873    },
   1874    /* signed normalized formats */
   1875    {
   1876       { GL_RED_SNORM, GL_R8_SNORM, 0 },
   1877       { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
   1878         PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1879    },
   1880    {
   1881       { GL_R16_SNORM, 0 },
   1882       { PIPE_FORMAT_R16_SNORM,
   1883         PIPE_FORMAT_R16G16_SNORM,
   1884         PIPE_FORMAT_R16G16B16A16_SNORM,
   1885         PIPE_FORMAT_R8_SNORM,
   1886         PIPE_FORMAT_R8G8_SNORM,
   1887         PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1888    },
   1889    {
   1890       { GL_RG_SNORM, GL_RG8_SNORM, 0 },
   1891       { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1892    },
   1893    {
   1894       { GL_RG16_SNORM, 0 },
   1895       { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
   1896         PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1897    },
   1898    {
   1899       { GL_RGB_SNORM, GL_RGB8_SNORM, 0 },
   1900       { PIPE_FORMAT_R8G8B8X8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1901    },
   1902    {
   1903       { GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
   1904       { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1905    },
   1906    {
   1907       { GL_RGB16_SNORM, 0 },
   1908       { PIPE_FORMAT_R16G16B16X16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
   1909         PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1910    },
   1911    {
   1912       { GL_RGBA16_SNORM, 0 },
   1913       { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1914    },
   1915    {
   1916       { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
   1917       { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1918    },
   1919    {
   1920       { GL_ALPHA16_SNORM, 0 },
   1921       { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
   1922         PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1923    },
   1924    {
   1925       { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
   1926       { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1927    },
   1928    {
   1929       { GL_LUMINANCE16_SNORM, 0 },
   1930       { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
   1931         PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1932    },
   1933    {
   1934       { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
   1935       { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1936    },
   1937    {
   1938       { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
   1939       { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
   1940         PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1941    },
   1942    {
   1943       { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
   1944       { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1945    },
   1946    {
   1947       { GL_INTENSITY16_SNORM, 0 },
   1948       { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
   1949         PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
   1950    },
   1951    {
   1952       { GL_RGB9_E5, 0 },
   1953       { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 }
   1954    },
   1955    {
   1956       { GL_R11F_G11F_B10F, 0 },
   1957       { PIPE_FORMAT_R11G11B10_FLOAT, 0 }
   1958    },
   1959    {
   1960       { GL_RGB10_A2UI, 0 },
   1961       { PIPE_FORMAT_R10G10B10A2_UINT, PIPE_FORMAT_B10G10R10A2_UINT, 0 }
   1962    },
   1963 };
   1964 
   1965 
   1966 /**
   1967  * Return first supported format from the given list.
   1968  * \param allow_dxt  indicates whether it's OK to return a DXT format.
   1969  */
   1970 static enum pipe_format
   1971 find_supported_format(struct pipe_screen *screen,
   1972                       const enum pipe_format formats[],
   1973                       enum pipe_texture_target target,
   1974                       unsigned sample_count,
   1975                       unsigned tex_usage,
   1976                       boolean allow_dxt)
   1977 {
   1978    uint i;
   1979    for (i = 0; formats[i]; i++) {
   1980       if (screen->is_format_supported(screen, formats[i], target,
   1981                                       sample_count, tex_usage)) {
   1982          if (!allow_dxt && util_format_is_s3tc(formats[i])) {
   1983             /* we can't return a dxt format, continue searching */
   1984             continue;
   1985          }
   1986 
   1987          return formats[i];
   1988       }
   1989    }
   1990    return PIPE_FORMAT_NONE;
   1991 }
   1992 
   1993 struct exact_format_mapping
   1994 {
   1995    GLenum format;
   1996    GLenum type;
   1997    enum pipe_format pformat;
   1998 };
   1999 
   2000 static const struct exact_format_mapping rgba8888_tbl[] =
   2001 {
   2002    { GL_RGBA,     GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_ABGR8888_UNORM },
   2003    { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_ABGR8888_UNORM },
   2004    { GL_RGBA,     GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_RGBA8888_UNORM },
   2005    { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_RGBA8888_UNORM },
   2006    { GL_BGRA,     GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_ARGB8888_UNORM },
   2007    { GL_BGRA,     GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_BGRA8888_UNORM },
   2008    { GL_RGBA,     GL_UNSIGNED_BYTE,               PIPE_FORMAT_R8G8B8A8_UNORM },
   2009    { GL_ABGR_EXT, GL_UNSIGNED_BYTE,               PIPE_FORMAT_A8B8G8R8_UNORM },
   2010    { GL_BGRA,     GL_UNSIGNED_BYTE,               PIPE_FORMAT_B8G8R8A8_UNORM },
   2011    { 0,           0,                              0                          }
   2012 };
   2013 
   2014 static const struct exact_format_mapping rgbx8888_tbl[] =
   2015 {
   2016    { GL_RGBA,     GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_XBGR8888_UNORM },
   2017    { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_XBGR8888_UNORM },
   2018    { GL_RGBA,     GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_RGBX8888_UNORM },
   2019    { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_RGBX8888_UNORM },
   2020    { GL_BGRA,     GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_XRGB8888_UNORM },
   2021    { GL_BGRA,     GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_BGRX8888_UNORM },
   2022    { GL_RGBA,     GL_UNSIGNED_BYTE,               PIPE_FORMAT_R8G8B8X8_UNORM },
   2023    { GL_ABGR_EXT, GL_UNSIGNED_BYTE,               PIPE_FORMAT_X8B8G8R8_UNORM },
   2024    { GL_BGRA,     GL_UNSIGNED_BYTE,               PIPE_FORMAT_B8G8R8X8_UNORM },
   2025    { 0,           0,                              0                          }
   2026 };
   2027 
   2028 /**
   2029  * For unsized/base internal formats, we may choose a convenient effective
   2030  * internal format for {format, type}. If one exists, return that, otherwise
   2031  * return PIPE_FORMAT_NONE.
   2032  */
   2033 static enum pipe_format
   2034 find_exact_format(GLint internalFormat, GLenum format, GLenum type)
   2035 {
   2036    uint i;
   2037    const struct exact_format_mapping* tbl;
   2038 
   2039    if (format == GL_NONE || type == GL_NONE)
   2040       return PIPE_FORMAT_NONE;
   2041 
   2042    switch (internalFormat) {
   2043    case 4:
   2044    case GL_RGBA:
   2045       tbl = rgba8888_tbl;
   2046       break;
   2047    case 3:
   2048    case GL_RGB:
   2049       tbl = rgbx8888_tbl;
   2050       break;
   2051    default:
   2052       return PIPE_FORMAT_NONE;
   2053    }
   2054 
   2055    for (i = 0; tbl[i].format; i++)
   2056       if (tbl[i].format == format && tbl[i].type == type)
   2057          return tbl[i].pformat;
   2058 
   2059    return PIPE_FORMAT_NONE;
   2060 }
   2061 
   2062 /**
   2063  * Given an OpenGL internalFormat value for a texture or surface, return
   2064  * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
   2065  * This is called during glTexImage2D, for example.
   2066  *
   2067  * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
   2068  * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
   2069  * we want render-to-texture ability.
   2070  *
   2071  * \param internalFormat  the user value passed to glTexImage2D
   2072  * \param target  one of PIPE_TEXTURE_x
   2073  * \param bindings  bitmask of PIPE_BIND_x flags.
   2074  * \param allow_dxt  indicates whether it's OK to return a DXT format.  This
   2075  *                   only matters when internalFormat names a generic or
   2076  *                   specific compressed format.  And that should only happen
   2077  *                   when we're getting called from gl[Copy]TexImage().
   2078  */
   2079 enum pipe_format
   2080 st_choose_format(struct st_context *st, GLenum internalFormat,
   2081                  GLenum format, GLenum type,
   2082                  enum pipe_texture_target target, unsigned sample_count,
   2083                  unsigned bindings, boolean allow_dxt)
   2084 {
   2085    struct pipe_screen *screen = st->pipe->screen;
   2086    unsigned i;
   2087    int j;
   2088    enum pipe_format pf;
   2089 
   2090 #ifdef DEBUG
   2091    {
   2092       static boolean firstCall = TRUE;
   2093       if (firstCall) {
   2094          test_format_conversion(st);
   2095          firstCall = FALSE;
   2096       }
   2097    }
   2098 #else
   2099    (void) test_format_conversion;
   2100 #endif
   2101 
   2102    /* can't render to compressed formats at this time */
   2103    if (_mesa_is_compressed_format(st->ctx, internalFormat)
   2104        && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
   2105       return PIPE_FORMAT_NONE;
   2106    }
   2107 
   2108    /* search for exact matches */
   2109    pf = find_exact_format(internalFormat, format, type);
   2110    if (pf != PIPE_FORMAT_NONE &&
   2111        screen->is_format_supported(screen, pf,
   2112                                    target, sample_count, bindings))
   2113       return pf;
   2114 
   2115    /* search table for internalFormat */
   2116    for (i = 0; i < ARRAY_SIZE(format_map); i++) {
   2117       const struct format_mapping *mapping = &format_map[i];
   2118       for (j = 0; mapping->glFormats[j]; j++) {
   2119          if (mapping->glFormats[j] == internalFormat) {
   2120             /* Found the desired internal format.  Find first pipe format
   2121              * which is supported by the driver.
   2122              */
   2123             return find_supported_format(screen, mapping->pipeFormats,
   2124                                          target, sample_count, bindings,
   2125                                          allow_dxt);
   2126          }
   2127       }
   2128    }
   2129 
   2130    _mesa_problem(NULL, "unhandled format!\n");
   2131    return PIPE_FORMAT_NONE;
   2132 }
   2133 
   2134 
   2135 /**
   2136  * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
   2137  */
   2138 enum pipe_format
   2139 st_choose_renderbuffer_format(struct st_context *st,
   2140                               GLenum internalFormat, unsigned sample_count)
   2141 {
   2142    uint usage;
   2143    if (_mesa_is_depth_or_stencil_format(internalFormat))
   2144       usage = PIPE_BIND_DEPTH_STENCIL;
   2145    else
   2146       usage = PIPE_BIND_RENDER_TARGET;
   2147    return st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
   2148                            PIPE_TEXTURE_2D, sample_count, usage, FALSE);
   2149 }
   2150 
   2151 
   2152 /**
   2153  * Given an OpenGL user-requested format and type, and swapBytes state,
   2154  * return the format which exactly matches those parameters, so that
   2155  * a memcpy-based transfer can be done.
   2156  *
   2157  * If no format is supported, return PIPE_FORMAT_NONE.
   2158  */
   2159 enum pipe_format
   2160 st_choose_matching_format(struct st_context *st, unsigned bind,
   2161 			  GLenum format, GLenum type, GLboolean swapBytes)
   2162 {
   2163    struct pipe_screen *screen = st->pipe->screen;
   2164    mesa_format mesa_format;
   2165 
   2166    for (mesa_format = 1; mesa_format < MESA_FORMAT_COUNT; mesa_format++) {
   2167       if (_mesa_get_format_color_encoding(mesa_format) == GL_SRGB) {
   2168          continue;
   2169       }
   2170       if (_mesa_get_format_bits(mesa_format, GL_TEXTURE_INTENSITY_SIZE) > 0) {
   2171          /* If `format` is GL_RED/GL_RED_INTEGER, then we might match some
   2172           * intensity formats, which we don't want.
   2173           */
   2174          continue;
   2175       }
   2176 
   2177       if (_mesa_format_matches_format_and_type(mesa_format, format, type,
   2178                                                swapBytes, NULL)) {
   2179          enum pipe_format format =
   2180             st_mesa_format_to_pipe_format(st, mesa_format);
   2181 
   2182          if (format &&
   2183              screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0,
   2184                                          bind)) {
   2185             return format;
   2186          }
   2187          /* It's unlikely to find 2 matching Mesa formats. */
   2188          break;
   2189       }
   2190    }
   2191    return PIPE_FORMAT_NONE;
   2192 }
   2193 
   2194 
   2195 /**
   2196  * Called via ctx->Driver.ChooseTextureFormat().
   2197  */
   2198 mesa_format
   2199 st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
   2200                        GLint internalFormat,
   2201                        GLenum format, GLenum type)
   2202 {
   2203    struct st_context *st = st_context(ctx);
   2204    enum pipe_format pFormat;
   2205    mesa_format mFormat;
   2206    unsigned bindings;
   2207    bool is_renderbuffer = false;
   2208    enum pipe_texture_target pTarget;
   2209 
   2210    if (target == GL_RENDERBUFFER) {
   2211       pTarget = PIPE_TEXTURE_2D;
   2212       is_renderbuffer = true;
   2213    } else {
   2214       pTarget = gl_target_to_pipe(target);
   2215    }
   2216 
   2217    if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) {
   2218       /* We don't do compression for these texture targets because of
   2219        * difficulty with sub-texture updates on non-block boundaries, etc.
   2220        * So change the internal format request to an uncompressed format.
   2221        */
   2222       internalFormat =
   2223         _mesa_generic_compressed_format_to_uncompressed_format(internalFormat);
   2224    }
   2225 
   2226    /* GL textures may wind up being render targets, but we don't know
   2227     * that in advance.  Specify potential render target flags now for formats
   2228     * that we know should always be renderable.
   2229     */
   2230    bindings = PIPE_BIND_SAMPLER_VIEW;
   2231    if (_mesa_is_depth_or_stencil_format(internalFormat))
   2232       bindings |= PIPE_BIND_DEPTH_STENCIL;
   2233    else if (is_renderbuffer || internalFormat == 3 || internalFormat == 4 ||
   2234             internalFormat == GL_RGB || internalFormat == GL_RGBA ||
   2235             internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
   2236             internalFormat == GL_BGRA ||
   2237             internalFormat == GL_RGB16F ||
   2238             internalFormat == GL_RGBA16F ||
   2239             internalFormat == GL_RGB32F ||
   2240             internalFormat == GL_RGBA32F)
   2241 	 bindings |= PIPE_BIND_RENDER_TARGET;
   2242 
   2243    /* GLES allows the driver to choose any format which matches
   2244     * the format+type combo, because GLES only supports unsized internal
   2245     * formats and expects the driver to choose whatever suits it.
   2246     */
   2247    if (_mesa_is_gles(ctx)) {
   2248       GLenum baseFormat = _mesa_base_tex_format(ctx, internalFormat);
   2249       GLenum basePackFormat = _mesa_base_pack_format(format);
   2250       GLenum iformat = internalFormat;
   2251 
   2252       /* Treat GL_BGRA as GL_RGBA. */
   2253       if (iformat == GL_BGRA)
   2254          iformat = GL_RGBA;
   2255 
   2256       /* Check if the internalformat is unsized and compatible
   2257        * with the "format".
   2258        */
   2259       if (iformat == baseFormat && iformat == basePackFormat) {
   2260          pFormat = st_choose_matching_format(st, bindings, format, type,
   2261                                              ctx->Unpack.SwapBytes);
   2262 
   2263          if (pFormat != PIPE_FORMAT_NONE)
   2264             return st_pipe_format_to_mesa_format(pFormat);
   2265 
   2266          if (!is_renderbuffer) {
   2267             /* try choosing format again, this time without render target bindings */
   2268             pFormat = st_choose_matching_format(st, PIPE_BIND_SAMPLER_VIEW,
   2269                                                 format, type,
   2270                                                 ctx->Unpack.SwapBytes);
   2271             if (pFormat != PIPE_FORMAT_NONE)
   2272                return st_pipe_format_to_mesa_format(pFormat);
   2273          }
   2274       }
   2275    }
   2276 
   2277    pFormat = st_choose_format(st, internalFormat, format, type,
   2278                               pTarget, 0, bindings, ctx->Mesa_DXTn);
   2279 
   2280    if (pFormat == PIPE_FORMAT_NONE && !is_renderbuffer) {
   2281       /* try choosing format again, this time without render target bindings */
   2282       pFormat = st_choose_format(st, internalFormat, format, type,
   2283                                  pTarget, 0, PIPE_BIND_SAMPLER_VIEW,
   2284                                  ctx->Mesa_DXTn);
   2285    }
   2286 
   2287    if (pFormat == PIPE_FORMAT_NONE) {
   2288       /* lie about using etc1/etc2 natively if we do decoding tricks */
   2289       mFormat = _mesa_glenum_to_compressed_format(internalFormat);
   2290       if ((mFormat == MESA_FORMAT_ETC1_RGB8 && !st->has_etc1) ||
   2291           (_mesa_is_format_etc2(mFormat) && !st->has_etc2))
   2292           return mFormat;
   2293 
   2294       /* no luck at all */
   2295       return MESA_FORMAT_NONE;
   2296    }
   2297 
   2298    mFormat = st_pipe_format_to_mesa_format(pFormat);
   2299 
   2300    /* Debugging aid */
   2301    if (0) {
   2302       debug_printf("%s(intFormat=%s, format=%s, type=%s) -> %s, %s\n",
   2303                    __func__,
   2304                    _mesa_enum_to_string(internalFormat),
   2305                    _mesa_enum_to_string(format),
   2306                    _mesa_enum_to_string(type),
   2307                    util_format_name(pFormat),
   2308                    _mesa_get_format_name(mFormat));
   2309    }
   2310 
   2311    return mFormat;
   2312 }
   2313 
   2314 
   2315 /**
   2316  * Called via ctx->Driver.QueryInternalFormat().
   2317  */
   2318 static size_t
   2319 st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
   2320                          GLenum internalFormat, int samples[16])
   2321 {
   2322    struct st_context *st = st_context(ctx);
   2323    enum pipe_format format;
   2324    unsigned i, bind, num_sample_counts = 0;
   2325 
   2326    (void) target;
   2327 
   2328    if (_mesa_is_depth_or_stencil_format(internalFormat))
   2329       bind = PIPE_BIND_DEPTH_STENCIL;
   2330    else
   2331       bind = PIPE_BIND_RENDER_TARGET;
   2332 
   2333    /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
   2334     * formats.
   2335     */
   2336    if (!ctx->Extensions.EXT_framebuffer_sRGB) {
   2337       internalFormat = _mesa_get_linear_internalformat(internalFormat);
   2338    }
   2339 
   2340    /* Set sample counts in descending order. */
   2341    for (i = 16; i > 1; i--) {
   2342       format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
   2343                                 PIPE_TEXTURE_2D, i, bind, FALSE);
   2344 
   2345       if (format != PIPE_FORMAT_NONE) {
   2346          samples[num_sample_counts++] = i;
   2347       }
   2348    }
   2349 
   2350    if (!num_sample_counts) {
   2351       samples[num_sample_counts++] = 1;
   2352    }
   2353 
   2354    return num_sample_counts;
   2355 }
   2356 
   2357 /**
   2358  * ARB_internalformat_query2 driver hook.
   2359  */
   2360 void
   2361 st_QueryInternalFormat(struct gl_context *ctx, GLenum target,
   2362                        GLenum internalFormat, GLenum pname, GLint *params)
   2363 {
   2364    struct st_context *st = st_context(ctx);
   2365    /* The API entry-point gives us a temporary params buffer that is non-NULL
   2366     * and guaranteed to have at least 16 elements.
   2367     */
   2368    assert(params != NULL);
   2369 
   2370    switch (pname) {
   2371    case GL_SAMPLES:
   2372       st_QuerySamplesForFormat(ctx, target, internalFormat, params);
   2373       break;
   2374 
   2375    case GL_NUM_SAMPLE_COUNTS: {
   2376       size_t num_samples;
   2377       num_samples = st_QuerySamplesForFormat(ctx, target, internalFormat,
   2378                                              params);
   2379       params[0] = (GLint) num_samples;
   2380       break;
   2381    }
   2382    case GL_INTERNALFORMAT_PREFERRED: {
   2383       params[0] = GL_NONE;
   2384 
   2385       /* We need to resolve an internal format that is compatible with
   2386        * the passed internal format, and optimal to the driver. By now,
   2387        * we just validate that the passed internal format is supported by
   2388        * the driver, and if so return the same internal format, otherwise
   2389        * return GL_NONE.
   2390        */
   2391       uint usage;
   2392       if (_mesa_is_depth_or_stencil_format(internalFormat))
   2393          usage = PIPE_BIND_DEPTH_STENCIL;
   2394       else
   2395          usage = PIPE_BIND_RENDER_TARGET;
   2396       enum pipe_format pformat = st_choose_format(st,
   2397                                                   internalFormat,
   2398                                                   GL_NONE,
   2399                                                   GL_NONE,
   2400                                                   PIPE_TEXTURE_2D, 1,
   2401                                                   usage, FALSE);
   2402       if (pformat)
   2403          params[0] = internalFormat;
   2404       break;
   2405    }
   2406    default:
   2407       /* For the rest of the pnames, we call back the Mesa's default
   2408        * function for drivers that don't implement ARB_internalformat_query2.
   2409        */
   2410       _mesa_query_internal_format_default(ctx, target, internalFormat, pname,
   2411                                           params);
   2412    }
   2413 }
   2414 
   2415 /**
   2416  * This is used for translating texture border color and the clear
   2417  * color.  For example, the clear color is interpreted according to
   2418  * the renderbuffer's base format.  For example, if clearing a
   2419  * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] =
   2420  * colorOut[2] = colorIn[0].
   2421  * Similarly for texture border colors.
   2422  */
   2423 void
   2424 st_translate_color(const union gl_color_union *colorIn,
   2425                    union pipe_color_union *colorOut,
   2426                    GLenum baseFormat, GLboolean is_integer)
   2427 {
   2428    if (is_integer) {
   2429       const int *in = colorIn->i;
   2430       int *out = colorOut->i;
   2431 
   2432       switch (baseFormat) {
   2433       case GL_RED:
   2434          out[0] = in[0];
   2435          out[1] = 0;
   2436          out[2] = 0;
   2437          out[3] = 1;
   2438          break;
   2439       case GL_RG:
   2440          out[0] = in[0];
   2441          out[1] = in[1];
   2442          out[2] = 0;
   2443          out[3] = 1;
   2444          break;
   2445       case GL_RGB:
   2446          out[0] = in[0];
   2447          out[1] = in[1];
   2448          out[2] = in[2];
   2449          out[3] = 1;
   2450          break;
   2451       case GL_ALPHA:
   2452          out[0] = out[1] = out[2] = 0;
   2453          out[3] = in[3];
   2454          break;
   2455       case GL_LUMINANCE:
   2456          out[0] = out[1] = out[2] = in[0];
   2457          out[3] = 1;
   2458          break;
   2459       case GL_LUMINANCE_ALPHA:
   2460          out[0] = out[1] = out[2] = in[0];
   2461          out[3] = in[3];
   2462          break;
   2463       case GL_INTENSITY:
   2464          out[0] = out[1] = out[2] = out[3] = in[0];
   2465          break;
   2466       default:
   2467          COPY_4V(out, in);
   2468       }
   2469    }
   2470    else {
   2471       const float *in = colorIn->f;
   2472       float *out = colorOut->f;
   2473 
   2474       switch (baseFormat) {
   2475       case GL_RED:
   2476          out[0] = in[0];
   2477          out[1] = 0.0F;
   2478          out[2] = 0.0F;
   2479          out[3] = 1.0F;
   2480          break;
   2481       case GL_RG:
   2482          out[0] = in[0];
   2483          out[1] = in[1];
   2484          out[2] = 0.0F;
   2485          out[3] = 1.0F;
   2486          break;
   2487       case GL_RGB:
   2488          out[0] = in[0];
   2489          out[1] = in[1];
   2490          out[2] = in[2];
   2491          out[3] = 1.0F;
   2492          break;
   2493       case GL_ALPHA:
   2494          out[0] = out[1] = out[2] = 0.0F;
   2495          out[3] = in[3];
   2496          break;
   2497       case GL_LUMINANCE:
   2498          out[0] = out[1] = out[2] = in[0];
   2499          out[3] = 1.0F;
   2500          break;
   2501       case GL_LUMINANCE_ALPHA:
   2502          out[0] = out[1] = out[2] = in[0];
   2503          out[3] = in[3];
   2504          break;
   2505       case GL_INTENSITY:
   2506          out[0] = out[1] = out[2] = out[3] = in[0];
   2507          break;
   2508       default:
   2509          COPY_4V(out, in);
   2510       }
   2511    }
   2512 }
   2513