Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. /**************************************************************************
  2.  *
  3.  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
  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 TUNGSTEN GRAPHICS 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/texstore.h"
  39. #include "main/image.h"
  40. #include "main/macros.h"
  41.  
  42. #include "pipe/p_context.h"
  43. #include "pipe/p_defines.h"
  44. #include "pipe/p_screen.h"
  45. #include "util/u_format.h"
  46. #include "st_context.h"
  47. #include "st_format.h"
  48.  
  49.  
  50. /**
  51.  * Translate Mesa format to Gallium format.
  52.  */
  53. enum pipe_format
  54. st_mesa_format_to_pipe_format(gl_format mesaFormat)
  55. {
  56.    switch (mesaFormat) {
  57.    case MESA_FORMAT_RGBA8888:
  58.       return PIPE_FORMAT_ABGR8888_UNORM;
  59.    case MESA_FORMAT_RGBA8888_REV:
  60.       return PIPE_FORMAT_RGBA8888_UNORM;
  61.    case MESA_FORMAT_ARGB8888:
  62.       return PIPE_FORMAT_BGRA8888_UNORM;
  63.    case MESA_FORMAT_ARGB8888_REV:
  64.       return PIPE_FORMAT_ARGB8888_UNORM;
  65.    case MESA_FORMAT_RGBX8888:
  66.       return PIPE_FORMAT_XBGR8888_UNORM;
  67.    case MESA_FORMAT_RGBX8888_REV:
  68.       return PIPE_FORMAT_RGBX8888_UNORM;
  69.    case MESA_FORMAT_XRGB8888:
  70.       return PIPE_FORMAT_BGRX8888_UNORM;
  71.    case MESA_FORMAT_XRGB8888_REV:
  72.       return PIPE_FORMAT_XRGB8888_UNORM;
  73.    case MESA_FORMAT_ARGB1555:
  74.       return PIPE_FORMAT_B5G5R5A1_UNORM;
  75.    case MESA_FORMAT_ARGB4444:
  76.       return PIPE_FORMAT_B4G4R4A4_UNORM;
  77.    case MESA_FORMAT_RGB565:
  78.       return PIPE_FORMAT_B5G6R5_UNORM;
  79.    case MESA_FORMAT_RGB332:
  80.       return PIPE_FORMAT_B2G3R3_UNORM;
  81.    case MESA_FORMAT_ARGB2101010:
  82.       return PIPE_FORMAT_B10G10R10A2_UNORM;
  83.    case MESA_FORMAT_AL44:
  84.       return PIPE_FORMAT_L4A4_UNORM;
  85.    case MESA_FORMAT_AL88:
  86.       return PIPE_FORMAT_L8A8_UNORM;
  87.    case MESA_FORMAT_AL1616:
  88.       return PIPE_FORMAT_L16A16_UNORM;
  89.    case MESA_FORMAT_A8:
  90.       return PIPE_FORMAT_A8_UNORM;
  91.    case MESA_FORMAT_A16:
  92.       return PIPE_FORMAT_A16_UNORM;
  93.    case MESA_FORMAT_L8:
  94.       return PIPE_FORMAT_L8_UNORM;
  95.    case MESA_FORMAT_L16:
  96.       return PIPE_FORMAT_L16_UNORM;
  97.    case MESA_FORMAT_I8:
  98.       return PIPE_FORMAT_I8_UNORM;
  99.    case MESA_FORMAT_I16:
  100.       return PIPE_FORMAT_I16_UNORM;
  101.    case MESA_FORMAT_Z16:
  102.       return PIPE_FORMAT_Z16_UNORM;
  103.    case MESA_FORMAT_Z32:
  104.       return PIPE_FORMAT_Z32_UNORM;
  105.    case MESA_FORMAT_Z24_S8:
  106.       return PIPE_FORMAT_S8_UINT_Z24_UNORM;
  107.    case MESA_FORMAT_S8_Z24:
  108.       return PIPE_FORMAT_Z24_UNORM_S8_UINT;
  109.    case MESA_FORMAT_Z24_X8:
  110.       return PIPE_FORMAT_X8Z24_UNORM;
  111.    case MESA_FORMAT_X8_Z24:
  112.       return PIPE_FORMAT_Z24X8_UNORM;
  113.    case MESA_FORMAT_S8:
  114.       return PIPE_FORMAT_S8_UINT;
  115.    case MESA_FORMAT_Z32_FLOAT:
  116.       return PIPE_FORMAT_Z32_FLOAT;
  117.    case MESA_FORMAT_Z32_FLOAT_X24S8:
  118.       return PIPE_FORMAT_Z32_FLOAT_S8X24_UINT;
  119.    case MESA_FORMAT_YCBCR:
  120.       return PIPE_FORMAT_UYVY;
  121.    case MESA_FORMAT_RGB_DXT1:
  122.       return PIPE_FORMAT_DXT1_RGB;
  123.    case MESA_FORMAT_RGBA_DXT1:
  124.       return PIPE_FORMAT_DXT1_RGBA;
  125.    case MESA_FORMAT_RGBA_DXT3:
  126.       return PIPE_FORMAT_DXT3_RGBA;
  127.    case MESA_FORMAT_RGBA_DXT5:
  128.       return PIPE_FORMAT_DXT5_RGBA;
  129.    case MESA_FORMAT_SRGB_DXT1:
  130.       return PIPE_FORMAT_DXT1_SRGB;
  131.    case MESA_FORMAT_SRGBA_DXT1:
  132.       return PIPE_FORMAT_DXT1_SRGBA;
  133.    case MESA_FORMAT_SRGBA_DXT3:
  134.       return PIPE_FORMAT_DXT3_SRGBA;
  135.    case MESA_FORMAT_SRGBA_DXT5:
  136.       return PIPE_FORMAT_DXT5_SRGBA;
  137.    case MESA_FORMAT_SLA8:
  138.       return PIPE_FORMAT_L8A8_SRGB;
  139.    case MESA_FORMAT_SL8:
  140.       return PIPE_FORMAT_L8_SRGB;
  141.    case MESA_FORMAT_SRGB8:
  142.       return PIPE_FORMAT_R8G8B8_SRGB;
  143.    case MESA_FORMAT_SRGBA8:
  144.       return PIPE_FORMAT_A8B8G8R8_SRGB;
  145.    case MESA_FORMAT_SARGB8:
  146.       return PIPE_FORMAT_B8G8R8A8_SRGB;
  147.    case MESA_FORMAT_RGBA_FLOAT32:
  148.       return PIPE_FORMAT_R32G32B32A32_FLOAT;
  149.    case MESA_FORMAT_RGBA_FLOAT16:
  150.       return PIPE_FORMAT_R16G16B16A16_FLOAT;
  151.    case MESA_FORMAT_RGB_FLOAT32:
  152.       return PIPE_FORMAT_R32G32B32_FLOAT;
  153.    case MESA_FORMAT_RGB_FLOAT16:
  154.       return PIPE_FORMAT_R16G16B16_FLOAT;
  155.    case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
  156.       return PIPE_FORMAT_L32A32_FLOAT;
  157.    case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
  158.       return PIPE_FORMAT_L16A16_FLOAT;
  159.    case MESA_FORMAT_LUMINANCE_FLOAT32:
  160.       return PIPE_FORMAT_L32_FLOAT;
  161.    case MESA_FORMAT_LUMINANCE_FLOAT16:
  162.       return PIPE_FORMAT_L16_FLOAT;
  163.    case MESA_FORMAT_ALPHA_FLOAT32:
  164.       return PIPE_FORMAT_A32_FLOAT;
  165.    case MESA_FORMAT_ALPHA_FLOAT16:
  166.       return PIPE_FORMAT_A16_FLOAT;
  167.    case MESA_FORMAT_INTENSITY_FLOAT32:
  168.       return PIPE_FORMAT_I32_FLOAT;
  169.    case MESA_FORMAT_INTENSITY_FLOAT16:
  170.       return PIPE_FORMAT_I16_FLOAT;
  171.    case MESA_FORMAT_R_FLOAT32:
  172.       return PIPE_FORMAT_R32_FLOAT;
  173.    case MESA_FORMAT_R_FLOAT16:
  174.       return PIPE_FORMAT_R16_FLOAT;
  175.    case MESA_FORMAT_RG_FLOAT32:
  176.       return PIPE_FORMAT_R32G32_FLOAT;
  177.    case MESA_FORMAT_RG_FLOAT16:
  178.       return PIPE_FORMAT_R16G16_FLOAT;
  179.  
  180.    case MESA_FORMAT_R8:
  181.       return PIPE_FORMAT_R8_UNORM;
  182.    case MESA_FORMAT_R16:
  183.       return PIPE_FORMAT_R16_UNORM;
  184.    case MESA_FORMAT_GR88:
  185.       return PIPE_FORMAT_R8G8_UNORM;
  186.    case MESA_FORMAT_GR1616:
  187.       return PIPE_FORMAT_R16G16_UNORM;
  188.    case MESA_FORMAT_RGBA_16:
  189.       return PIPE_FORMAT_R16G16B16A16_UNORM;
  190.  
  191.    /* signed int formats */
  192.    case MESA_FORMAT_ALPHA_UINT8:
  193.       return PIPE_FORMAT_A8_UINT;
  194.    case MESA_FORMAT_ALPHA_UINT16:
  195.       return PIPE_FORMAT_A16_UINT;
  196.    case MESA_FORMAT_ALPHA_UINT32:
  197.       return PIPE_FORMAT_A32_UINT;
  198.  
  199.    case MESA_FORMAT_ALPHA_INT8:
  200.       return PIPE_FORMAT_A8_SINT;
  201.    case MESA_FORMAT_ALPHA_INT16:
  202.       return PIPE_FORMAT_A16_SINT;
  203.    case MESA_FORMAT_ALPHA_INT32:
  204.       return PIPE_FORMAT_A32_SINT;
  205.  
  206.    case MESA_FORMAT_INTENSITY_UINT8:
  207.       return PIPE_FORMAT_I8_UINT;
  208.    case MESA_FORMAT_INTENSITY_UINT16:
  209.       return PIPE_FORMAT_I16_UINT;
  210.    case MESA_FORMAT_INTENSITY_UINT32:
  211.       return PIPE_FORMAT_I32_UINT;
  212.  
  213.    case MESA_FORMAT_INTENSITY_INT8:
  214.       return PIPE_FORMAT_I8_SINT;
  215.    case MESA_FORMAT_INTENSITY_INT16:
  216.       return PIPE_FORMAT_I16_SINT;
  217.    case MESA_FORMAT_INTENSITY_INT32:
  218.       return PIPE_FORMAT_I32_SINT;
  219.  
  220.    case MESA_FORMAT_LUMINANCE_UINT8:
  221.       return PIPE_FORMAT_L8_UINT;
  222.    case MESA_FORMAT_LUMINANCE_UINT16:
  223.       return PIPE_FORMAT_L16_UINT;
  224.    case MESA_FORMAT_LUMINANCE_UINT32:
  225.       return PIPE_FORMAT_L32_UINT;
  226.  
  227.    case MESA_FORMAT_LUMINANCE_INT8:
  228.       return PIPE_FORMAT_L8_SINT;
  229.    case MESA_FORMAT_LUMINANCE_INT16:
  230.       return PIPE_FORMAT_L16_SINT;
  231.    case MESA_FORMAT_LUMINANCE_INT32:
  232.       return PIPE_FORMAT_L32_SINT;
  233.  
  234.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
  235.       return PIPE_FORMAT_L8A8_UINT;
  236.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
  237.       return PIPE_FORMAT_L16A16_UINT;
  238.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
  239.       return PIPE_FORMAT_L32A32_UINT;
  240.  
  241.    case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
  242.       return PIPE_FORMAT_L8A8_SINT;
  243.    case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
  244.       return PIPE_FORMAT_L16A16_SINT;
  245.    case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
  246.       return PIPE_FORMAT_L32A32_SINT;
  247.  
  248.    case MESA_FORMAT_R_INT8:
  249.       return PIPE_FORMAT_R8_SINT;
  250.    case MESA_FORMAT_RG_INT8:
  251.       return PIPE_FORMAT_R8G8_SINT;
  252.    case MESA_FORMAT_RGB_INT8:
  253.       return PIPE_FORMAT_R8G8B8_SINT;
  254.    case MESA_FORMAT_RGBA_INT8:
  255.       return PIPE_FORMAT_R8G8B8A8_SINT;
  256.    case MESA_FORMAT_R_INT16:
  257.       return PIPE_FORMAT_R16_SINT;
  258.    case MESA_FORMAT_RG_INT16:
  259.       return PIPE_FORMAT_R16G16_SINT;
  260.    case MESA_FORMAT_RGB_INT16:
  261.       return PIPE_FORMAT_R16G16B16_SINT;
  262.    case MESA_FORMAT_RGBA_INT16:
  263.       return PIPE_FORMAT_R16G16B16A16_SINT;
  264.    case MESA_FORMAT_R_INT32:
  265.       return PIPE_FORMAT_R32_SINT;
  266.    case MESA_FORMAT_RG_INT32:
  267.       return PIPE_FORMAT_R32G32_SINT;
  268.    case MESA_FORMAT_RGB_INT32:
  269.       return PIPE_FORMAT_R32G32B32_SINT;
  270.    case MESA_FORMAT_RGBA_INT32:
  271.       return PIPE_FORMAT_R32G32B32A32_SINT;
  272.  
  273.    /* unsigned int formats */
  274.    case MESA_FORMAT_R_UINT8:
  275.       return PIPE_FORMAT_R8_UINT;
  276.    case MESA_FORMAT_RG_UINT8:
  277.       return PIPE_FORMAT_R8G8_UINT;
  278.    case MESA_FORMAT_RGB_UINT8:
  279.       return PIPE_FORMAT_R8G8B8_UINT;
  280.    case MESA_FORMAT_RGBA_UINT8:
  281.       return PIPE_FORMAT_R8G8B8A8_UINT;
  282.    case MESA_FORMAT_R_UINT16:
  283.       return PIPE_FORMAT_R16_UINT;
  284.    case MESA_FORMAT_RG_UINT16:
  285.       return PIPE_FORMAT_R16G16_UINT;
  286.    case MESA_FORMAT_RGB_UINT16:
  287.       return PIPE_FORMAT_R16G16B16_UINT;
  288.    case MESA_FORMAT_RGBA_UINT16:
  289.       return PIPE_FORMAT_R16G16B16A16_UINT;
  290.    case MESA_FORMAT_R_UINT32:
  291.       return PIPE_FORMAT_R32_UINT;
  292.    case MESA_FORMAT_RG_UINT32:
  293.       return PIPE_FORMAT_R32G32_UINT;
  294.    case MESA_FORMAT_RGB_UINT32:
  295.       return PIPE_FORMAT_R32G32B32_UINT;
  296.    case MESA_FORMAT_RGBA_UINT32:
  297.       return PIPE_FORMAT_R32G32B32A32_UINT;
  298.  
  299.    case MESA_FORMAT_RED_RGTC1:
  300.       return PIPE_FORMAT_RGTC1_UNORM;
  301.    case MESA_FORMAT_SIGNED_RED_RGTC1:
  302.       return PIPE_FORMAT_RGTC1_SNORM;
  303.    case MESA_FORMAT_RG_RGTC2:
  304.       return PIPE_FORMAT_RGTC2_UNORM;
  305.    case MESA_FORMAT_SIGNED_RG_RGTC2:
  306.       return PIPE_FORMAT_RGTC2_SNORM;
  307.  
  308.    case MESA_FORMAT_L_LATC1:
  309.       return PIPE_FORMAT_LATC1_UNORM;
  310.    case MESA_FORMAT_SIGNED_L_LATC1:
  311.       return PIPE_FORMAT_LATC1_SNORM;
  312.    case MESA_FORMAT_LA_LATC2:
  313.       return PIPE_FORMAT_LATC2_UNORM;
  314.    case MESA_FORMAT_SIGNED_LA_LATC2:
  315.       return PIPE_FORMAT_LATC2_SNORM;
  316.  
  317.    case MESA_FORMAT_ETC1_RGB8:
  318.       return PIPE_FORMAT_ETC1_RGB8;
  319.  
  320.    /* signed normalized formats */
  321.    case MESA_FORMAT_SIGNED_R8:
  322.       return PIPE_FORMAT_R8_SNORM;
  323.    case MESA_FORMAT_SIGNED_RG88_REV:
  324.       return PIPE_FORMAT_R8G8_SNORM;
  325.    case MESA_FORMAT_SIGNED_RGBA8888_REV:
  326.       return PIPE_FORMAT_R8G8B8A8_SNORM;
  327.  
  328.    case MESA_FORMAT_SIGNED_A8:
  329.       return PIPE_FORMAT_A8_SNORM;
  330.    case MESA_FORMAT_SIGNED_L8:
  331.       return PIPE_FORMAT_L8_SNORM;
  332.    case MESA_FORMAT_SIGNED_AL88:
  333.       return PIPE_FORMAT_L8A8_SNORM;
  334.    case MESA_FORMAT_SIGNED_I8:
  335.       return PIPE_FORMAT_I8_SNORM;
  336.  
  337.    case MESA_FORMAT_SIGNED_R16:
  338.       return PIPE_FORMAT_R16_SNORM;
  339.    case MESA_FORMAT_SIGNED_GR1616:
  340.       return PIPE_FORMAT_R16G16_SNORM;
  341.    case MESA_FORMAT_SIGNED_RGBA_16:
  342.       return PIPE_FORMAT_R16G16B16A16_SNORM;
  343.  
  344.    case MESA_FORMAT_SIGNED_A16:
  345.       return PIPE_FORMAT_A16_SNORM;
  346.    case MESA_FORMAT_SIGNED_L16:
  347.       return PIPE_FORMAT_L16_SNORM;
  348.    case MESA_FORMAT_SIGNED_AL1616:
  349.       return PIPE_FORMAT_L16A16_SNORM;
  350.    case MESA_FORMAT_SIGNED_I16:
  351.       return PIPE_FORMAT_I16_SNORM;
  352.  
  353.    case MESA_FORMAT_RGB9_E5_FLOAT:
  354.       return PIPE_FORMAT_R9G9B9E5_FLOAT;
  355.    case MESA_FORMAT_R11_G11_B10_FLOAT:
  356.       return PIPE_FORMAT_R11G11B10_FLOAT;
  357.    case MESA_FORMAT_ARGB2101010_UINT:
  358.       return PIPE_FORMAT_B10G10R10A2_UINT;
  359.  
  360.    case MESA_FORMAT_XRGB4444_UNORM:
  361.       return PIPE_FORMAT_B4G4R4X4_UNORM;
  362.    case MESA_FORMAT_XRGB1555_UNORM:
  363.       return PIPE_FORMAT_B5G5R5X1_UNORM;
  364.    case MESA_FORMAT_XBGR8888_SNORM:
  365.       return PIPE_FORMAT_R8G8B8X8_SNORM;
  366.    case MESA_FORMAT_XBGR8888_SRGB:
  367.       return PIPE_FORMAT_R8G8B8X8_SRGB;
  368.    case MESA_FORMAT_XBGR8888_UINT:
  369.       return PIPE_FORMAT_R8G8B8X8_UINT;
  370.    case MESA_FORMAT_XBGR8888_SINT:
  371.       return PIPE_FORMAT_R8G8B8X8_SINT;
  372.    case MESA_FORMAT_XRGB2101010_UNORM:
  373.       return PIPE_FORMAT_B10G10R10X2_UNORM;
  374.    case MESA_FORMAT_XBGR16161616_UNORM:
  375.       return PIPE_FORMAT_R16G16B16X16_UNORM;
  376.    case MESA_FORMAT_XBGR16161616_SNORM:
  377.       return PIPE_FORMAT_R16G16B16X16_SNORM;
  378.    case MESA_FORMAT_XBGR16161616_FLOAT:
  379.       return PIPE_FORMAT_R16G16B16X16_FLOAT;
  380.    case MESA_FORMAT_XBGR16161616_UINT:
  381.       return PIPE_FORMAT_R16G16B16X16_UINT;
  382.    case MESA_FORMAT_XBGR16161616_SINT:
  383.       return PIPE_FORMAT_R16G16B16X16_SINT;
  384.    case MESA_FORMAT_XBGR32323232_FLOAT:
  385.       return PIPE_FORMAT_R32G32B32X32_FLOAT;
  386.    case MESA_FORMAT_XBGR32323232_UINT:
  387.       return PIPE_FORMAT_R32G32B32X32_UINT;
  388.    case MESA_FORMAT_XBGR32323232_SINT:
  389.       return PIPE_FORMAT_R32G32B32X32_SINT;
  390.  
  391.    default:
  392.       return PIPE_FORMAT_NONE;
  393.    }
  394. }
  395.  
  396.  
  397. /**
  398.  * Translate Gallium format to Mesa format.
  399.  */
  400. gl_format
  401. st_pipe_format_to_mesa_format(enum pipe_format format)
  402. {
  403.    switch (format) {
  404.    case PIPE_FORMAT_ABGR8888_UNORM:
  405.       return MESA_FORMAT_RGBA8888;
  406.    case PIPE_FORMAT_RGBA8888_UNORM:
  407.       return MESA_FORMAT_RGBA8888_REV;
  408.    case PIPE_FORMAT_BGRA8888_UNORM:
  409.       return MESA_FORMAT_ARGB8888;
  410.    case PIPE_FORMAT_ARGB8888_UNORM:
  411.       return MESA_FORMAT_ARGB8888_REV;
  412.    case PIPE_FORMAT_XBGR8888_UNORM:
  413.       return MESA_FORMAT_RGBX8888;
  414.    case PIPE_FORMAT_RGBX8888_UNORM:
  415.       return MESA_FORMAT_RGBX8888_REV;
  416.    case PIPE_FORMAT_BGRX8888_UNORM:
  417.       return MESA_FORMAT_XRGB8888;
  418.    case PIPE_FORMAT_XRGB8888_UNORM:
  419.       return MESA_FORMAT_XRGB8888_REV;
  420.    case PIPE_FORMAT_B5G5R5A1_UNORM:
  421.       return MESA_FORMAT_ARGB1555;
  422.    case PIPE_FORMAT_B4G4R4A4_UNORM:
  423.       return MESA_FORMAT_ARGB4444;
  424.    case PIPE_FORMAT_B5G6R5_UNORM:
  425.       return MESA_FORMAT_RGB565;
  426.    case PIPE_FORMAT_B2G3R3_UNORM:
  427.       return MESA_FORMAT_RGB332;
  428.    case PIPE_FORMAT_B10G10R10A2_UNORM:
  429.       return MESA_FORMAT_ARGB2101010;
  430.    case PIPE_FORMAT_L4A4_UNORM:
  431.       return MESA_FORMAT_AL44;
  432.    case PIPE_FORMAT_L8A8_UNORM:
  433.       return MESA_FORMAT_AL88;
  434.    case PIPE_FORMAT_L16A16_UNORM:
  435.       return MESA_FORMAT_AL1616;
  436.    case PIPE_FORMAT_A8_UNORM:
  437.       return MESA_FORMAT_A8;
  438.    case PIPE_FORMAT_A16_UNORM:
  439.       return MESA_FORMAT_A16;
  440.    case PIPE_FORMAT_L8_UNORM:
  441.       return MESA_FORMAT_L8;
  442.    case PIPE_FORMAT_L16_UNORM:
  443.       return MESA_FORMAT_L16;
  444.    case PIPE_FORMAT_I8_UNORM:
  445.       return MESA_FORMAT_I8;
  446.    case PIPE_FORMAT_I16_UNORM:
  447.       return MESA_FORMAT_I16;
  448.    case PIPE_FORMAT_S8_UINT:
  449.       return MESA_FORMAT_S8;
  450.  
  451.    case PIPE_FORMAT_R16G16B16A16_UNORM:
  452.       return MESA_FORMAT_RGBA_16;
  453.  
  454.    case PIPE_FORMAT_Z16_UNORM:
  455.       return MESA_FORMAT_Z16;
  456.    case PIPE_FORMAT_Z32_UNORM:
  457.       return MESA_FORMAT_Z32;
  458.    case PIPE_FORMAT_S8_UINT_Z24_UNORM:
  459.       return MESA_FORMAT_Z24_S8;
  460.    case PIPE_FORMAT_X8Z24_UNORM:
  461.       return MESA_FORMAT_Z24_X8;
  462.    case PIPE_FORMAT_Z24X8_UNORM:
  463.       return MESA_FORMAT_X8_Z24;
  464.    case PIPE_FORMAT_Z24_UNORM_S8_UINT:
  465.       return MESA_FORMAT_S8_Z24;
  466.    case PIPE_FORMAT_Z32_FLOAT:
  467.       return MESA_FORMAT_Z32_FLOAT;
  468.    case PIPE_FORMAT_Z32_FLOAT_S8X24_UINT:
  469.       return MESA_FORMAT_Z32_FLOAT_X24S8;
  470.  
  471.    case PIPE_FORMAT_UYVY:
  472.       return MESA_FORMAT_YCBCR;
  473.    case PIPE_FORMAT_YUYV:
  474.       return MESA_FORMAT_YCBCR_REV;
  475.  
  476.    case PIPE_FORMAT_DXT1_RGB:
  477.       return MESA_FORMAT_RGB_DXT1;
  478.    case PIPE_FORMAT_DXT1_RGBA:
  479.       return MESA_FORMAT_RGBA_DXT1;
  480.    case PIPE_FORMAT_DXT3_RGBA:
  481.       return MESA_FORMAT_RGBA_DXT3;
  482.    case PIPE_FORMAT_DXT5_RGBA:
  483.       return MESA_FORMAT_RGBA_DXT5;
  484.    case PIPE_FORMAT_DXT1_SRGB:
  485.       return MESA_FORMAT_SRGB_DXT1;
  486.    case PIPE_FORMAT_DXT1_SRGBA:
  487.       return MESA_FORMAT_SRGBA_DXT1;
  488.    case PIPE_FORMAT_DXT3_SRGBA:
  489.       return MESA_FORMAT_SRGBA_DXT3;
  490.    case PIPE_FORMAT_DXT5_SRGBA:
  491.       return MESA_FORMAT_SRGBA_DXT5;
  492.    case PIPE_FORMAT_L8A8_SRGB:
  493.       return MESA_FORMAT_SLA8;
  494.    case PIPE_FORMAT_L8_SRGB:
  495.       return MESA_FORMAT_SL8;
  496.    case PIPE_FORMAT_R8G8B8_SRGB:
  497.       return MESA_FORMAT_SRGB8;
  498.    case PIPE_FORMAT_A8B8G8R8_SRGB:
  499.       return MESA_FORMAT_SRGBA8;
  500.    case PIPE_FORMAT_B8G8R8A8_SRGB:
  501.       return MESA_FORMAT_SARGB8;
  502.    case PIPE_FORMAT_R32G32B32A32_FLOAT:
  503.       return MESA_FORMAT_RGBA_FLOAT32;
  504.    case PIPE_FORMAT_R16G16B16A16_FLOAT:
  505.       return MESA_FORMAT_RGBA_FLOAT16;
  506.    case PIPE_FORMAT_R32G32B32_FLOAT:
  507.       return MESA_FORMAT_RGB_FLOAT32;
  508.    case PIPE_FORMAT_R16G16B16_FLOAT:
  509.       return MESA_FORMAT_RGB_FLOAT16;
  510.    case PIPE_FORMAT_L32A32_FLOAT:
  511.       return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32;
  512.    case PIPE_FORMAT_L16A16_FLOAT:
  513.       return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16;
  514.    case PIPE_FORMAT_L32_FLOAT:
  515.       return MESA_FORMAT_LUMINANCE_FLOAT32;
  516.    case PIPE_FORMAT_L16_FLOAT:
  517.       return MESA_FORMAT_LUMINANCE_FLOAT16;
  518.    case PIPE_FORMAT_A32_FLOAT:
  519.       return MESA_FORMAT_ALPHA_FLOAT32;
  520.    case PIPE_FORMAT_A16_FLOAT:
  521.       return MESA_FORMAT_ALPHA_FLOAT16;
  522.    case PIPE_FORMAT_I32_FLOAT:
  523.       return MESA_FORMAT_INTENSITY_FLOAT32;
  524.    case PIPE_FORMAT_I16_FLOAT:
  525.       return MESA_FORMAT_INTENSITY_FLOAT16;
  526.    case PIPE_FORMAT_R32_FLOAT:
  527.       return MESA_FORMAT_R_FLOAT32;
  528.    case PIPE_FORMAT_R16_FLOAT:
  529.       return MESA_FORMAT_R_FLOAT16;
  530.    case PIPE_FORMAT_R32G32_FLOAT:
  531.       return MESA_FORMAT_RG_FLOAT32;
  532.    case PIPE_FORMAT_R16G16_FLOAT:
  533.       return MESA_FORMAT_RG_FLOAT16;
  534.  
  535.    case PIPE_FORMAT_R8_UNORM:
  536.       return MESA_FORMAT_R8;
  537.    case PIPE_FORMAT_R16_UNORM:
  538.       return MESA_FORMAT_R16;
  539.    case PIPE_FORMAT_R8G8_UNORM:
  540.       return MESA_FORMAT_GR88;
  541.    case PIPE_FORMAT_R16G16_UNORM:
  542.       return MESA_FORMAT_GR1616;
  543.  
  544.    case PIPE_FORMAT_A8_UINT:
  545.       return MESA_FORMAT_ALPHA_UINT8;
  546.    case PIPE_FORMAT_A16_UINT:
  547.       return MESA_FORMAT_ALPHA_UINT16;
  548.    case PIPE_FORMAT_A32_UINT:
  549.       return MESA_FORMAT_ALPHA_UINT32;
  550.    case PIPE_FORMAT_A8_SINT:
  551.       return MESA_FORMAT_ALPHA_INT8;
  552.    case PIPE_FORMAT_A16_SINT:
  553.       return MESA_FORMAT_ALPHA_INT16;
  554.    case PIPE_FORMAT_A32_SINT:
  555.       return MESA_FORMAT_ALPHA_INT32;
  556.  
  557.    case PIPE_FORMAT_I8_UINT:
  558.       return MESA_FORMAT_INTENSITY_UINT8;
  559.    case PIPE_FORMAT_I16_UINT:
  560.       return MESA_FORMAT_INTENSITY_UINT16;
  561.    case PIPE_FORMAT_I32_UINT:
  562.       return MESA_FORMAT_INTENSITY_UINT32;
  563.    case PIPE_FORMAT_I8_SINT:
  564.       return MESA_FORMAT_INTENSITY_INT8;
  565.    case PIPE_FORMAT_I16_SINT:
  566.       return MESA_FORMAT_INTENSITY_INT16;
  567.    case PIPE_FORMAT_I32_SINT:
  568.       return MESA_FORMAT_INTENSITY_INT32;
  569.  
  570.   case PIPE_FORMAT_L8_UINT:
  571.       return MESA_FORMAT_LUMINANCE_UINT8;
  572.    case PIPE_FORMAT_L16_UINT:
  573.       return MESA_FORMAT_LUMINANCE_UINT16;
  574.    case PIPE_FORMAT_L32_UINT:
  575.       return MESA_FORMAT_LUMINANCE_UINT32;
  576.    case PIPE_FORMAT_L8_SINT:
  577.       return MESA_FORMAT_LUMINANCE_INT8;
  578.    case PIPE_FORMAT_L16_SINT:
  579.       return MESA_FORMAT_LUMINANCE_INT16;
  580.    case PIPE_FORMAT_L32_SINT:
  581.       return MESA_FORMAT_LUMINANCE_INT32;
  582.  
  583.    case PIPE_FORMAT_L8A8_UINT:
  584.       return MESA_FORMAT_LUMINANCE_ALPHA_UINT8;
  585.    case PIPE_FORMAT_L16A16_UINT:
  586.       return MESA_FORMAT_LUMINANCE_ALPHA_UINT16;
  587.    case PIPE_FORMAT_L32A32_UINT:
  588.       return MESA_FORMAT_LUMINANCE_ALPHA_UINT32;
  589.    case PIPE_FORMAT_L8A8_SINT:
  590.       return MESA_FORMAT_LUMINANCE_ALPHA_INT8;
  591.    case PIPE_FORMAT_L16A16_SINT:
  592.       return MESA_FORMAT_LUMINANCE_ALPHA_INT16;
  593.    case PIPE_FORMAT_L32A32_SINT:
  594.       return MESA_FORMAT_LUMINANCE_ALPHA_INT32;
  595.  
  596.    case PIPE_FORMAT_R8_SINT:
  597.       return MESA_FORMAT_R_INT8;
  598.    case PIPE_FORMAT_R8G8_SINT:
  599.       return MESA_FORMAT_RG_INT8;
  600.    case PIPE_FORMAT_R8G8B8_SINT:
  601.       return MESA_FORMAT_RGB_INT8;
  602.    case PIPE_FORMAT_R8G8B8A8_SINT:
  603.       return MESA_FORMAT_RGBA_INT8;
  604.  
  605.    case PIPE_FORMAT_R16_SINT:
  606.       return MESA_FORMAT_R_INT16;
  607.    case PIPE_FORMAT_R16G16_SINT:
  608.       return MESA_FORMAT_RG_INT16;
  609.    case PIPE_FORMAT_R16G16B16_SINT:
  610.       return MESA_FORMAT_RGB_INT16;
  611.    case PIPE_FORMAT_R16G16B16A16_SINT:
  612.       return MESA_FORMAT_RGBA_INT16;
  613.  
  614.    case PIPE_FORMAT_R32_SINT:
  615.       return MESA_FORMAT_R_INT32;
  616.    case PIPE_FORMAT_R32G32_SINT:
  617.       return MESA_FORMAT_RG_INT32;
  618.    case PIPE_FORMAT_R32G32B32_SINT:
  619.       return MESA_FORMAT_RGB_INT32;
  620.    case PIPE_FORMAT_R32G32B32A32_SINT:
  621.       return MESA_FORMAT_RGBA_INT32;
  622.  
  623.    /* unsigned int formats */
  624.    case PIPE_FORMAT_R8_UINT:
  625.       return MESA_FORMAT_R_UINT8;
  626.    case PIPE_FORMAT_R8G8_UINT:
  627.       return MESA_FORMAT_RG_UINT8;
  628.    case PIPE_FORMAT_R8G8B8_UINT:
  629.       return MESA_FORMAT_RGB_UINT8;
  630.    case PIPE_FORMAT_R8G8B8A8_UINT:
  631.       return MESA_FORMAT_RGBA_UINT8;
  632.  
  633.    case PIPE_FORMAT_R16_UINT:
  634.       return MESA_FORMAT_R_UINT16;
  635.    case PIPE_FORMAT_R16G16_UINT:
  636.       return MESA_FORMAT_RG_UINT16;
  637.    case PIPE_FORMAT_R16G16B16_UINT:
  638.       return MESA_FORMAT_RGB_UINT16;
  639.    case PIPE_FORMAT_R16G16B16A16_UINT:
  640.       return MESA_FORMAT_RGBA_UINT16;
  641.  
  642.    case PIPE_FORMAT_R32_UINT:
  643.       return MESA_FORMAT_R_UINT32;
  644.    case PIPE_FORMAT_R32G32_UINT:
  645.       return MESA_FORMAT_RG_UINT32;
  646.    case PIPE_FORMAT_R32G32B32_UINT:
  647.       return MESA_FORMAT_RGB_UINT32;
  648.    case PIPE_FORMAT_R32G32B32A32_UINT:
  649.       return MESA_FORMAT_RGBA_UINT32;
  650.  
  651.    case PIPE_FORMAT_RGTC1_UNORM:
  652.       return MESA_FORMAT_RED_RGTC1;
  653.    case PIPE_FORMAT_RGTC1_SNORM:
  654.       return MESA_FORMAT_SIGNED_RED_RGTC1;
  655.    case PIPE_FORMAT_RGTC2_UNORM:
  656.       return MESA_FORMAT_RG_RGTC2;
  657.    case PIPE_FORMAT_RGTC2_SNORM:
  658.       return MESA_FORMAT_SIGNED_RG_RGTC2;
  659.  
  660.    case PIPE_FORMAT_LATC1_UNORM:
  661.       return MESA_FORMAT_L_LATC1;
  662.    case PIPE_FORMAT_LATC1_SNORM:
  663.       return MESA_FORMAT_SIGNED_L_LATC1;
  664.    case PIPE_FORMAT_LATC2_UNORM:
  665.       return MESA_FORMAT_LA_LATC2;
  666.    case PIPE_FORMAT_LATC2_SNORM:
  667.       return MESA_FORMAT_SIGNED_LA_LATC2;
  668.  
  669.    case PIPE_FORMAT_ETC1_RGB8:
  670.       return MESA_FORMAT_ETC1_RGB8;
  671.  
  672.    /* signed normalized formats */
  673.    case PIPE_FORMAT_R8_SNORM:
  674.       return MESA_FORMAT_SIGNED_R8;
  675.    case PIPE_FORMAT_R8G8_SNORM:
  676.       return MESA_FORMAT_SIGNED_RG88_REV;
  677.    case PIPE_FORMAT_R8G8B8A8_SNORM:
  678.       return MESA_FORMAT_SIGNED_RGBA8888_REV;
  679.  
  680.    case PIPE_FORMAT_A8_SNORM:
  681.       return MESA_FORMAT_SIGNED_A8;
  682.    case PIPE_FORMAT_L8_SNORM:
  683.       return MESA_FORMAT_SIGNED_L8;
  684.    case PIPE_FORMAT_L8A8_SNORM:
  685.       return MESA_FORMAT_SIGNED_AL88;
  686.    case PIPE_FORMAT_I8_SNORM:
  687.       return MESA_FORMAT_SIGNED_I8;
  688.  
  689.    case PIPE_FORMAT_R16_SNORM:
  690.       return MESA_FORMAT_SIGNED_R16;
  691.    case PIPE_FORMAT_R16G16_SNORM:
  692.       return MESA_FORMAT_SIGNED_GR1616;
  693.    case PIPE_FORMAT_R16G16B16A16_SNORM:
  694.       return MESA_FORMAT_SIGNED_RGBA_16;
  695.  
  696.    case PIPE_FORMAT_A16_SNORM:
  697.       return MESA_FORMAT_SIGNED_A16;
  698.    case PIPE_FORMAT_L16_SNORM:
  699.       return MESA_FORMAT_SIGNED_L16;
  700.    case PIPE_FORMAT_L16A16_SNORM:
  701.       return MESA_FORMAT_SIGNED_AL1616;
  702.    case PIPE_FORMAT_I16_SNORM:
  703.       return MESA_FORMAT_SIGNED_I16;
  704.  
  705.    case PIPE_FORMAT_R9G9B9E5_FLOAT:
  706.       return MESA_FORMAT_RGB9_E5_FLOAT;
  707.    case PIPE_FORMAT_R11G11B10_FLOAT:
  708.       return MESA_FORMAT_R11_G11_B10_FLOAT;
  709.  
  710.    case PIPE_FORMAT_B10G10R10A2_UINT:
  711.       return MESA_FORMAT_ARGB2101010_UINT;
  712.  
  713.    case PIPE_FORMAT_B4G4R4X4_UNORM:
  714.       return MESA_FORMAT_XRGB4444_UNORM;
  715.    case PIPE_FORMAT_B5G5R5X1_UNORM:
  716.       return MESA_FORMAT_XRGB1555_UNORM;
  717.    case PIPE_FORMAT_R8G8B8X8_SNORM:
  718.       return MESA_FORMAT_XBGR8888_SNORM;
  719.    case PIPE_FORMAT_R8G8B8X8_SRGB:
  720.       return MESA_FORMAT_XBGR8888_SRGB;
  721.    case PIPE_FORMAT_R8G8B8X8_UINT:
  722.       return MESA_FORMAT_XBGR8888_UINT;
  723.    case PIPE_FORMAT_R8G8B8X8_SINT:
  724.       return MESA_FORMAT_XBGR8888_SINT;
  725.    case PIPE_FORMAT_B10G10R10X2_UNORM:
  726.       return MESA_FORMAT_XRGB2101010_UNORM;
  727.    case PIPE_FORMAT_R16G16B16X16_UNORM:
  728.       return MESA_FORMAT_XBGR16161616_UNORM;
  729.    case PIPE_FORMAT_R16G16B16X16_SNORM:
  730.       return MESA_FORMAT_XBGR16161616_SNORM;
  731.    case PIPE_FORMAT_R16G16B16X16_FLOAT:
  732.       return MESA_FORMAT_XBGR16161616_FLOAT;
  733.    case PIPE_FORMAT_R16G16B16X16_UINT:
  734.       return MESA_FORMAT_XBGR16161616_UINT;
  735.    case PIPE_FORMAT_R16G16B16X16_SINT:
  736.       return MESA_FORMAT_XBGR16161616_SINT;
  737.    case PIPE_FORMAT_R32G32B32X32_FLOAT:
  738.       return MESA_FORMAT_XBGR32323232_FLOAT;
  739.    case PIPE_FORMAT_R32G32B32X32_UINT:
  740.       return MESA_FORMAT_XBGR32323232_UINT;
  741.    case PIPE_FORMAT_R32G32B32X32_SINT:
  742.       return MESA_FORMAT_XBGR32323232_SINT;
  743.  
  744.    default:
  745.       assert(0);
  746.       return MESA_FORMAT_NONE;
  747.    }
  748. }
  749.  
  750.  
  751. /**
  752.  * Map GL texture formats to Gallium pipe formats.
  753.  */
  754. struct format_mapping
  755. {
  756.    GLenum glFormats[18];       /**< list of GLenum formats, 0-terminated */
  757.    enum pipe_format pipeFormats[13]; /**< list of pipe formats, 0-terminated */
  758. };
  759.  
  760.  
  761. #define DEFAULT_RGBA_FORMATS \
  762.       PIPE_FORMAT_B8G8R8A8_UNORM, \
  763.       PIPE_FORMAT_R8G8B8A8_UNORM, \
  764.       PIPE_FORMAT_A8R8G8B8_UNORM, \
  765.       PIPE_FORMAT_A8B8G8R8_UNORM, \
  766.       0
  767.  
  768. #define DEFAULT_RGB_FORMATS \
  769.       PIPE_FORMAT_B8G8R8X8_UNORM, \
  770.       PIPE_FORMAT_R8G8B8X8_UNORM, \
  771.       PIPE_FORMAT_X8R8G8B8_UNORM, \
  772.       PIPE_FORMAT_X8B8G8R8_UNORM, \
  773.       PIPE_FORMAT_B5G6R5_UNORM, \
  774.       DEFAULT_RGBA_FORMATS
  775.  
  776. #define DEFAULT_SRGBA_FORMATS \
  777.       PIPE_FORMAT_B8G8R8A8_SRGB, \
  778.       PIPE_FORMAT_A8R8G8B8_SRGB, \
  779.       PIPE_FORMAT_A8B8G8R8_SRGB, \
  780.       0
  781.  
  782. #define DEFAULT_DEPTH_FORMATS \
  783.       PIPE_FORMAT_Z24X8_UNORM, \
  784.       PIPE_FORMAT_X8Z24_UNORM, \
  785.       PIPE_FORMAT_Z16_UNORM, \
  786.       PIPE_FORMAT_Z24_UNORM_S8_UINT, \
  787.       PIPE_FORMAT_S8_UINT_Z24_UNORM, \
  788.       0
  789.  
  790. #define DEFAULT_SNORM8_RGBA_FORMATS \
  791.       PIPE_FORMAT_R8G8B8A8_SNORM, \
  792.       0
  793.  
  794. #define DEFAULT_UNORM16_RGBA_FORMATS \
  795.       PIPE_FORMAT_R16G16B16A16_UNORM, \
  796.       DEFAULT_RGBA_FORMATS
  797.  
  798.  
  799. /**
  800.  * This table maps OpenGL texture format enums to Gallium pipe_format enums.
  801.  * Multiple GL enums might map to multiple pipe_formats.
  802.  * The first pipe format in the list that's supported is the one that's chosen.
  803.  */
  804. static const struct format_mapping format_map[] = {
  805.    /* Basic RGB, RGBA formats */
  806.    {
  807.       { GL_RGB10, 0 },
  808.       { PIPE_FORMAT_B10G10R10X2_UNORM, PIPE_FORMAT_B10G10R10A2_UNORM,
  809.         DEFAULT_RGB_FORMATS }
  810.    },
  811.    {
  812.       { GL_RGB10_A2, 0 },
  813.       { PIPE_FORMAT_B10G10R10A2_UNORM, DEFAULT_RGBA_FORMATS }
  814.    },
  815.    {
  816.       { 4, GL_RGBA, GL_RGBA8, 0 },
  817.       { PIPE_FORMAT_R8G8B8A8_UNORM, DEFAULT_RGBA_FORMATS }
  818.    },
  819.    {
  820.       { GL_BGRA, 0 },
  821.       { PIPE_FORMAT_B8G8R8A8_UNORM, DEFAULT_RGBA_FORMATS }
  822.    },
  823.    {
  824.       { 3, GL_RGB, GL_RGB8, 0 },
  825.       { DEFAULT_RGB_FORMATS }
  826.    },
  827.    {
  828.       { GL_RGB12, GL_RGB16, 0 },
  829.       { PIPE_FORMAT_R16G16B16X16_UNORM, PIPE_FORMAT_R16G16B16A16_UNORM,
  830.         DEFAULT_RGB_FORMATS }
  831.    },
  832.    {
  833.       { GL_RGBA12, GL_RGBA16, 0 },
  834.       { PIPE_FORMAT_R16G16B16A16_UNORM, DEFAULT_RGBA_FORMATS }
  835.    },
  836.    {
  837.       { GL_RGBA4, GL_RGBA2, 0 },
  838.       { PIPE_FORMAT_B4G4R4A4_UNORM, DEFAULT_RGBA_FORMATS }
  839.    },
  840.    {
  841.       { GL_RGB5_A1, 0 },
  842.       { PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGBA_FORMATS }
  843.    },
  844.    {
  845.       { GL_R3_G3_B2, 0 },
  846.       { PIPE_FORMAT_B2G3R3_UNORM, PIPE_FORMAT_B5G6R5_UNORM,
  847.         PIPE_FORMAT_B5G5R5A1_UNORM, DEFAULT_RGB_FORMATS }
  848.    },
  849.    {
  850.       { GL_RGB4 },
  851.       { PIPE_FORMAT_B4G4R4X4_UNORM, PIPE_FORMAT_B4G4R4A4_UNORM,
  852.         DEFAULT_RGB_FORMATS }
  853.    },
  854.    {
  855.       { GL_RGB5 },
  856.       { PIPE_FORMAT_B5G5R5X1_UNORM, PIPE_FORMAT_B5G5R5A1_UNORM,
  857.         DEFAULT_RGB_FORMATS }
  858.    },
  859.    {
  860.       { GL_RGB565 },
  861.       { PIPE_FORMAT_B5G6R5_UNORM, DEFAULT_RGB_FORMATS }
  862.    },
  863.  
  864.    /* basic Alpha formats */
  865.    {
  866.       { GL_ALPHA12, GL_ALPHA16, 0 },
  867.       { PIPE_FORMAT_A16_UNORM, PIPE_FORMAT_A8_UNORM,
  868.         DEFAULT_RGBA_FORMATS }
  869.    },
  870.    {
  871.       { GL_ALPHA, GL_ALPHA4, GL_ALPHA8, GL_COMPRESSED_ALPHA, 0 },
  872.       { PIPE_FORMAT_A8_UNORM, DEFAULT_RGBA_FORMATS }
  873.    },
  874.  
  875.    /* basic Luminance formats */
  876.    {
  877.       { GL_LUMINANCE12, GL_LUMINANCE16, 0 },
  878.       { PIPE_FORMAT_L16_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
  879.    },
  880.    {
  881.       { 1, GL_LUMINANCE, GL_LUMINANCE4, GL_LUMINANCE8, 0 },
  882.       { PIPE_FORMAT_L8_UNORM, DEFAULT_RGB_FORMATS }
  883.    },
  884.  
  885.    /* basic Luminance/Alpha formats */
  886.    {
  887.       { GL_LUMINANCE12_ALPHA4, GL_LUMINANCE12_ALPHA12,
  888.         GL_LUMINANCE16_ALPHA16, 0},
  889.       { PIPE_FORMAT_L16A16_UNORM, PIPE_FORMAT_L8A8_UNORM,
  890.         DEFAULT_RGBA_FORMATS }
  891.    },
  892.    {
  893.       { 2, GL_LUMINANCE_ALPHA, GL_LUMINANCE6_ALPHA2, GL_LUMINANCE8_ALPHA8, 0 },
  894.       { PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
  895.    },
  896.    {
  897.       { GL_LUMINANCE4_ALPHA4, 0 },
  898.       { PIPE_FORMAT_L4A4_UNORM, PIPE_FORMAT_L8A8_UNORM,
  899.         DEFAULT_RGBA_FORMATS }
  900.    },
  901.  
  902.    /* basic Intensity formats */
  903.    {
  904.       { GL_INTENSITY12, GL_INTENSITY16, 0 },
  905.       { PIPE_FORMAT_I16_UNORM, PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
  906.    },
  907.    {
  908.       { GL_INTENSITY, GL_INTENSITY4, GL_INTENSITY8,
  909.         GL_COMPRESSED_INTENSITY, 0 },
  910.       { PIPE_FORMAT_I8_UNORM, DEFAULT_RGBA_FORMATS }
  911.    },
  912.  
  913.    /* YCbCr */
  914.    {
  915.       { GL_YCBCR_MESA, 0 },
  916.       { PIPE_FORMAT_UYVY, PIPE_FORMAT_YUYV, 0 }
  917.    },
  918.  
  919.    /* compressed formats */ /* XXX PIPE_BIND_SAMPLER_VIEW only */
  920.    {
  921.       { GL_COMPRESSED_RGB, 0 },
  922.       { PIPE_FORMAT_DXT1_RGB, DEFAULT_RGB_FORMATS }
  923.    },
  924.    {
  925.       { GL_COMPRESSED_RGBA, 0 },
  926.       { PIPE_FORMAT_DXT5_RGBA, DEFAULT_RGBA_FORMATS }
  927.    },
  928.    {
  929.       { GL_RGB_S3TC, GL_RGB4_S3TC, GL_COMPRESSED_RGB_S3TC_DXT1_EXT, 0 },
  930.       { PIPE_FORMAT_DXT1_RGB, 0 }
  931.    },
  932.    {
  933.       { GL_COMPRESSED_RGBA_S3TC_DXT1_EXT, 0 },
  934.       { PIPE_FORMAT_DXT1_RGBA, 0 }
  935.    },
  936.    {
  937.       { GL_RGBA_S3TC, GL_RGBA4_S3TC, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT, 0 },
  938.       { PIPE_FORMAT_DXT3_RGBA, 0 }
  939.    },
  940.    {
  941.       { GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, 0 },
  942.       { PIPE_FORMAT_DXT5_RGBA, 0 }
  943.    },
  944.  
  945. #if 0
  946.    {
  947.       { GL_COMPRESSED_RGB_FXT1_3DFX, 0 },
  948.       { PIPE_FORMAT_RGB_FXT1, 0 }
  949.    },
  950.    {
  951.       { GL_COMPRESSED_RGBA_FXT1_3DFX, 0 },
  952.       { PIPE_FORMAT_RGBA_FXT1, 0 }
  953.    },
  954. #endif
  955.  
  956.    /* Depth formats */
  957.    {
  958.       { GL_DEPTH_COMPONENT16, 0 },
  959.       { PIPE_FORMAT_Z16_UNORM, DEFAULT_DEPTH_FORMATS }
  960.    },
  961.    {
  962.       { GL_DEPTH_COMPONENT24, 0 },
  963.       { PIPE_FORMAT_Z24X8_UNORM, PIPE_FORMAT_X8Z24_UNORM,
  964.         DEFAULT_DEPTH_FORMATS }
  965.    },
  966.    {
  967.       { GL_DEPTH_COMPONENT32, 0 },
  968.       { PIPE_FORMAT_Z32_UNORM, DEFAULT_DEPTH_FORMATS }
  969.    },
  970.    {
  971.       { GL_DEPTH_COMPONENT, 0 },
  972.       { DEFAULT_DEPTH_FORMATS }
  973.    },
  974.    {
  975.       { GL_DEPTH_COMPONENT32F, 0 },
  976.       { PIPE_FORMAT_Z32_FLOAT, 0 }
  977.    },
  978.  
  979.    /* stencil formats */
  980.    {
  981.       { GL_STENCIL_INDEX, GL_STENCIL_INDEX1_EXT, GL_STENCIL_INDEX4_EXT,
  982.         GL_STENCIL_INDEX8_EXT, GL_STENCIL_INDEX16_EXT, 0 },
  983.       {
  984.          PIPE_FORMAT_S8_UINT, PIPE_FORMAT_Z24_UNORM_S8_UINT,
  985.          PIPE_FORMAT_S8_UINT_Z24_UNORM, 0
  986.       }
  987.    },
  988.  
  989.    /* Depth / Stencil formats */
  990.    {
  991.       { GL_DEPTH_STENCIL_EXT, GL_DEPTH24_STENCIL8_EXT, 0 },
  992.       { PIPE_FORMAT_Z24_UNORM_S8_UINT, PIPE_FORMAT_S8_UINT_Z24_UNORM, 0 }
  993.    },
  994.    {
  995.       { GL_DEPTH32F_STENCIL8, 0 },
  996.       { PIPE_FORMAT_Z32_FLOAT_S8X24_UINT, 0 }
  997.    },
  998.  
  999.    /* sRGB formats */
  1000.    {
  1001.       { GL_SRGB_EXT, GL_SRGB8_EXT, 0 },
  1002.       { PIPE_FORMAT_R8G8B8X8_SRGB, DEFAULT_SRGBA_FORMATS }
  1003.    },
  1004.    {
  1005.       { GL_SRGB_ALPHA_EXT, GL_SRGB8_ALPHA8_EXT, 0 },
  1006.       { DEFAULT_SRGBA_FORMATS }
  1007.    },
  1008.    {
  1009.       { GL_COMPRESSED_SRGB_EXT, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT, 0 },
  1010.       { PIPE_FORMAT_DXT1_SRGB, PIPE_FORMAT_R8G8B8X8_SRGB,
  1011.         DEFAULT_SRGBA_FORMATS }
  1012.    },
  1013.    {
  1014.       { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT, 0 },
  1015.       { PIPE_FORMAT_DXT1_SRGBA, 0 }
  1016.    },
  1017.    {
  1018.       { GL_COMPRESSED_SRGB_ALPHA_EXT,
  1019.         GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT, 0 },
  1020.       { PIPE_FORMAT_DXT3_SRGBA, DEFAULT_SRGBA_FORMATS }
  1021.    },
  1022.    {
  1023.       { GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT, 0 },
  1024.       { PIPE_FORMAT_DXT5_SRGBA, 0 }
  1025.    },
  1026.    {
  1027.       { GL_SLUMINANCE_ALPHA_EXT, GL_SLUMINANCE8_ALPHA8_EXT,
  1028.         GL_COMPRESSED_SLUMINANCE_ALPHA_EXT, 0 },
  1029.       { PIPE_FORMAT_L8A8_SRGB, DEFAULT_SRGBA_FORMATS }
  1030.    },
  1031.    {
  1032.       { GL_SLUMINANCE_EXT, GL_SLUMINANCE8_EXT, GL_COMPRESSED_SLUMINANCE_EXT,
  1033.         0 },
  1034.       { PIPE_FORMAT_L8_SRGB, DEFAULT_SRGBA_FORMATS }
  1035.    },
  1036.  
  1037.    /* 16-bit float formats */
  1038.    {
  1039.       { GL_RGBA16F_ARB, 0 },
  1040.       { PIPE_FORMAT_R16G16B16A16_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
  1041.    },
  1042.    {
  1043.       { GL_RGB16F_ARB, 0 },
  1044.       { PIPE_FORMAT_R16G16B16_FLOAT, PIPE_FORMAT_R16G16B16X16_FLOAT,
  1045.         PIPE_FORMAT_R16G16B16A16_FLOAT,
  1046.         PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
  1047.    },
  1048.    {
  1049.       { GL_LUMINANCE_ALPHA16F_ARB, 0 },
  1050.       { PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
  1051.         PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
  1052.    },
  1053.    {
  1054.       { GL_ALPHA16F_ARB, 0 },
  1055.       { PIPE_FORMAT_A16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
  1056.         PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
  1057.         PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
  1058.    },
  1059.    {
  1060.       { GL_INTENSITY16F_ARB, 0 },
  1061.       { PIPE_FORMAT_I16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
  1062.         PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
  1063.         PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
  1064.    },
  1065.    {
  1066.       { GL_LUMINANCE16F_ARB, 0 },
  1067.       { PIPE_FORMAT_L16_FLOAT, PIPE_FORMAT_L16A16_FLOAT,
  1068.         PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
  1069.         PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
  1070.    },
  1071.    {
  1072.       { GL_R16F, 0 },
  1073.       { PIPE_FORMAT_R16_FLOAT, PIPE_FORMAT_R16G16_FLOAT,
  1074.         PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
  1075.         PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
  1076.    },
  1077.    {
  1078.       { GL_RG16F, 0 },
  1079.       { PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT,
  1080.         PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT, 0 }
  1081.    },
  1082.  
  1083.    /* 32-bit float formats */
  1084.    {
  1085.       { GL_RGBA32F_ARB, 0 },
  1086.       { PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
  1087.    },
  1088.    {
  1089.       { GL_RGB32F_ARB, 0 },
  1090.       { PIPE_FORMAT_R32G32B32_FLOAT, PIPE_FORMAT_R32G32B32X32_FLOAT,
  1091.         PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
  1092.    },
  1093.    {
  1094.       { GL_LUMINANCE_ALPHA32F_ARB, 0 },
  1095.       { PIPE_FORMAT_L32A32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
  1096.         PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
  1097.    },
  1098.    {
  1099.       { GL_ALPHA32F_ARB, 0 },
  1100.       { PIPE_FORMAT_A32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
  1101.         PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_A16_FLOAT,
  1102.         PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
  1103.    },
  1104.    {
  1105.       { GL_INTENSITY32F_ARB, 0 },
  1106.       { PIPE_FORMAT_I32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
  1107.         PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_I16_FLOAT,
  1108.         PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
  1109.    },
  1110.    {
  1111.       { GL_LUMINANCE32F_ARB, 0 },
  1112.       { PIPE_FORMAT_L32_FLOAT, PIPE_FORMAT_L32A32_FLOAT,
  1113.         PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_L16_FLOAT,
  1114.         PIPE_FORMAT_L16A16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
  1115.    },
  1116.    {
  1117.       { GL_R32F, 0 },
  1118.       { PIPE_FORMAT_R32_FLOAT, PIPE_FORMAT_R32G32_FLOAT,
  1119.         PIPE_FORMAT_R32G32B32A32_FLOAT, PIPE_FORMAT_R16_FLOAT,
  1120.         PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
  1121.    },
  1122.    {
  1123.       { GL_RG32F, 0 },
  1124.       { PIPE_FORMAT_R32G32_FLOAT, PIPE_FORMAT_R32G32B32A32_FLOAT,
  1125.         PIPE_FORMAT_R16G16_FLOAT, PIPE_FORMAT_R16G16B16A16_FLOAT, 0 }
  1126.    },
  1127.  
  1128.    /* R, RG formats */
  1129.    {
  1130.       { GL_RED, GL_R8, 0 },
  1131.       { PIPE_FORMAT_R8_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
  1132.    },
  1133.    {
  1134.       { GL_RG, GL_RG8, 0 },
  1135.       { PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
  1136.    },
  1137.    {
  1138.       { GL_R16, 0 },
  1139.       { PIPE_FORMAT_R16_UNORM, PIPE_FORMAT_R16G16_UNORM,
  1140.         DEFAULT_UNORM16_RGBA_FORMATS }
  1141.    },
  1142.    {
  1143.       { GL_RG16, 0 },
  1144.       { PIPE_FORMAT_R16G16_UNORM, DEFAULT_UNORM16_RGBA_FORMATS }
  1145.    },
  1146.  
  1147.    /* compressed R, RG formats */
  1148.    {
  1149.       { GL_COMPRESSED_RED, GL_COMPRESSED_RED_RGTC1, 0 },
  1150.       { PIPE_FORMAT_RGTC1_UNORM, PIPE_FORMAT_R8_UNORM, DEFAULT_RGBA_FORMATS }
  1151.    },
  1152.    {
  1153.       { GL_COMPRESSED_SIGNED_RED_RGTC1, 0 },
  1154.       { PIPE_FORMAT_RGTC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
  1155.    },
  1156.    {
  1157.       { GL_COMPRESSED_RG, GL_COMPRESSED_RG_RGTC2, 0 },
  1158.       { PIPE_FORMAT_RGTC2_UNORM, PIPE_FORMAT_R8G8_UNORM, DEFAULT_RGBA_FORMATS }
  1159.    },
  1160.    {
  1161.       { GL_COMPRESSED_SIGNED_RG_RGTC2, 0 },
  1162.       { PIPE_FORMAT_RGTC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
  1163.    },
  1164.    {
  1165.       { GL_COMPRESSED_LUMINANCE, GL_COMPRESSED_LUMINANCE_LATC1_EXT, 0 },
  1166.       { PIPE_FORMAT_LATC1_UNORM, PIPE_FORMAT_L8_UNORM, DEFAULT_RGBA_FORMATS }
  1167.    },
  1168.    {
  1169.       { GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT, 0 },
  1170.       { PIPE_FORMAT_LATC1_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
  1171.    },
  1172.    {
  1173.       { GL_COMPRESSED_LUMINANCE_ALPHA, GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT,
  1174.         GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI, 0 },
  1175.       { PIPE_FORMAT_LATC2_UNORM, PIPE_FORMAT_L8A8_UNORM, DEFAULT_RGBA_FORMATS }
  1176.    },
  1177.    {
  1178.       { GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT, 0 },
  1179.       { PIPE_FORMAT_LATC2_SNORM, DEFAULT_SNORM8_RGBA_FORMATS }
  1180.    },
  1181.  
  1182.    /* ETC1 */
  1183.    {
  1184.       { GL_ETC1_RGB8_OES, 0 },
  1185.       { PIPE_FORMAT_ETC1_RGB8, 0 }
  1186.    },
  1187.  
  1188.    /* signed/unsigned integer formats.
  1189.     */
  1190.    {
  1191.       { GL_RGBA_INTEGER_EXT,
  1192.         GL_BGRA_INTEGER_EXT,
  1193.         GL_RGBA8I_EXT, 0 },
  1194.       { PIPE_FORMAT_R8G8B8A8_SINT, 0 }
  1195.    },
  1196.    {
  1197.       { GL_RGB_INTEGER_EXT,
  1198.         GL_BGR_INTEGER_EXT,
  1199.         GL_RGB8I_EXT,
  1200.         GL_BLUE_INTEGER_EXT, 0 },
  1201.       { PIPE_FORMAT_R8G8B8_SINT, PIPE_FORMAT_R8G8B8X8_SINT,
  1202.         PIPE_FORMAT_R8G8B8A8_SINT, 0 }
  1203.    },
  1204.    {
  1205.       { GL_ALPHA_INTEGER_EXT,
  1206.         GL_ALPHA8I_EXT, 0 },
  1207.       { PIPE_FORMAT_A8_SINT, 0 }
  1208.    },
  1209.    {
  1210.       { GL_ALPHA16I_EXT, 0 },
  1211.       { PIPE_FORMAT_A16_SINT, 0 }
  1212.    },
  1213.    {
  1214.       { GL_ALPHA32I_EXT, 0 },
  1215.       { PIPE_FORMAT_A32_SINT, 0 }
  1216.    },
  1217.    {
  1218.       { GL_ALPHA8UI_EXT, 0 },
  1219.       { PIPE_FORMAT_A8_UINT, 0 }
  1220.    },
  1221.    {
  1222.       { GL_ALPHA16UI_EXT, 0 },
  1223.       { PIPE_FORMAT_A16_UINT, 0 }
  1224.    },
  1225.    {
  1226.       { GL_ALPHA32UI_EXT, 0 },
  1227.       { PIPE_FORMAT_A32_UINT, 0 }
  1228.    },
  1229.    {
  1230.       { GL_INTENSITY8I_EXT, 0 },
  1231.       { PIPE_FORMAT_I8_SINT, 0 }
  1232.    },
  1233.    {
  1234.       { GL_INTENSITY16I_EXT, 0 },
  1235.       { PIPE_FORMAT_I16_SINT, 0 }
  1236.    },
  1237.    {
  1238.       { GL_INTENSITY32I_EXT, 0 },
  1239.       { PIPE_FORMAT_I32_SINT, 0 }
  1240.    },
  1241.    {
  1242.       { GL_INTENSITY8UI_EXT, 0 },
  1243.       { PIPE_FORMAT_I8_UINT, 0 }
  1244.    },
  1245.    {
  1246.       { GL_INTENSITY16UI_EXT, 0 },
  1247.       { PIPE_FORMAT_I16_UINT, 0 }
  1248.    },
  1249.    {
  1250.       { GL_INTENSITY32UI_EXT, 0 },
  1251.       { PIPE_FORMAT_I32_UINT, 0 }
  1252.    },
  1253.    {
  1254.       { GL_LUMINANCE8I_EXT, 0 },
  1255.       { PIPE_FORMAT_L8_SINT, 0 }
  1256.    },
  1257.    {
  1258.       { GL_LUMINANCE16I_EXT, 0 },
  1259.       { PIPE_FORMAT_L16_SINT, 0 }
  1260.    },
  1261.    {
  1262.       { GL_LUMINANCE32I_EXT, 0 },
  1263.       { PIPE_FORMAT_L32_SINT, 0 }
  1264.    },
  1265.    {
  1266.       { GL_LUMINANCE_INTEGER_EXT,
  1267.         GL_LUMINANCE8UI_EXT, 0 },
  1268.       { PIPE_FORMAT_L8_UINT, 0 }
  1269.    },
  1270.    {
  1271.       { GL_LUMINANCE16UI_EXT, 0 },
  1272.       { PIPE_FORMAT_L16_UINT, 0 }
  1273.    },
  1274.    {
  1275.       { GL_LUMINANCE32UI_EXT, 0 },
  1276.       { PIPE_FORMAT_L32_UINT, 0 }
  1277.    },
  1278.    {
  1279.       { GL_LUMINANCE_ALPHA_INTEGER_EXT,
  1280.         GL_LUMINANCE_ALPHA8I_EXT, 0 },
  1281.       { PIPE_FORMAT_L8A8_SINT, 0 }
  1282.    },
  1283.    {
  1284.       { GL_LUMINANCE_ALPHA16I_EXT, 0 },
  1285.       { PIPE_FORMAT_L16A16_SINT, 0 }
  1286.    },
  1287.    {
  1288.       { GL_LUMINANCE_ALPHA32I_EXT, 0 },
  1289.       { PIPE_FORMAT_L32A32_SINT, 0 }
  1290.    },
  1291.    {
  1292.       { GL_LUMINANCE_ALPHA8UI_EXT, 0 },
  1293.       { PIPE_FORMAT_L8A8_UINT, 0 }
  1294.    },
  1295.    {
  1296.       { GL_LUMINANCE_ALPHA16UI_EXT, 0 },
  1297.       { PIPE_FORMAT_L16A16_UINT, 0 }
  1298.    },
  1299.    {
  1300.       { GL_LUMINANCE_ALPHA32UI_EXT, 0 },
  1301.       { PIPE_FORMAT_L32A32_UINT, 0 }
  1302.    },
  1303.    {
  1304.       { GL_RGB16I_EXT, 0 },
  1305.       { PIPE_FORMAT_R16G16B16_SINT, PIPE_FORMAT_R16G16B16X16_SINT,
  1306.         PIPE_FORMAT_R16G16B16A16_SINT, 0 },
  1307.    },
  1308.    {
  1309.       { GL_RGBA16I_EXT, 0 },
  1310.       { PIPE_FORMAT_R16G16B16A16_SINT, 0 },
  1311.    },
  1312.    {
  1313.       { GL_RGB32I_EXT, 0 },
  1314.       { PIPE_FORMAT_R32G32B32_SINT, PIPE_FORMAT_R32G32B32X32_SINT,
  1315.         PIPE_FORMAT_R32G32B32A32_SINT, 0 },
  1316.    },
  1317.    {
  1318.       { GL_RGBA32I_EXT, 0 },
  1319.       { PIPE_FORMAT_R32G32B32A32_SINT, 0 }
  1320.    },
  1321.    {
  1322.       { GL_RGBA8UI_EXT, 0 },
  1323.       { PIPE_FORMAT_R8G8B8A8_UINT, 0 }
  1324.    },
  1325.    {
  1326.       { GL_RGB8UI_EXT, 0 },
  1327.       { PIPE_FORMAT_R8G8B8_UINT, PIPE_FORMAT_R8G8B8X8_UINT,
  1328.         PIPE_FORMAT_R8G8B8A8_UINT, 0 }
  1329.    },
  1330.    {
  1331.       { GL_RGB16UI_EXT, 0 },
  1332.       { PIPE_FORMAT_R16G16B16_UINT, PIPE_FORMAT_R16G16B16X16_UINT,
  1333.         PIPE_FORMAT_R16G16B16A16_UINT, 0 }
  1334.    },
  1335.    {
  1336.       { GL_RGBA16UI_EXT, 0 },
  1337.       { PIPE_FORMAT_R16G16B16A16_UINT, 0 }
  1338.    },
  1339.    {
  1340.       { GL_RGB32UI_EXT, 0},
  1341.       { PIPE_FORMAT_R32G32B32_UINT, PIPE_FORMAT_R32G32B32X32_UINT,
  1342.         PIPE_FORMAT_R32G32B32A32_UINT, 0 }
  1343.    },
  1344.    {
  1345.       { GL_RGBA32UI_EXT, 0},
  1346.       { PIPE_FORMAT_R32G32B32A32_UINT, 0 }
  1347.    },
  1348.    {
  1349.      { GL_R8I, GL_RED_INTEGER_EXT, 0},
  1350.      { PIPE_FORMAT_R8_SINT, 0},
  1351.    },
  1352.    {
  1353.      { GL_R16I, 0},
  1354.      { PIPE_FORMAT_R16_SINT, 0},
  1355.    },
  1356.    {
  1357.      { GL_R32I, 0},
  1358.      { PIPE_FORMAT_R32_SINT, 0},
  1359.    },
  1360.   {
  1361.      { GL_R8UI, 0},
  1362.      { PIPE_FORMAT_R8_UINT, 0},
  1363.    },
  1364.    {
  1365.      { GL_R16UI, 0},
  1366.      { PIPE_FORMAT_R16_UINT, 0},
  1367.    },
  1368.    {
  1369.      { GL_R32UI, 0},
  1370.      { PIPE_FORMAT_R32_UINT, 0},
  1371.    },
  1372.    {
  1373.      { GL_RG8I, GL_GREEN_INTEGER_EXT, 0},
  1374.      { PIPE_FORMAT_R8G8_SINT, 0},
  1375.    },
  1376.    {
  1377.      { GL_RG16I, 0},
  1378.      { PIPE_FORMAT_R16G16_SINT, 0},
  1379.    },
  1380.    {
  1381.      { GL_RG32I, 0},
  1382.      { PIPE_FORMAT_R32G32_SINT, 0},
  1383.    },
  1384.   {
  1385.      { GL_RG8UI, 0},
  1386.      { PIPE_FORMAT_R8G8_UINT, 0},
  1387.    },
  1388.    {
  1389.      { GL_RG16UI, 0},
  1390.      { PIPE_FORMAT_R16G16_UINT, 0},
  1391.    },
  1392.    {
  1393.      { GL_RG32UI, 0},
  1394.      { PIPE_FORMAT_R32G32_UINT, 0},
  1395.    },
  1396.    /* signed normalized formats */
  1397.    {
  1398.       { GL_RED_SNORM, GL_R8_SNORM, 0 },
  1399.       { PIPE_FORMAT_R8_SNORM, PIPE_FORMAT_R8G8_SNORM,
  1400.         PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1401.    },
  1402.    {
  1403.       { GL_R16_SNORM, 0 },
  1404.       { PIPE_FORMAT_R16_SNORM,
  1405.         PIPE_FORMAT_R16G16_SNORM,
  1406.         PIPE_FORMAT_R16G16B16A16_SNORM,
  1407.         PIPE_FORMAT_R8_SNORM,
  1408.         PIPE_FORMAT_R8G8_SNORM,
  1409.         PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1410.    },
  1411.    {
  1412.       { GL_RG_SNORM, GL_RG8_SNORM, 0 },
  1413.       { PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1414.    },
  1415.    {
  1416.       { GL_RG16_SNORM, 0 },
  1417.       { PIPE_FORMAT_R16G16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
  1418.         PIPE_FORMAT_R8G8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1419.    },
  1420.    {
  1421.       { GL_RGB_SNORM, GL_RGB8_SNORM, 0 },
  1422.       { PIPE_FORMAT_R8G8B8X8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1423.    },
  1424.    {
  1425.       { GL_RGBA_SNORM, GL_RGBA8_SNORM, 0 },
  1426.       { PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1427.    },
  1428.    {
  1429.       { GL_RGB16_SNORM, 0 },
  1430.       { PIPE_FORMAT_R16G16B16X16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
  1431.         PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1432.    },
  1433.    {
  1434.       { GL_RGBA16_SNORM, 0 },
  1435.       { PIPE_FORMAT_R16G16B16A16_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1436.    },
  1437.    {
  1438.       { GL_ALPHA_SNORM, GL_ALPHA8_SNORM, 0 },
  1439.       { PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1440.    },
  1441.    {
  1442.       { GL_ALPHA16_SNORM, 0 },
  1443.       { PIPE_FORMAT_A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
  1444.         PIPE_FORMAT_A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1445.    },
  1446.    {
  1447.       { GL_LUMINANCE_SNORM, GL_LUMINANCE8_SNORM, 0 },
  1448.       { PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1449.    },
  1450.    {
  1451.       { GL_LUMINANCE16_SNORM, 0 },
  1452.       { PIPE_FORMAT_L16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
  1453.         PIPE_FORMAT_L8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1454.    },
  1455.    {
  1456.       { GL_LUMINANCE_ALPHA_SNORM, GL_LUMINANCE8_ALPHA8_SNORM, 0 },
  1457.       { PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1458.    },
  1459.    {
  1460.       { GL_LUMINANCE16_ALPHA16_SNORM, 0 },
  1461.       { PIPE_FORMAT_L16A16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
  1462.         PIPE_FORMAT_L8A8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1463.    },
  1464.    {
  1465.       { GL_INTENSITY_SNORM, GL_INTENSITY8_SNORM, 0 },
  1466.       { PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1467.    },
  1468.    {
  1469.       { GL_INTENSITY16_SNORM, 0 },
  1470.       { PIPE_FORMAT_I16_SNORM, PIPE_FORMAT_R16G16B16A16_SNORM,
  1471.         PIPE_FORMAT_I8_SNORM, PIPE_FORMAT_R8G8B8A8_SNORM, 0 }
  1472.    },
  1473.    {
  1474.       { GL_RGB9_E5, 0 },
  1475.       { PIPE_FORMAT_R9G9B9E5_FLOAT, 0 }
  1476.    },
  1477.    {
  1478.       { GL_R11F_G11F_B10F, 0 },
  1479.       { PIPE_FORMAT_R11G11B10_FLOAT, 0 }
  1480.    },
  1481.    {
  1482.       { GL_RGB10_A2UI, 0 },
  1483.       { PIPE_FORMAT_B10G10R10A2_UINT, 0 }
  1484.    },
  1485. };
  1486.  
  1487.  
  1488. /**
  1489.  * Return first supported format from the given list.
  1490.  * \param allow_dxt  indicates whether it's OK to return a DXT format.
  1491.  */
  1492. static enum pipe_format
  1493. find_supported_format(struct pipe_screen *screen,
  1494.                       const enum pipe_format formats[],
  1495.                       enum pipe_texture_target target,
  1496.                       unsigned sample_count,
  1497.                       unsigned tex_usage,
  1498.                       boolean allow_dxt)
  1499. {
  1500.    uint i;
  1501.    for (i = 0; formats[i]; i++) {
  1502.       if (screen->is_format_supported(screen, formats[i], target,
  1503.                                       sample_count, tex_usage)) {
  1504.          if (!allow_dxt && util_format_is_s3tc(formats[i])) {
  1505.             /* we can't return a dxt format, continue searching */
  1506.             continue;
  1507.          }
  1508.  
  1509.          return formats[i];
  1510.       }
  1511.    }
  1512.    return PIPE_FORMAT_NONE;
  1513. }
  1514.  
  1515. struct exact_format_mapping
  1516. {
  1517.    GLenum format;
  1518.    GLenum type;
  1519.    enum pipe_format pformat;
  1520. };
  1521.  
  1522. static const struct exact_format_mapping rgba8888_tbl[] =
  1523. {
  1524.    { GL_RGBA,     GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_ABGR8888_UNORM },
  1525.    { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_ABGR8888_UNORM },
  1526.    { GL_RGBA,     GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_RGBA8888_UNORM },
  1527.    { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_RGBA8888_UNORM },
  1528.    { GL_BGRA,     GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_ARGB8888_UNORM },
  1529.    { GL_BGRA,     GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_BGRA8888_UNORM },
  1530.    { GL_RGBA,     GL_UNSIGNED_BYTE,               PIPE_FORMAT_R8G8B8A8_UNORM },
  1531.    { GL_ABGR_EXT, GL_UNSIGNED_BYTE,               PIPE_FORMAT_A8B8G8R8_UNORM },
  1532.    { GL_BGRA,     GL_UNSIGNED_BYTE,               PIPE_FORMAT_B8G8R8A8_UNORM },
  1533.    { 0,           0,                              0                          }
  1534. };
  1535.  
  1536. static const struct exact_format_mapping rgbx8888_tbl[] =
  1537. {
  1538.    { GL_RGBA,     GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_XBGR8888_UNORM },
  1539.    { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_XBGR8888_UNORM },
  1540.    { GL_RGBA,     GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_RGBX8888_UNORM },
  1541.    { GL_ABGR_EXT, GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_RGBX8888_UNORM },
  1542.    { GL_BGRA,     GL_UNSIGNED_INT_8_8_8_8,        PIPE_FORMAT_XRGB8888_UNORM },
  1543.    { GL_BGRA,     GL_UNSIGNED_INT_8_8_8_8_REV,    PIPE_FORMAT_BGRX8888_UNORM },
  1544.    { GL_RGBA,     GL_UNSIGNED_BYTE,               PIPE_FORMAT_R8G8B8X8_UNORM },
  1545.    { GL_ABGR_EXT, GL_UNSIGNED_BYTE,               PIPE_FORMAT_X8B8G8R8_UNORM },
  1546.    { GL_BGRA,     GL_UNSIGNED_BYTE,               PIPE_FORMAT_B8G8R8X8_UNORM },
  1547.    { 0,           0,                              0                          }
  1548. };
  1549.  
  1550. static const struct exact_format_mapping rgba1010102_tbl[] =
  1551. {
  1552.    { GL_BGRA,     GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_B10G10R10A2_UNORM },
  1553.    /* No Mesa formats for these Gallium formats:
  1554.    { GL_RGBA,     GL_UNSIGNED_INT_2_10_10_10_REV, PIPE_FORMAT_R10G10B10A2_UNORM },
  1555.    { GL_ABGR_EXT, GL_UNSIGNED_INT_10_10_10_2,     PIPE_FORMAT_R10G10B10A2_UNORM },
  1556.    { GL_ABGR_EXT, GL_UNSIGNED_INT,                PIPE_FORMAT_R10G10B10A2_UNORM },
  1557.    */
  1558.    { 0,           0,                              0                             }
  1559. };
  1560.  
  1561. /**
  1562.  * If there is an exact pipe_format match for {internalFormat, format, type}
  1563.  * return that, otherwise return PIPE_FORMAT_NONE so we can do fuzzy matching.
  1564.  */
  1565. static enum pipe_format
  1566. find_exact_format(GLint internalFormat, GLenum format, GLenum type)
  1567. {
  1568.    uint i;
  1569.    const struct exact_format_mapping* tbl;
  1570.  
  1571.    if (format == GL_NONE || type == GL_NONE)
  1572.       return PIPE_FORMAT_NONE;
  1573.  
  1574.    switch (internalFormat) {
  1575.    case 4:
  1576.    case GL_RGBA:
  1577.    case GL_RGBA8:
  1578.       tbl = rgba8888_tbl;
  1579.       break;
  1580.    case 3:
  1581.    case GL_RGB:
  1582.    case GL_RGB8:
  1583.       tbl = rgbx8888_tbl;
  1584.       break;
  1585.    case GL_RGB10_A2:
  1586.       tbl = rgba1010102_tbl;
  1587.       break;
  1588.    default:
  1589.       return PIPE_FORMAT_NONE;
  1590.    }
  1591.  
  1592.    for (i = 0; tbl[i].format; i++)
  1593.       if (tbl[i].format == format && tbl[i].type == type)
  1594.          return tbl[i].pformat;
  1595.  
  1596.    return PIPE_FORMAT_NONE;
  1597. }
  1598.  
  1599. /**
  1600.  * Given an OpenGL internalFormat value for a texture or surface, return
  1601.  * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
  1602.  * This is called during glTexImage2D, for example.
  1603.  *
  1604.  * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
  1605.  * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
  1606.  * we want render-to-texture ability.
  1607.  *
  1608.  * \param internalFormat  the user value passed to glTexImage2D
  1609.  * \param target  one of PIPE_TEXTURE_x
  1610.  * \param bindings  bitmask of PIPE_BIND_x flags.
  1611.  * \param allow_dxt  indicates whether it's OK to return a DXT format.  This
  1612.  *                   only matters when internalFormat names a generic or
  1613.  *                   specific compressed format.  And that should only happen
  1614.  *                   when we're getting called from gl[Copy]TexImage().
  1615.  */
  1616. enum pipe_format
  1617. st_choose_format(struct st_context *st, GLenum internalFormat,
  1618.                  GLenum format, GLenum type,
  1619.                  enum pipe_texture_target target, unsigned sample_count,
  1620.                  unsigned bindings, boolean allow_dxt)
  1621. {
  1622.    struct pipe_screen *screen = st->pipe->screen;
  1623.    int i, j;
  1624.    enum pipe_format pf;
  1625.  
  1626.    /* can't render to compressed formats at this time */
  1627.    if (_mesa_is_compressed_format(st->ctx, internalFormat)
  1628.        && (bindings & ~PIPE_BIND_SAMPLER_VIEW)) {
  1629.       return PIPE_FORMAT_NONE;
  1630.    }
  1631.  
  1632.    /* search for exact matches */
  1633.    pf = find_exact_format(internalFormat, format, type);
  1634.    if (pf != PIPE_FORMAT_NONE &&
  1635.        screen->is_format_supported(screen, pf,
  1636.                                    target, sample_count, bindings))
  1637.       return pf;
  1638.  
  1639.    /* search table for internalFormat */
  1640.    for (i = 0; i < Elements(format_map); i++) {
  1641.       const struct format_mapping *mapping = &format_map[i];
  1642.       for (j = 0; mapping->glFormats[j]; j++) {
  1643.          if (mapping->glFormats[j] == internalFormat) {
  1644.             /* Found the desired internal format.  Find first pipe format
  1645.              * which is supported by the driver.
  1646.              */
  1647.             return find_supported_format(screen, mapping->pipeFormats,
  1648.                                          target, sample_count, bindings,
  1649.                                          allow_dxt);
  1650.          }
  1651.       }
  1652.    }
  1653.  
  1654.    _mesa_problem(NULL, "unhandled format!\n");
  1655.    return PIPE_FORMAT_NONE;
  1656. }
  1657.  
  1658.  
  1659. /**
  1660.  * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
  1661.  */
  1662. enum pipe_format
  1663. st_choose_renderbuffer_format(struct st_context *st,
  1664.                               GLenum internalFormat, unsigned sample_count)
  1665. {
  1666.    uint usage;
  1667.    if (_mesa_is_depth_or_stencil_format(internalFormat))
  1668.       usage = PIPE_BIND_DEPTH_STENCIL;
  1669.    else
  1670.       usage = PIPE_BIND_RENDER_TARGET;
  1671.    return st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
  1672.                            PIPE_TEXTURE_2D, sample_count, usage, FALSE);
  1673. }
  1674.  
  1675.  
  1676. /**
  1677.  * Given an OpenGL user-requested format and type, and swapBytes state,
  1678.  * return the format which exactly matches those parameters, so that
  1679.  * a memcpy-based transfer can be done.
  1680.  *
  1681.  * If no format is supported, return PIPE_FORMAT_NONE.
  1682.  */
  1683. enum pipe_format
  1684. st_choose_matching_format(struct pipe_screen *screen, unsigned bind,
  1685.                           GLenum format, GLenum type, GLboolean swapBytes)
  1686. {
  1687.    gl_format mesa_format;
  1688.  
  1689.    for (mesa_format = 1; mesa_format < MESA_FORMAT_COUNT; mesa_format++) {
  1690.       if (_mesa_get_format_color_encoding(mesa_format) == GL_SRGB) {
  1691.          continue;
  1692.       }
  1693.  
  1694.       if (_mesa_format_matches_format_and_type(mesa_format, format, type,
  1695.                                                swapBytes)) {
  1696.          enum pipe_format format = st_mesa_format_to_pipe_format(mesa_format);
  1697.  
  1698.          if (format &&
  1699.              screen->is_format_supported(screen, format, PIPE_TEXTURE_2D, 0,
  1700.                                          bind)) {
  1701.             return format;
  1702.          }
  1703.          /* It's unlikely to find 2 matching Mesa formats. */
  1704.          break;
  1705.       }
  1706.    }
  1707.    return PIPE_FORMAT_NONE;
  1708. }
  1709.  
  1710.  
  1711. /**
  1712.  * Called via ctx->Driver.ChooseTextureFormat().
  1713.  */
  1714. gl_format
  1715. st_ChooseTextureFormat(struct gl_context *ctx, GLenum target,
  1716.                        GLint internalFormat,
  1717.                        GLenum format, GLenum type)
  1718. {
  1719.    const boolean want_renderable =
  1720.       internalFormat == 3 || internalFormat == 4 ||
  1721.       internalFormat == GL_RGB || internalFormat == GL_RGBA ||
  1722.       internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
  1723.       internalFormat == GL_BGRA;
  1724.    struct st_context *st = st_context(ctx);
  1725.    enum pipe_format pFormat;
  1726.    unsigned bindings;
  1727.  
  1728.    if (target == GL_TEXTURE_1D || target == GL_TEXTURE_1D_ARRAY) {
  1729.       /* We don't do compression for these texture targets because of
  1730.        * difficulty with sub-texture updates on non-block boundaries, etc.
  1731.        * So change the internal format request to an uncompressed format.
  1732.        */
  1733.       internalFormat =
  1734.         _mesa_generic_compressed_format_to_uncompressed_format(internalFormat);
  1735.    }
  1736.  
  1737.    /* GL textures may wind up being render targets, but we don't know
  1738.     * that in advance.  Specify potential render target flags now.
  1739.     */
  1740.    bindings = PIPE_BIND_SAMPLER_VIEW;
  1741.    if (want_renderable) {
  1742.       if (_mesa_is_depth_or_stencil_format(internalFormat))
  1743.          bindings |= PIPE_BIND_DEPTH_STENCIL;
  1744.       else
  1745.          bindings |= PIPE_BIND_RENDER_TARGET;
  1746.    }
  1747.  
  1748.    pFormat = st_choose_format(st, internalFormat, format, type,
  1749.                               PIPE_TEXTURE_2D, 0, bindings, ctx->Mesa_DXTn);
  1750.  
  1751.    if (pFormat == PIPE_FORMAT_NONE) {
  1752.       /* try choosing format again, this time without render target bindings */
  1753.       pFormat = st_choose_format(st, internalFormat, format, type,
  1754.                                  PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW,
  1755.                                  ctx->Mesa_DXTn);
  1756.    }
  1757.  
  1758.    if (pFormat == PIPE_FORMAT_NONE) {
  1759.       /* no luck at all */
  1760.       return MESA_FORMAT_NONE;
  1761.    }
  1762.  
  1763.    return st_pipe_format_to_mesa_format(pFormat);
  1764. }
  1765.  
  1766.  
  1767. /**
  1768.  * Called via ctx->Driver.ChooseTextureFormat().
  1769.  */
  1770. size_t
  1771. st_QuerySamplesForFormat(struct gl_context *ctx, GLenum target,
  1772.                          GLenum internalFormat, int samples[16])
  1773. {
  1774.    struct st_context *st = st_context(ctx);
  1775.    enum pipe_format format;
  1776.    unsigned i, bind, num_sample_counts = 0;
  1777.  
  1778.    (void) target;
  1779.  
  1780.    if (_mesa_is_depth_or_stencil_format(internalFormat))
  1781.       bind = PIPE_BIND_DEPTH_STENCIL;
  1782.    else
  1783.       bind = PIPE_BIND_RENDER_TARGET;
  1784.  
  1785.    /* If an sRGB framebuffer is unsupported, sRGB formats behave like linear
  1786.     * formats.
  1787.     */
  1788.    if (!ctx->Extensions.EXT_framebuffer_sRGB) {
  1789.       internalFormat = _mesa_get_linear_internalformat(internalFormat);
  1790.    }
  1791.  
  1792.    /* Set sample counts in descending order. */
  1793.    for (i = 16; i > 1; i--) {
  1794.       format = st_choose_format(st, internalFormat, GL_NONE, GL_NONE,
  1795.                                 PIPE_TEXTURE_2D, i, bind, FALSE);
  1796.  
  1797.       if (format != PIPE_FORMAT_NONE) {
  1798.          samples[num_sample_counts++] = i;
  1799.       }
  1800.    }
  1801.  
  1802.    if (!num_sample_counts) {
  1803.       samples[num_sample_counts++] = 1;
  1804.    }
  1805.  
  1806.    return num_sample_counts;
  1807. }
  1808.  
  1809.  
  1810. /**
  1811.  * This is used for translating texture border color and the clear
  1812.  * color.  For example, the clear color is interpreted according to
  1813.  * the renderbuffer's base format.  For example, if clearing a
  1814.  * GL_LUMINANCE buffer, we'll return colorOut[0] = colorOut[1] =
  1815.  * colorOut[2] = colorIn[0].
  1816.  * Similarly for texture border colors.
  1817.  */
  1818. void
  1819. st_translate_color(union gl_color_union *colorIn,
  1820.                    union pipe_color_union *colorOut,
  1821.                    GLenum baseFormat, GLboolean is_integer)
  1822. {
  1823.    if (is_integer) {
  1824.       int *in = colorIn->i;
  1825.       int *out = colorOut->i;
  1826.  
  1827.       switch (baseFormat) {
  1828.       case GL_RED:
  1829.          out[0] = in[0];
  1830.          out[1] = 0;
  1831.          out[2] = 0;
  1832.          out[3] = 1;
  1833.          break;
  1834.       case GL_RG:
  1835.          out[0] = in[0];
  1836.          out[1] = in[1];
  1837.          out[2] = 0;
  1838.          out[3] = 1;
  1839.          break;
  1840.       case GL_RGB:
  1841.          out[0] = in[0];
  1842.          out[1] = in[1];
  1843.          out[2] = in[2];
  1844.          out[3] = 1;
  1845.          break;
  1846.       case GL_ALPHA:
  1847.          out[0] = out[1] = out[2] = 0;
  1848.          out[3] = in[3];
  1849.          break;
  1850.       case GL_LUMINANCE:
  1851.          out[0] = out[1] = out[2] = in[0];
  1852.          out[3] = 1;
  1853.          break;
  1854.       case GL_LUMINANCE_ALPHA:
  1855.          out[0] = out[1] = out[2] = in[0];
  1856.          out[3] = in[3];
  1857.          break;
  1858.       case GL_INTENSITY:
  1859.          out[0] = out[1] = out[2] = out[3] = in[0];
  1860.          break;
  1861.       default:
  1862.          COPY_4V(out, in);
  1863.       }
  1864.    }
  1865.    else {
  1866.       float *in = colorIn->f;
  1867.       float *out = colorOut->f;
  1868.  
  1869.       switch (baseFormat) {
  1870.       case GL_RED:
  1871.          out[0] = in[0];
  1872.          out[1] = 0.0F;
  1873.          out[2] = 0.0F;
  1874.          out[3] = 1.0F;
  1875.          break;
  1876.       case GL_RG:
  1877.          out[0] = in[0];
  1878.          out[1] = in[1];
  1879.          out[2] = 0.0F;
  1880.          out[3] = 1.0F;
  1881.          break;
  1882.       case GL_RGB:
  1883.          out[0] = in[0];
  1884.          out[1] = in[1];
  1885.          out[2] = in[2];
  1886.          out[3] = 1.0F;
  1887.          break;
  1888.       case GL_ALPHA:
  1889.          out[0] = out[1] = out[2] = 0.0F;
  1890.          out[3] = in[3];
  1891.          break;
  1892.       case GL_LUMINANCE:
  1893.          out[0] = out[1] = out[2] = in[0];
  1894.          out[3] = 1.0F;
  1895.          break;
  1896.       case GL_LUMINANCE_ALPHA:
  1897.          out[0] = out[1] = out[2] = in[0];
  1898.          out[3] = in[3];
  1899.          break;
  1900.       case GL_INTENSITY:
  1901.          out[0] = out[1] = out[2] = out[3] = in[0];
  1902.          break;
  1903.       default:
  1904.          COPY_4V(out, in);
  1905.       }
  1906.    }
  1907. }
  1908.