Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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