Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  5.  * Copyright (c) 2008-2009 VMware, Inc.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  21.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  22.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  23.  * OTHER DEALINGS IN THE SOFTWARE.
  24.  */
  25.  
  26.  
  27. /**
  28.  * \file texformat.c
  29.  * Texture formats.
  30.  *
  31.  * \author Gareth Hughes
  32.  * \author Brian Paul
  33.  */
  34.  
  35.  
  36. #include "context.h"
  37. #include "enums.h"
  38. #include "mtypes.h"
  39. #include "texcompress.h"
  40. #include "texformat.h"
  41.  
  42. #define RETURN_IF_SUPPORTED(f) do {             \
  43.    if (ctx->TextureFormatSupported[f])          \
  44.       return f;                                 \
  45. } while (0)
  46.  
  47. /**
  48.  * Choose an appropriate texture format given the format, type and
  49.  * internalFormat parameters passed to glTexImage().
  50.  *
  51.  * \param ctx  the GL context.
  52.  * \param target  a texture target (GL_TEXTURE_x)
  53.  * \param internalFormat  user's prefered internal texture format.
  54.  * \param format  incoming image pixel format.
  55.  * \param type  incoming image data type.
  56.  *
  57.  * \return the closest mesa_format for the given format/type arguments
  58.  *
  59.  * This is called via dd_function_table::ChooseTextureFormat.  Hardware
  60.  * drivers may override this function with a specialized version.
  61.  */
  62. mesa_format
  63. _mesa_choose_tex_format(struct gl_context *ctx, GLenum target,
  64.                         GLint internalFormat, GLenum format, GLenum type)
  65. {
  66.    (void) format;
  67.  
  68.    switch (internalFormat) {
  69.    /* shallow RGBA formats */
  70.    case 4:
  71.    case GL_RGBA:
  72.       if (type == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
  73.          RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM);
  74.       } else if (type == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
  75.          RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM);
  76.       } else if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
  77.          RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM);
  78.       }
  79.       /* fallthrough */
  80.  
  81.    case GL_RGBA8:
  82.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM);
  83.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM);
  84.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  85.       break;
  86.    case GL_RGB5_A1:
  87.       RETURN_IF_SUPPORTED(MESA_FORMAT_B5G5R5A1_UNORM);
  88.       break;
  89.    case GL_RGBA2:
  90.       RETURN_IF_SUPPORTED(MESA_FORMAT_A4R4G4B4_UNORM); /* just to test another format*/
  91.       RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM);
  92.       break;
  93.    case GL_RGBA4:
  94.       RETURN_IF_SUPPORTED(MESA_FORMAT_B4G4R4A4_UNORM);
  95.       break;
  96.  
  97.    /* deep RGBA formats */
  98.    case GL_RGB10_A2:
  99.       RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UNORM);
  100.       RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM);
  101.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  102.       break;
  103.    case GL_RGBA12:
  104.    case GL_RGBA16:
  105.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16);
  106.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16);
  107.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM);
  108.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  109.       break;
  110.  
  111.    /* shallow RGB formats */
  112.    case 3:
  113.    case GL_RGB:
  114.       if (type == GL_UNSIGNED_INT_2_10_10_10_REV) {
  115.          RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UNORM);
  116.       }
  117.       /* fallthrough */
  118.    case GL_RGB8:
  119.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UNORM8);
  120.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_UNORM);
  121.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_UNORM);
  122.  
  123.       RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8);
  124.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
  125.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  126.       break;
  127.    case GL_R3_G3_B2:
  128.       RETURN_IF_SUPPORTED(MESA_FORMAT_B2G3R3_UNORM);
  129.       RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM);
  130.       RETURN_IF_SUPPORTED(MESA_FORMAT_R5G6B5_UNORM);
  131.       RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8);
  132.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
  133.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  134.       break;
  135.    case GL_RGB4:
  136.       RETURN_IF_SUPPORTED(MESA_FORMAT_R5G6B5_UNORM); /* just to test another format */
  137.       RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM);
  138.       break;
  139.    case GL_RGB5:
  140.       RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM);
  141.       break;
  142.  
  143.    /* deep RGB formats */
  144.    case GL_RGB10:
  145.    case GL_RGB12:
  146.    case GL_RGB16:
  147.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UNORM16);
  148.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UNORM16);
  149.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
  150.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  151.       break;
  152.  
  153.    /* Alpha formats */
  154.    case GL_ALPHA:
  155.    case GL_ALPHA4:
  156.    case GL_ALPHA8:
  157.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8);
  158.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
  159.       break;
  160.  
  161.    case GL_ALPHA12:
  162.    case GL_ALPHA16:
  163.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM16);
  164.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8);
  165.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
  166.       break;
  167.  
  168.    /* Luminance formats */
  169.    case 1:
  170.    case GL_LUMINANCE:
  171.    case GL_LUMINANCE4:
  172.    case GL_LUMINANCE8:
  173.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8);
  174.       break;
  175.  
  176.    case GL_LUMINANCE12:
  177.    case GL_LUMINANCE16:
  178.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM16);
  179.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8);
  180.       break;
  181.  
  182.       /* Luminance/Alpha formats */
  183.    case GL_LUMINANCE4_ALPHA4:
  184.       RETURN_IF_SUPPORTED(MESA_FORMAT_L4A4_UNORM);
  185.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
  186.       break;
  187.  
  188.    case 2:
  189.    case GL_LUMINANCE_ALPHA:
  190.    case GL_LUMINANCE6_ALPHA2:
  191.    case GL_LUMINANCE8_ALPHA8:
  192.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
  193.       break;
  194.  
  195.    case GL_LUMINANCE12_ALPHA4:
  196.    case GL_LUMINANCE12_ALPHA12:
  197.    case GL_LUMINANCE16_ALPHA16:
  198.       RETURN_IF_SUPPORTED(MESA_FORMAT_L16A16_UNORM);
  199.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
  200.       break;
  201.  
  202.    case GL_INTENSITY:
  203.    case GL_INTENSITY4:
  204.    case GL_INTENSITY8:
  205.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8);
  206.       break;
  207.  
  208.    case GL_INTENSITY12:
  209.    case GL_INTENSITY16:
  210.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM16);
  211.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8);
  212.       break;
  213.  
  214.    case GL_DEPTH_COMPONENT:
  215.    case GL_DEPTH_COMPONENT24:
  216.    case GL_DEPTH_COMPONENT32:
  217.       RETURN_IF_SUPPORTED(MESA_FORMAT_Z_UNORM32);
  218.       RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_X8_UINT);
  219.       RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT);
  220.       break;
  221.    case GL_DEPTH_COMPONENT16:
  222.       RETURN_IF_SUPPORTED(MESA_FORMAT_Z_UNORM16);
  223.       RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_X8_UINT);
  224.       RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT);
  225.       break;
  226.  
  227.    case GL_COMPRESSED_ALPHA_ARB:
  228.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_UNORM8);
  229.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
  230.       break;
  231.    case GL_COMPRESSED_LUMINANCE_ARB:
  232.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_UNORM8);
  233.       break;
  234.    case GL_COMPRESSED_LUMINANCE_ALPHA_ARB:
  235.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_UNORM);
  236.       break;
  237.    case GL_COMPRESSED_INTENSITY_ARB:
  238.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_UNORM8);
  239.       break;
  240.    case GL_COMPRESSED_RGB_ARB:
  241.       /* We don't use texture compression for 1D and 1D array textures.
  242.        * For 1D textures, compressions doesn't buy us much.
  243.        * For 1D ARRAY textures, there's complicated issues with updating
  244.        * sub-regions on non-block boundaries with glCopyTexSubImage, among
  245.        * other issues.  FWIW, the GL_EXT_texture_array extension prohibits
  246.        * 1D ARRAY textures in S3TC format.
  247.        */
  248.       if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
  249.          if (ctx->Mesa_DXTn)
  250.             RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_DXT1);
  251.          RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FXT1);
  252.       }
  253.       RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_UNORM8);
  254.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8X8_UNORM);
  255.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  256.       break;
  257.    case GL_COMPRESSED_RGBA_ARB:
  258.       /* We don't use texture compression for 1D and 1D array textures. */
  259.       if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY) {
  260.          if (ctx->Mesa_DXTn)
  261.             RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_DXT3); /* Not rgba_dxt1, see spec */
  262.          RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FXT1);
  263.       }
  264.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_UNORM);
  265.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  266.       break;
  267.  
  268.    case GL_RGB565:
  269.       RETURN_IF_SUPPORTED(MESA_FORMAT_B5G6R5_UNORM);
  270.       break;
  271.  
  272.    case GL_YCBCR_MESA:
  273.       if (type == GL_UNSIGNED_SHORT_8_8_MESA)
  274.          RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR);
  275.       else
  276.          RETURN_IF_SUPPORTED(MESA_FORMAT_YCBCR_REV);
  277.       break;
  278.  
  279.    /* For non-generic compressed format we assert two things:
  280.     *
  281.     * 1. The format has already been validated against the set of available
  282.     *    extensions.
  283.     *
  284.     * 2. The driver only enables the extension if it supports all of the
  285.     *    formats that are part of that extension.
  286.     */
  287.    case GL_COMPRESSED_RGB_FXT1_3DFX:
  288.       return MESA_FORMAT_RGB_FXT1;
  289.    case GL_COMPRESSED_RGBA_FXT1_3DFX:
  290.       return MESA_FORMAT_RGBA_FXT1;
  291.    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  292.    case GL_RGB_S3TC:
  293.    case GL_RGB4_S3TC:
  294.       return MESA_FORMAT_RGB_DXT1;
  295.    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  296.       return MESA_FORMAT_RGBA_DXT1;
  297.    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  298.    case GL_RGBA_S3TC:
  299.    case GL_RGBA4_S3TC:
  300.       return MESA_FORMAT_RGBA_DXT3;
  301.    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  302.       return MESA_FORMAT_RGBA_DXT5;
  303.    case GL_COMPRESSED_RED_RGTC1:
  304.       return MESA_FORMAT_R_RGTC1_UNORM;
  305.    case GL_COMPRESSED_SIGNED_RED_RGTC1:
  306.       return MESA_FORMAT_R_RGTC1_SNORM;
  307.    case GL_COMPRESSED_RG_RGTC2:
  308.       return MESA_FORMAT_RG_RGTC2_UNORM;
  309.    case GL_COMPRESSED_SIGNED_RG_RGTC2:
  310.       return MESA_FORMAT_RG_RGTC2_SNORM;
  311.    case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
  312.       return MESA_FORMAT_L_LATC1_UNORM;
  313.    case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
  314.       return MESA_FORMAT_L_LATC1_SNORM;
  315.    case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
  316.       return MESA_FORMAT_LA_LATC2_UNORM;
  317.    case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
  318.       return MESA_FORMAT_LA_LATC2_SNORM;
  319.    case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
  320.       return MESA_FORMAT_LA_LATC2_UNORM;
  321.    case GL_ETC1_RGB8_OES:
  322.       return MESA_FORMAT_ETC1_RGB8;
  323.    case GL_COMPRESSED_RGB8_ETC2:
  324.       return MESA_FORMAT_ETC2_RGB8;
  325.    case GL_COMPRESSED_SRGB8_ETC2:
  326.       return MESA_FORMAT_ETC2_SRGB8;
  327.    case GL_COMPRESSED_RGBA8_ETC2_EAC:
  328.       return MESA_FORMAT_ETC2_RGBA8_EAC;
  329.    case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
  330.       return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
  331.    case GL_COMPRESSED_R11_EAC:
  332.       return MESA_FORMAT_ETC2_R11_EAC;
  333.    case GL_COMPRESSED_RG11_EAC:
  334.       return MESA_FORMAT_ETC2_RG11_EAC;
  335.    case GL_COMPRESSED_SIGNED_R11_EAC:
  336.       return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
  337.    case GL_COMPRESSED_SIGNED_RG11_EAC:
  338.       return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
  339.    case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
  340.       return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
  341.    case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
  342.       return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
  343.    case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  344.       return MESA_FORMAT_SRGB_DXT1;
  345.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  346.       return MESA_FORMAT_SRGBA_DXT1;
  347.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  348.       return MESA_FORMAT_SRGBA_DXT3;
  349.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  350.       return MESA_FORMAT_SRGBA_DXT5;
  351.    case GL_COMPRESSED_RGBA_BPTC_UNORM:
  352.       return MESA_FORMAT_BPTC_RGBA_UNORM;
  353.    case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM:
  354.       return MESA_FORMAT_BPTC_SRGB_ALPHA_UNORM;
  355.    case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT:
  356.       return MESA_FORMAT_BPTC_RGB_SIGNED_FLOAT;
  357.    case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT:
  358.       return MESA_FORMAT_BPTC_RGB_UNSIGNED_FLOAT;
  359.  
  360.    case GL_ALPHA16F_ARB:
  361.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT16);
  362.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT32);
  363.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  364.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  365.       break;
  366.    case GL_ALPHA32F_ARB:
  367.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT32);
  368.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  369.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_FLOAT16);
  370.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  371.       break;
  372.    case GL_LUMINANCE16F_ARB:
  373.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT16);
  374.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT32);
  375.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  376.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  377.       break;
  378.    case GL_LUMINANCE32F_ARB:
  379.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT32);
  380.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  381.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_FLOAT16);
  382.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  383.       break;
  384.    case GL_LUMINANCE_ALPHA16F_ARB:
  385.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT16);
  386.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT32);
  387.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  388.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  389.       break;
  390.    case GL_LUMINANCE_ALPHA32F_ARB:
  391.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT32);
  392.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  393.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_FLOAT16);
  394.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  395.       break;
  396.    case GL_INTENSITY16F_ARB:
  397.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT16);
  398.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT32);
  399.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  400.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  401.       break;
  402.    case GL_INTENSITY32F_ARB:
  403.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT32);
  404.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  405.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_FLOAT16);
  406.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  407.       break;
  408.    case GL_RGB16F_ARB:
  409.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
  410.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_FLOAT16);
  411.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  412.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
  413.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  414.       break;
  415.    case GL_RGB32F_ARB:
  416.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT32);
  417.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_FLOAT32);
  418.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  419.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_FLOAT16);
  420.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  421.       break;
  422.    case GL_RGBA16F_ARB:
  423.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  424.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  425.       break;
  426.    case GL_RGBA32F_ARB:
  427.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  428.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  429.       break;
  430.  
  431.    case GL_RGB9_E5:
  432.       /* GL_EXT_texture_shared_exponent -- just one format to support */
  433.       assert(ctx->TextureFormatSupported[MESA_FORMAT_R9G9B9E5_FLOAT]);
  434.       return MESA_FORMAT_R9G9B9E5_FLOAT;
  435.  
  436.    case GL_R11F_G11F_B10F:
  437.       /* GL_EXT_texture_packed_float -- just one format to support */
  438.       assert(ctx->TextureFormatSupported[MESA_FORMAT_R11G11B10_FLOAT]);
  439.       return MESA_FORMAT_R11G11B10_FLOAT;
  440.  
  441.    case GL_DEPTH_STENCIL_EXT:
  442.    case GL_DEPTH24_STENCIL8_EXT:
  443.       RETURN_IF_SUPPORTED(MESA_FORMAT_S8_UINT_Z24_UNORM);
  444.       RETURN_IF_SUPPORTED(MESA_FORMAT_Z24_UNORM_S8_UINT);
  445.       break;
  446.  
  447.    case GL_DEPTH_COMPONENT32F:
  448.       assert(ctx->TextureFormatSupported[MESA_FORMAT_Z_FLOAT32]);
  449.       return MESA_FORMAT_Z_FLOAT32;
  450.    case GL_DEPTH32F_STENCIL8:
  451.       assert(ctx->TextureFormatSupported[MESA_FORMAT_Z32_FLOAT_S8X24_UINT]);
  452.       return MESA_FORMAT_Z32_FLOAT_S8X24_UINT;
  453.  
  454.    case GL_RED_SNORM:
  455.    case GL_R8_SNORM:
  456.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_SNORM8);
  457.       break;
  458.    case GL_RG_SNORM:
  459.    case GL_RG8_SNORM:
  460.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_SNORM);
  461.       break;
  462.    case GL_RGB_SNORM:
  463.    case GL_RGB8_SNORM:
  464.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SNORM);
  465.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  466.       RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM);
  467.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  468.       break;
  469.    case GL_RGBA_SNORM:
  470.    case GL_RGBA8_SNORM:
  471.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  472.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  473.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  474.       break;
  475.    case GL_ALPHA_SNORM:
  476.    case GL_ALPHA8_SNORM:
  477.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_SNORM8);
  478.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  479.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  480.       break;
  481.    case GL_LUMINANCE_SNORM:
  482.    case GL_LUMINANCE8_SNORM:
  483.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_SNORM8);
  484.       RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SNORM);
  485.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  486.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  487.       break;
  488.    case GL_LUMINANCE_ALPHA_SNORM:
  489.    case GL_LUMINANCE8_ALPHA8_SNORM:
  490.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SNORM);
  491.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8L8_SNORM);
  492.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  493.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  494.       break;
  495.    case GL_INTENSITY_SNORM:
  496.    case GL_INTENSITY8_SNORM:
  497.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_SNORM8);
  498.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  499.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  500.       break;
  501.    case GL_R16_SNORM:
  502.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_SNORM16);
  503.       break;
  504.    case GL_RG16_SNORM:
  505.       RETURN_IF_SUPPORTED(MESA_FORMAT_R16G16_SNORM);
  506.       break;
  507.    case GL_RGB16_SNORM:
  508.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SNORM16);
  509.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SNORM16);
  510.       /* FALLTHROUGH */
  511.    case GL_RGBA16_SNORM:
  512.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16);
  513.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  514.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  515.       break;
  516.    case GL_ALPHA16_SNORM:
  517.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_SNORM16);
  518.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16);
  519.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  520.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  521.       break;
  522.    case GL_LUMINANCE16_SNORM:
  523.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_SNORM16);
  524.       /* FALLTHROUGH */
  525.    case GL_LUMINANCE16_ALPHA16_SNORM:
  526.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SNORM16);
  527.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16);
  528.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  529.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  530.       break;
  531.    case GL_INTENSITY16_SNORM:
  532.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_SNORM16);
  533.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SNORM16);
  534.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SNORM);
  535.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SNORM);
  536.       break;
  537.  
  538.    case GL_SRGB_EXT:
  539.    case GL_SRGB8_EXT:
  540.       /* there is no MESA_FORMAT_RGB_SRGB8 */
  541.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8X8_SRGB);
  542.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB);
  543.  
  544.       RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8);
  545.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
  546.  
  547.       RETURN_IF_SUPPORTED(MESA_FORMAT_X8B8G8R8_SRGB);
  548.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB);
  549.       break;
  550.    case GL_SRGB_ALPHA_EXT:
  551.    case GL_SRGB8_ALPHA8_EXT:
  552.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8B8A8_SRGB);
  553.  
  554.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB);
  555.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
  556.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB);
  557.       break;
  558.    case GL_SLUMINANCE_EXT:
  559.    case GL_SLUMINANCE8_EXT:
  560.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_SRGB8);
  561.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
  562.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB);
  563.       break;
  564.    case GL_SLUMINANCE_ALPHA_EXT:
  565.    case GL_SLUMINANCE8_ALPHA8_EXT:
  566.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SRGB);
  567.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8L8_SRGB);
  568.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
  569.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB);
  570.       break;
  571.    case GL_COMPRESSED_SLUMINANCE_EXT:
  572.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_SRGB8);
  573.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
  574.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB);
  575.       break;
  576.    case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
  577.       RETURN_IF_SUPPORTED(MESA_FORMAT_L8A8_SRGB);
  578.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8L8_SRGB);
  579.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
  580.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB);
  581.       break;
  582.    case GL_COMPRESSED_SRGB_EXT:
  583.       if (ctx->Mesa_DXTn)
  584.          RETURN_IF_SUPPORTED(MESA_FORMAT_SRGB_DXT1);
  585.       RETURN_IF_SUPPORTED(MESA_FORMAT_BGR_SRGB8);
  586.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
  587.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB);
  588.       break;
  589.    case GL_COMPRESSED_SRGB_ALPHA_EXT:
  590.       if (ctx->Mesa_DXTn)
  591.          RETURN_IF_SUPPORTED(MESA_FORMAT_SRGBA_DXT3); /* Not srgba_dxt1, see spec */
  592.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8B8G8R8_SRGB);
  593.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_SRGB);
  594.       RETURN_IF_SUPPORTED(MESA_FORMAT_A8R8G8B8_SRGB);
  595.       break;
  596.  
  597.    case GL_ALPHA8UI_EXT:
  598.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT8);
  599.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
  600.       break;
  601.    case GL_ALPHA16UI_EXT:
  602.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT16);
  603.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
  604.       break;
  605.    case GL_ALPHA32UI_EXT:
  606.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_UINT32);
  607.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
  608.       break;
  609.    case GL_ALPHA8I_EXT:
  610.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT8);
  611.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
  612.       break;
  613.    case GL_ALPHA16I_EXT:
  614.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT16);
  615.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
  616.       break;
  617.    case GL_ALPHA32I_EXT:
  618.       RETURN_IF_SUPPORTED(MESA_FORMAT_A_SINT32);
  619.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
  620.       break;
  621.    case GL_LUMINANCE8UI_EXT:
  622.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT8);
  623.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
  624.       break;
  625.    case GL_LUMINANCE16UI_EXT:
  626.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT16);
  627.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
  628.       break;
  629.    case GL_LUMINANCE32UI_EXT:
  630.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_UINT32);
  631.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
  632.       break;
  633.    case GL_LUMINANCE8I_EXT:
  634.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT8);
  635.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
  636.       break;
  637.    case GL_LUMINANCE16I_EXT:
  638.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT16);
  639.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
  640.       break;
  641.    case GL_LUMINANCE32I_EXT:
  642.       RETURN_IF_SUPPORTED(MESA_FORMAT_L_SINT32);
  643.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
  644.       break;
  645.    case GL_LUMINANCE_ALPHA8UI_EXT:
  646.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT8);
  647.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
  648.       break;
  649.    case GL_LUMINANCE_ALPHA16UI_EXT:
  650.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT16);
  651.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
  652.       break;
  653.    case GL_LUMINANCE_ALPHA32UI_EXT:
  654.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_UINT32);
  655.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
  656.       break;
  657.    case GL_LUMINANCE_ALPHA8I_EXT:
  658.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT8);
  659.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
  660.       break;
  661.    case GL_LUMINANCE_ALPHA16I_EXT:
  662.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT16);
  663.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
  664.       break;
  665.    case GL_LUMINANCE_ALPHA32I_EXT:
  666.       RETURN_IF_SUPPORTED(MESA_FORMAT_LA_SINT32);
  667.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
  668.       break;
  669.    case GL_INTENSITY8UI_EXT:
  670.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT8);
  671.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
  672.       break;
  673.    case GL_INTENSITY16UI_EXT:
  674.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT16);
  675.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
  676.       break;
  677.    case GL_INTENSITY32UI_EXT:
  678.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_UINT32);
  679.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
  680.       break;
  681.    case GL_INTENSITY8I_EXT:
  682.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT8);
  683.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
  684.       break;
  685.    case GL_INTENSITY16I_EXT:
  686.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT16);
  687.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
  688.       break;
  689.    case GL_INTENSITY32I_EXT:
  690.       RETURN_IF_SUPPORTED(MESA_FORMAT_I_SINT32);
  691.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
  692.       break;
  693.  
  694.    case GL_RGB8UI_EXT:
  695.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT8);
  696.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT8);
  697.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
  698.       break;
  699.    case GL_RGB16UI_EXT:
  700.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT16);
  701.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT16);
  702.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
  703.       break;
  704.    case GL_RGB32UI_EXT:
  705.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_UINT32);
  706.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_UINT32);
  707.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
  708.       break;
  709.    case GL_RGB8I_EXT:
  710.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT8);
  711.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT8);
  712.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
  713.       break;
  714.    case GL_RGB16I_EXT:
  715.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT16);
  716.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT16);
  717.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
  718.       break;
  719.    case GL_RGB32I_EXT:
  720.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGB_SINT32);
  721.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBX_SINT32);
  722.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
  723.       break;
  724.    case GL_RGBA8UI_EXT:
  725.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT8);
  726.       break;
  727.    case GL_RGBA16UI_EXT:
  728.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT16);
  729.       break;
  730.    case GL_RGBA32UI_EXT:
  731.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_UINT32);
  732.       break;
  733.    case GL_RGBA8I_EXT:
  734.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT8);
  735.       break;
  736.    case GL_RGBA16I_EXT:
  737.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT16);
  738.       break;
  739.    case GL_RGBA32I_EXT:
  740.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_SINT32);
  741.       break;
  742.  
  743.    case GL_R8:
  744.    case GL_RED:
  745.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM8);
  746.       break;
  747.  
  748.    case GL_COMPRESSED_RED:
  749.       if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
  750.          RETURN_IF_SUPPORTED(MESA_FORMAT_R_RGTC1_UNORM);
  751.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM8);
  752.       break;
  753.  
  754.    case GL_R16:
  755.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_UNORM16);
  756.       break;
  757.  
  758.    case GL_RG:
  759.    case GL_RG8:
  760.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_UNORM);
  761.       break;
  762.  
  763.    case GL_COMPRESSED_RG:
  764.       if (target != GL_TEXTURE_1D && target != GL_TEXTURE_1D_ARRAY)
  765.          RETURN_IF_SUPPORTED(MESA_FORMAT_RG_RGTC2_UNORM);
  766.       RETURN_IF_SUPPORTED(MESA_FORMAT_R8G8_UNORM);
  767.       break;
  768.  
  769.    case GL_RG16:
  770.       RETURN_IF_SUPPORTED(MESA_FORMAT_R16G16_UNORM);
  771.       break;
  772.  
  773.    case GL_R16F:
  774.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
  775.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
  776.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
  777.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
  778.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  779.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  780.       break;
  781.    case GL_R32F:
  782.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT32);
  783.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
  784.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  785.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_FLOAT16);
  786.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
  787.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  788.       break;
  789.    case GL_RG16F:
  790.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
  791.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
  792.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  793.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  794.       break;
  795.    case GL_RG32F:
  796.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT32);
  797.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT32);
  798.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_FLOAT16);
  799.       RETURN_IF_SUPPORTED(MESA_FORMAT_RGBA_FLOAT16);
  800.       break;
  801.  
  802.    case GL_R8UI:
  803.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT8);
  804.       break;
  805.    case GL_RG8UI:
  806.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT8);
  807.       break;
  808.    case GL_R16UI:
  809.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT16);
  810.       break;
  811.    case GL_RG16UI:
  812.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT16);
  813.       break;
  814.    case GL_R32UI:
  815.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_UINT32);
  816.       break;
  817.    case GL_RG32UI:
  818.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_UINT32);
  819.       break;
  820.    case GL_R8I:
  821.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT8);
  822.       break;
  823.    case GL_RG8I:
  824.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT8);
  825.       break;
  826.    case GL_R16I:
  827.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT16);
  828.       break;
  829.    case GL_RG16I:
  830.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT16);
  831.       break;
  832.    case GL_R32I:
  833.       RETURN_IF_SUPPORTED(MESA_FORMAT_R_SINT32);
  834.       break;
  835.    case GL_RG32I:
  836.       RETURN_IF_SUPPORTED(MESA_FORMAT_RG_SINT32);
  837.       break;
  838.  
  839.    case GL_RGB10_A2UI:
  840.       RETURN_IF_SUPPORTED(MESA_FORMAT_B10G10R10A2_UINT);
  841.       RETURN_IF_SUPPORTED(MESA_FORMAT_R10G10B10A2_UINT);
  842.       break;
  843.  
  844.    case GL_BGRA:
  845.       RETURN_IF_SUPPORTED(MESA_FORMAT_B8G8R8A8_UNORM);
  846.       break;
  847.    }
  848.  
  849.    _mesa_problem(ctx, "unexpected format %s in _mesa_choose_tex_format()",
  850.                  _mesa_lookup_enum_by_nr(internalFormat));
  851.    return MESA_FORMAT_NONE;
  852. }
  853.  
  854. GLboolean
  855. _mesa_tex_target_is_array(GLenum target)
  856. {
  857.    switch (target) {
  858.    case GL_TEXTURE_1D_ARRAY_EXT:
  859.    case GL_TEXTURE_2D_ARRAY_EXT:
  860.    case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
  861.    case GL_TEXTURE_CUBE_MAP_ARRAY:
  862.       return GL_TRUE;
  863.    default:
  864.       return GL_FALSE;
  865.    }
  866. }
  867.