Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Mesa 3-D graphics library
  3.  *
  4.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  5.  * Copyright (c) 2008-2009  VMware, Inc.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  21.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  22.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  23.  * OTHER DEALINGS IN THE SOFTWARE.
  24.  */
  25.  
  26.  
  27. #include "imports.h"
  28. #include "formats.h"
  29. #include "macros.h"
  30. #include "glformats.h"
  31.  
  32.  
  33. /**
  34.  * Information about texture formats.
  35.  */
  36. struct gl_format_info
  37. {
  38.    gl_format Name;
  39.  
  40.    /** text name for debugging */
  41.    const char *StrName;
  42.  
  43.    /**
  44.     * Base format is one of GL_RED, GL_RG, GL_RGB, GL_RGBA, GL_ALPHA,
  45.     * GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY, GL_YCBCR_MESA,
  46.     * GL_DEPTH_COMPONENT, GL_STENCIL_INDEX, GL_DEPTH_STENCIL, GL_DUDV_ATI.
  47.     */
  48.    GLenum BaseFormat;
  49.  
  50.    /**
  51.     * Logical data type: one of  GL_UNSIGNED_NORMALIZED, GL_SIGNED_NORMALIZED,
  52.     * GL_UNSIGNED_INT, GL_INT, GL_FLOAT.
  53.     */
  54.    GLenum DataType;
  55.  
  56.    GLubyte RedBits;
  57.    GLubyte GreenBits;
  58.    GLubyte BlueBits;
  59.    GLubyte AlphaBits;
  60.    GLubyte LuminanceBits;
  61.    GLubyte IntensityBits;
  62.    GLubyte IndexBits;
  63.    GLubyte DepthBits;
  64.    GLubyte StencilBits;
  65.  
  66.    /**
  67.     * To describe compressed formats.  If not compressed, Width=Height=1.
  68.     */
  69.    GLubyte BlockWidth, BlockHeight;
  70.    GLubyte BytesPerBlock;
  71. };
  72.  
  73.  
  74. /**
  75.  * Info about each format.
  76.  * These must be in the same order as the MESA_FORMAT_* enums so that
  77.  * we can do lookups without searching.
  78.  */
  79. static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
  80. {
  81.    {
  82.       MESA_FORMAT_NONE,            /* Name */
  83.       "MESA_FORMAT_NONE",          /* StrName */
  84.       GL_NONE,                     /* BaseFormat */
  85.       GL_NONE,                     /* DataType */
  86.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  87.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  88.       0, 0, 0                      /* BlockWidth/Height,Bytes */
  89.    },
  90.    {
  91.       MESA_FORMAT_RGBA8888,        /* Name */
  92.       "MESA_FORMAT_RGBA8888",      /* StrName */
  93.       GL_RGBA,                     /* BaseFormat */
  94.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  95.       8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
  96.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  97.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  98.    },
  99.    {
  100.       MESA_FORMAT_RGBA8888_REV,    /* Name */
  101.       "MESA_FORMAT_RGBA8888_REV",  /* StrName */
  102.       GL_RGBA,                     /* BaseFormat */
  103.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  104.       8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
  105.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  106.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  107.    },
  108.    {
  109.       MESA_FORMAT_ARGB8888,        /* Name */
  110.       "MESA_FORMAT_ARGB8888",      /* StrName */
  111.       GL_RGBA,                     /* BaseFormat */
  112.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  113.       8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
  114.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  115.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  116.    },
  117.    {
  118.       MESA_FORMAT_ARGB8888_REV,    /* Name */
  119.       "MESA_FORMAT_ARGB8888_REV",  /* StrName */
  120.       GL_RGBA,                     /* BaseFormat */
  121.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  122.       8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
  123.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  124.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  125.    },
  126.    {
  127.       MESA_FORMAT_RGBX8888,        /* Name */
  128.       "MESA_FORMAT_RGBX8888",      /* StrName */
  129.       GL_RGB,                      /* BaseFormat */
  130.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  131.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  132.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  133.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  134.    },
  135.    {
  136.       MESA_FORMAT_RGBX8888_REV,    /* Name */
  137.       "MESA_FORMAT_RGBX8888_REV",  /* StrName */
  138.       GL_RGB,                      /* BaseFormat */
  139.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  140.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  141.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  142.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  143.    },
  144.    {
  145.       MESA_FORMAT_XRGB8888,        /* Name */
  146.       "MESA_FORMAT_XRGB8888",      /* StrName */
  147.       GL_RGB,                      /* BaseFormat */
  148.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  149.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  150.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  151.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  152.    },
  153.    {
  154.       MESA_FORMAT_XRGB8888_REV,    /* Name */
  155.       "MESA_FORMAT_XRGB8888_REV",  /* StrName */
  156.       GL_RGB,                      /* BaseFormat */
  157.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  158.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  159.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  160.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  161.    },
  162.    {
  163.       MESA_FORMAT_RGB888,          /* Name */
  164.       "MESA_FORMAT_RGB888",        /* StrName */
  165.       GL_RGB,                      /* BaseFormat */
  166.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  167.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  168.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  169.       1, 1, 3                      /* BlockWidth/Height,Bytes */
  170.    },
  171.    {
  172.       MESA_FORMAT_BGR888,          /* Name */
  173.       "MESA_FORMAT_BGR888",        /* StrName */
  174.       GL_RGB,                      /* BaseFormat */
  175.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  176.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  177.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  178.       1, 1, 3                      /* BlockWidth/Height,Bytes */
  179.    },
  180.    {
  181.       MESA_FORMAT_RGB565,          /* Name */
  182.       "MESA_FORMAT_RGB565",        /* StrName */
  183.       GL_RGB,                      /* BaseFormat */
  184.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  185.       5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */
  186.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  187.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  188.    },
  189.    {
  190.       MESA_FORMAT_RGB565_REV,      /* Name */
  191.       "MESA_FORMAT_RGB565_REV",    /* StrName */
  192.       GL_RGB,                      /* BaseFormat */
  193.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  194.       5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */
  195.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  196.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  197.    },
  198.    {
  199.       MESA_FORMAT_ARGB4444,        /* Name */
  200.       "MESA_FORMAT_ARGB4444",      /* StrName */
  201.       GL_RGBA,                     /* BaseFormat */
  202.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  203.       4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
  204.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  205.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  206.    },
  207.    {
  208.       MESA_FORMAT_ARGB4444_REV,    /* Name */
  209.       "MESA_FORMAT_ARGB4444_REV",  /* StrName */
  210.       GL_RGBA,                     /* BaseFormat */
  211.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  212.       4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
  213.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  214.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  215.    },
  216.    {
  217.       MESA_FORMAT_RGBA5551,        /* Name */
  218.       "MESA_FORMAT_RGBA5551",      /* StrName */
  219.       GL_RGBA,                     /* BaseFormat */
  220.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  221.       5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
  222.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  223.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  224.    },
  225.    {
  226.       MESA_FORMAT_ARGB1555,        /* Name */
  227.       "MESA_FORMAT_ARGB1555",      /* StrName */
  228.       GL_RGBA,                     /* BaseFormat */
  229.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  230.       5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
  231.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  232.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  233.    },
  234.    {
  235.       MESA_FORMAT_ARGB1555_REV,    /* Name */
  236.       "MESA_FORMAT_ARGB1555_REV",  /* StrName */
  237.       GL_RGBA,                     /* BaseFormat */
  238.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  239.       5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
  240.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  241.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  242.    },
  243.    {
  244.       MESA_FORMAT_AL44,            /* Name */
  245.       "MESA_FORMAT_AL44",          /* StrName */
  246.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  247.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  248.       0, 0, 0, 4,                  /* Red/Green/Blue/AlphaBits */
  249.       4, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  250.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  251.    },
  252.    {
  253.       MESA_FORMAT_AL88,            /* Name */
  254.       "MESA_FORMAT_AL88",          /* StrName */
  255.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  256.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  257.       0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
  258.       8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  259.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  260.    },
  261.    {
  262.       MESA_FORMAT_AL88_REV,        /* Name */
  263.       "MESA_FORMAT_AL88_REV",      /* StrName */
  264.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  265.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  266.       0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
  267.       8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  268.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  269.    },
  270.    {
  271.       MESA_FORMAT_AL1616,          /* Name */
  272.       "MESA_FORMAT_AL1616",        /* StrName */
  273.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  274.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  275.       0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */
  276.       16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
  277.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  278.    },
  279.    {
  280.       MESA_FORMAT_AL1616_REV,      /* Name */
  281.       "MESA_FORMAT_AL1616_REV",    /* StrName */
  282.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  283.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  284.       0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */
  285.       16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
  286.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  287.    },
  288.    {
  289.       MESA_FORMAT_RGB332,          /* Name */
  290.       "MESA_FORMAT_RGB332",        /* StrName */
  291.       GL_RGB,                      /* BaseFormat */
  292.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  293.       3, 3, 2, 0,                  /* Red/Green/Blue/AlphaBits */
  294.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  295.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  296.    },
  297.    {
  298.       MESA_FORMAT_A8,              /* Name */
  299.       "MESA_FORMAT_A8",            /* StrName */
  300.       GL_ALPHA,                    /* BaseFormat */
  301.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  302.       0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
  303.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  304.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  305.    },
  306.    {
  307.       MESA_FORMAT_A16,             /* Name */
  308.       "MESA_FORMAT_A16",           /* StrName */
  309.       GL_ALPHA,                    /* BaseFormat */
  310.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  311.       0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */
  312.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  313.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  314.    },
  315.    {
  316.       MESA_FORMAT_L8,              /* Name */
  317.       "MESA_FORMAT_L8",            /* StrName */
  318.       GL_LUMINANCE,                /* BaseFormat */
  319.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  320.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  321.       8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  322.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  323.    },
  324.    {
  325.       MESA_FORMAT_L16,             /* Name */
  326.       "MESA_FORMAT_L16",           /* StrName */
  327.       GL_LUMINANCE,                /* BaseFormat */
  328.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  329.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  330.       16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
  331.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  332.    },
  333.    {
  334.       MESA_FORMAT_I8,              /* Name */
  335.       "MESA_FORMAT_I8",            /* StrName */
  336.       GL_INTENSITY,                /* BaseFormat */
  337.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  338.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  339.       0, 8, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  340.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  341.    },
  342.    {
  343.       MESA_FORMAT_I16,             /* Name */
  344.       "MESA_FORMAT_I16",           /* StrName */
  345.       GL_INTENSITY,                /* BaseFormat */
  346.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  347.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  348.       0, 16, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
  349.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  350.    },
  351.    {
  352.       MESA_FORMAT_YCBCR,           /* Name */
  353.       "MESA_FORMAT_YCBCR",         /* StrName */
  354.       GL_YCBCR_MESA,               /* BaseFormat */
  355.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  356.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  357.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  358.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  359.    },
  360.    {
  361.       MESA_FORMAT_YCBCR_REV,       /* Name */
  362.       "MESA_FORMAT_YCBCR_REV",     /* StrName */
  363.       GL_YCBCR_MESA,               /* BaseFormat */
  364.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  365.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  366.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  367.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  368.    },
  369.    {
  370.       MESA_FORMAT_R8,
  371.       "MESA_FORMAT_R8",
  372.       GL_RED,
  373.       GL_UNSIGNED_NORMALIZED,
  374.       8, 0, 0, 0,
  375.       0, 0, 0, 0, 0,
  376.       1, 1, 1
  377.    },
  378.    {
  379.       MESA_FORMAT_GR88,
  380.       "MESA_FORMAT_GR88",
  381.       GL_RG,
  382.       GL_UNSIGNED_NORMALIZED,
  383.       8, 8, 0, 0,
  384.       0, 0, 0, 0, 0,
  385.       1, 1, 2
  386.    },
  387.    {
  388.       MESA_FORMAT_RG88,
  389.       "MESA_FORMAT_RG88",
  390.       GL_RG,
  391.       GL_UNSIGNED_NORMALIZED,
  392.       8, 8, 0, 0,
  393.       0, 0, 0, 0, 0,
  394.       1, 1, 2
  395.    },
  396.    {
  397.       MESA_FORMAT_R16,
  398.       "MESA_FORMAT_R16",
  399.       GL_RED,
  400.       GL_UNSIGNED_NORMALIZED,
  401.       16, 0, 0, 0,
  402.       0, 0, 0, 0, 0,
  403.       1, 1, 2
  404.    },
  405.    {
  406.       MESA_FORMAT_GR1616,
  407.       "MESA_FORMAT_GR1616",
  408.       GL_RG,
  409.       GL_UNSIGNED_NORMALIZED,
  410.       16, 16, 0, 0,
  411.       0, 0, 0, 0, 0,
  412.       1, 1, 4
  413.    },
  414.    {
  415.       MESA_FORMAT_RG1616,
  416.       "MESA_FORMAT_RG1616",
  417.       GL_RG,
  418.       GL_UNSIGNED_NORMALIZED,
  419.       16, 16, 0, 0,
  420.       0, 0, 0, 0, 0,
  421.       1, 1, 4
  422.    },
  423.    {
  424.       MESA_FORMAT_ARGB2101010,
  425.       "MESA_FORMAT_ARGB2101010",
  426.       GL_RGBA,
  427.       GL_UNSIGNED_NORMALIZED,
  428.       10, 10, 10, 2,
  429.       0, 0, 0, 0, 0,
  430.       1, 1, 4
  431.    },
  432.    {
  433.       MESA_FORMAT_Z24_S8,          /* Name */
  434.       "MESA_FORMAT_Z24_S8",        /* StrName */
  435.       GL_DEPTH_STENCIL,            /* BaseFormat */
  436.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  437.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  438.       0, 0, 0, 24, 8,              /* Lum/Int/Index/Depth/StencilBits */
  439.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  440.    },
  441.    {
  442.       MESA_FORMAT_S8_Z24,          /* Name */
  443.       "MESA_FORMAT_S8_Z24",        /* StrName */
  444.       GL_DEPTH_STENCIL,            /* BaseFormat */
  445.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  446.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  447.       0, 0, 0, 24, 8,              /* Lum/Int/Index/Depth/StencilBits */
  448.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  449.    },
  450.    {
  451.       MESA_FORMAT_Z16,             /* Name */
  452.       "MESA_FORMAT_Z16",           /* StrName */
  453.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  454.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  455.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  456.       0, 0, 0, 16, 0,              /* Lum/Int/Index/Depth/StencilBits */
  457.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  458.    },
  459.    {
  460.       MESA_FORMAT_X8_Z24,          /* Name */
  461.       "MESA_FORMAT_X8_Z24",        /* StrName */
  462.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  463.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  464.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  465.       0, 0, 0, 24, 0,              /* Lum/Int/Index/Depth/StencilBits */
  466.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  467.    },
  468.    {
  469.       MESA_FORMAT_Z24_X8,          /* Name */
  470.       "MESA_FORMAT_Z24_X8",        /* StrName */
  471.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  472.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  473.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  474.       0, 0, 0, 24, 0,              /* Lum/Int/Index/Depth/StencilBits */
  475.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  476.    },
  477.    {
  478.       MESA_FORMAT_Z32,             /* Name */
  479.       "MESA_FORMAT_Z32",           /* StrName */
  480.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  481.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  482.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  483.       0, 0, 0, 32, 0,              /* Lum/Int/Index/Depth/StencilBits */
  484.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  485.    },
  486.    {
  487.       MESA_FORMAT_S8,              /* Name */
  488.       "MESA_FORMAT_S8",            /* StrName */
  489.       GL_STENCIL_INDEX,            /* BaseFormat */
  490.       GL_UNSIGNED_INT,             /* DataType */
  491.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  492.       0, 0, 0, 0, 8,               /* Lum/Int/Index/Depth/StencilBits */
  493.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  494.    },
  495.    {
  496.       MESA_FORMAT_SRGB8,
  497.       "MESA_FORMAT_SRGB8",
  498.       GL_RGB,
  499.       GL_UNSIGNED_NORMALIZED,
  500.       8, 8, 8, 0,
  501.       0, 0, 0, 0, 0,
  502.       1, 1, 3
  503.    },
  504.    {
  505.       MESA_FORMAT_SRGBA8,
  506.       "MESA_FORMAT_SRGBA8",
  507.       GL_RGBA,
  508.       GL_UNSIGNED_NORMALIZED,    
  509.       8, 8, 8, 8,
  510.       0, 0, 0, 0, 0,
  511.       1, 1, 4
  512.    },
  513.    {
  514.       MESA_FORMAT_SARGB8,
  515.       "MESA_FORMAT_SARGB8",
  516.       GL_RGBA,
  517.       GL_UNSIGNED_NORMALIZED,    
  518.       8, 8, 8, 8,
  519.       0, 0, 0, 0, 0,
  520.       1, 1, 4
  521.    },
  522.    {
  523.       MESA_FORMAT_SL8,
  524.       "MESA_FORMAT_SL8",
  525.       GL_LUMINANCE,
  526.       GL_UNSIGNED_NORMALIZED,    
  527.       0, 0, 0, 0,
  528.       8, 0, 0, 0, 0,
  529.       1, 1, 1
  530.    },
  531.    {
  532.       MESA_FORMAT_SLA8,
  533.       "MESA_FORMAT_SLA8",
  534.       GL_LUMINANCE_ALPHA,
  535.       GL_UNSIGNED_NORMALIZED,    
  536.       0, 0, 0, 8,
  537.       8, 0, 0, 0, 0,
  538.       1, 1, 2
  539.    },
  540.    {
  541.       MESA_FORMAT_SRGB_DXT1,       /* Name */
  542.       "MESA_FORMAT_SRGB_DXT1",     /* StrName */
  543.       GL_RGB,                      /* BaseFormat */
  544.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  545.       4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */
  546.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  547.       4, 4, 8                      /* 8 bytes per 4x4 block */
  548.    },
  549.    {
  550.       MESA_FORMAT_SRGBA_DXT1,
  551.       "MESA_FORMAT_SRGBA_DXT1",
  552.       GL_RGBA,
  553.       GL_UNSIGNED_NORMALIZED,
  554.       4, 4, 4, 4,
  555.       0, 0, 0, 0, 0,
  556.       4, 4, 8                      /* 8 bytes per 4x4 block */
  557.    },
  558.    {
  559.       MESA_FORMAT_SRGBA_DXT3,
  560.       "MESA_FORMAT_SRGBA_DXT3",
  561.       GL_RGBA,
  562.       GL_UNSIGNED_NORMALIZED,
  563.       4, 4, 4, 4,
  564.       0, 0, 0, 0, 0,
  565.       4, 4, 16                     /* 16 bytes per 4x4 block */
  566.    },
  567.    {
  568.       MESA_FORMAT_SRGBA_DXT5,
  569.       "MESA_FORMAT_SRGBA_DXT5",
  570.       GL_RGBA,
  571.       GL_UNSIGNED_NORMALIZED,
  572.       4, 4, 4, 4,
  573.       0, 0, 0, 0, 0,
  574.       4, 4, 16                     /* 16 bytes per 4x4 block */
  575.    },
  576.  
  577.    {
  578.       MESA_FORMAT_RGB_FXT1,
  579.       "MESA_FORMAT_RGB_FXT1",
  580.       GL_RGB,
  581.       GL_UNSIGNED_NORMALIZED,
  582.       4, 4, 4, 0,                  /* approx Red/Green/BlueBits */
  583.       0, 0, 0, 0, 0,
  584.       8, 4, 16                     /* 16 bytes per 8x4 block */
  585.    },
  586.    {
  587.       MESA_FORMAT_RGBA_FXT1,
  588.       "MESA_FORMAT_RGBA_FXT1",
  589.       GL_RGBA,
  590.       GL_UNSIGNED_NORMALIZED,
  591.       4, 4, 4, 1,                  /* approx Red/Green/Blue/AlphaBits */
  592.       0, 0, 0, 0, 0,
  593.       8, 4, 16                     /* 16 bytes per 8x4 block */
  594.    },
  595.  
  596.    {
  597.       MESA_FORMAT_RGB_DXT1,        /* Name */
  598.       "MESA_FORMAT_RGB_DXT1",      /* StrName */
  599.       GL_RGB,                      /* BaseFormat */
  600.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  601.       4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */
  602.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  603.       4, 4, 8                      /* 8 bytes per 4x4 block */
  604.    },
  605.    {
  606.       MESA_FORMAT_RGBA_DXT1,
  607.       "MESA_FORMAT_RGBA_DXT1",
  608.       GL_RGBA,
  609.       GL_UNSIGNED_NORMALIZED,    
  610.       4, 4, 4, 4,
  611.       0, 0, 0, 0, 0,
  612.       4, 4, 8                      /* 8 bytes per 4x4 block */
  613.    },
  614.    {
  615.       MESA_FORMAT_RGBA_DXT3,
  616.       "MESA_FORMAT_RGBA_DXT3",
  617.       GL_RGBA,
  618.       GL_UNSIGNED_NORMALIZED,    
  619.       4, 4, 4, 4,
  620.       0, 0, 0, 0, 0,
  621.       4, 4, 16                     /* 16 bytes per 4x4 block */
  622.    },
  623.    {
  624.       MESA_FORMAT_RGBA_DXT5,
  625.       "MESA_FORMAT_RGBA_DXT5",
  626.       GL_RGBA,
  627.       GL_UNSIGNED_NORMALIZED,    
  628.       4, 4, 4, 4,
  629.       0, 0, 0, 0, 0,
  630.       4, 4, 16                     /* 16 bytes per 4x4 block */
  631.    },
  632.    {
  633.       MESA_FORMAT_RGBA_FLOAT32,
  634.       "MESA_FORMAT_RGBA_FLOAT32",
  635.       GL_RGBA,
  636.       GL_FLOAT,
  637.       32, 32, 32, 32,
  638.       0, 0, 0, 0, 0,
  639.       1, 1, 16
  640.    },
  641.    {
  642.       MESA_FORMAT_RGBA_FLOAT16,
  643.       "MESA_FORMAT_RGBA_FLOAT16",
  644.       GL_RGBA,
  645.       GL_FLOAT,
  646.       16, 16, 16, 16,
  647.       0, 0, 0, 0, 0,
  648.       1, 1, 8
  649.    },
  650.    {
  651.       MESA_FORMAT_RGB_FLOAT32,
  652.       "MESA_FORMAT_RGB_FLOAT32",
  653.       GL_RGB,
  654.       GL_FLOAT,
  655.       32, 32, 32, 0,
  656.       0, 0, 0, 0, 0,
  657.       1, 1, 12
  658.    },
  659.    {
  660.       MESA_FORMAT_RGB_FLOAT16,
  661.       "MESA_FORMAT_RGB_FLOAT16",
  662.       GL_RGB,
  663.       GL_FLOAT,
  664.       16, 16, 16, 0,
  665.       0, 0, 0, 0, 0,
  666.       1, 1, 6
  667.    },
  668.    {
  669.       MESA_FORMAT_ALPHA_FLOAT32,
  670.       "MESA_FORMAT_ALPHA_FLOAT32",
  671.       GL_ALPHA,
  672.       GL_FLOAT,
  673.       0, 0, 0, 32,
  674.       0, 0, 0, 0, 0,
  675.       1, 1, 4
  676.    },
  677.    {
  678.       MESA_FORMAT_ALPHA_FLOAT16,
  679.       "MESA_FORMAT_ALPHA_FLOAT16",
  680.       GL_ALPHA,
  681.       GL_FLOAT,
  682.       0, 0, 0, 16,
  683.       0, 0, 0, 0, 0,
  684.       1, 1, 2
  685.    },
  686.    {
  687.       MESA_FORMAT_LUMINANCE_FLOAT32,
  688.       "MESA_FORMAT_LUMINANCE_FLOAT32",
  689.       GL_LUMINANCE,
  690.       GL_FLOAT,
  691.       0, 0, 0, 0,
  692.       32, 0, 0, 0, 0,
  693.       1, 1, 4
  694.    },
  695.    {
  696.       MESA_FORMAT_LUMINANCE_FLOAT16,
  697.       "MESA_FORMAT_LUMINANCE_FLOAT16",
  698.       GL_LUMINANCE,
  699.       GL_FLOAT,
  700.       0, 0, 0, 0,
  701.       16, 0, 0, 0, 0,
  702.       1, 1, 2
  703.    },
  704.    {
  705.       MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
  706.       "MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32",
  707.       GL_LUMINANCE_ALPHA,
  708.       GL_FLOAT,
  709.       0, 0, 0, 32,
  710.       32, 0, 0, 0, 0,
  711.       1, 1, 8
  712.    },
  713.    {
  714.       MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
  715.       "MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16",
  716.       GL_LUMINANCE_ALPHA,
  717.       GL_FLOAT,
  718.       0, 0, 0, 16,
  719.       16, 0, 0, 0, 0,
  720.       1, 1, 4
  721.    },
  722.    {
  723.       MESA_FORMAT_INTENSITY_FLOAT32,
  724.       "MESA_FORMAT_INTENSITY_FLOAT32",
  725.       GL_INTENSITY,
  726.       GL_FLOAT,
  727.       0, 0, 0, 0,
  728.       0, 32, 0, 0, 0,
  729.       1, 1, 4
  730.    },
  731.    {
  732.       MESA_FORMAT_INTENSITY_FLOAT16,
  733.       "MESA_FORMAT_INTENSITY_FLOAT16",
  734.       GL_INTENSITY,
  735.       GL_FLOAT,
  736.       0, 0, 0, 0,
  737.       0, 16, 0, 0, 0,
  738.       1, 1, 2
  739.    },
  740.    {
  741.       MESA_FORMAT_R_FLOAT32,
  742.       "MESA_FORMAT_R_FLOAT32",
  743.       GL_RED,
  744.       GL_FLOAT,
  745.       32, 0, 0, 0,
  746.       0, 0, 0, 0, 0,
  747.       1, 1, 4
  748.    },
  749.    {
  750.       MESA_FORMAT_R_FLOAT16,
  751.       "MESA_FORMAT_R_FLOAT16",
  752.       GL_RED,
  753.       GL_FLOAT,
  754.       16, 0, 0, 0,
  755.       0, 0, 0, 0, 0,
  756.       1, 1, 2
  757.    },
  758.    {
  759.       MESA_FORMAT_RG_FLOAT32,
  760.       "MESA_FORMAT_RG_FLOAT32",
  761.       GL_RG,
  762.       GL_FLOAT,
  763.       32, 32, 0, 0,
  764.       0, 0, 0, 0, 0,
  765.       1, 1, 8
  766.    },
  767.    {
  768.       MESA_FORMAT_RG_FLOAT16,
  769.       "MESA_FORMAT_RG_FLOAT16",
  770.       GL_RG,
  771.       GL_FLOAT,
  772.       16, 16, 0, 0,
  773.       0, 0, 0, 0, 0,
  774.       1, 1, 4
  775.    },
  776.  
  777.    /* unnormalized signed int formats */
  778.    /* unnormalized unsigned int formats */
  779.    {
  780.       MESA_FORMAT_ALPHA_UINT8,
  781.       "MESA_FORMAT_ALPHA_UINT8",
  782.       GL_ALPHA,
  783.       GL_UNSIGNED_INT,
  784.       0, 0, 0, 8,
  785.       0, 0, 0, 0, 0,
  786.       1, 1, 1
  787.    },
  788.    {
  789.       MESA_FORMAT_ALPHA_UINT16,
  790.       "MESA_FORMAT_ALPHA_UINT16",
  791.       GL_ALPHA,
  792.       GL_UNSIGNED_INT,
  793.       0, 0, 0, 16,
  794.       0, 0, 0, 0, 0,
  795.       1, 1, 2
  796.    },
  797.    {
  798.       MESA_FORMAT_ALPHA_UINT32,
  799.       "MESA_FORMAT_ALPHA_UINT32",
  800.       GL_ALPHA,
  801.       GL_UNSIGNED_INT,
  802.       0, 0, 0, 32,
  803.       0, 0, 0, 0, 0,
  804.       1, 1, 4
  805.    },
  806.    {
  807.       MESA_FORMAT_ALPHA_INT8,
  808.       "MESA_FORMAT_ALPHA_INT8",
  809.       GL_ALPHA,
  810.       GL_INT,
  811.       0, 0, 0, 8,
  812.       0, 0, 0, 0, 0,
  813.       1, 1, 1
  814.    },
  815.    {
  816.       MESA_FORMAT_ALPHA_INT16,
  817.       "MESA_FORMAT_ALPHA_INT16",
  818.       GL_ALPHA,
  819.       GL_INT,
  820.       0, 0, 0, 16,
  821.       0, 0, 0, 0, 0,
  822.       1, 1, 2
  823.    },
  824.    {
  825.       MESA_FORMAT_ALPHA_INT32,
  826.       "MESA_FORMAT_ALPHA_INT32",
  827.       GL_ALPHA,
  828.       GL_INT,
  829.       0, 0, 0, 32,
  830.       0, 0, 0, 0, 0,
  831.       1, 1, 4
  832.    },
  833.    {
  834.       MESA_FORMAT_INTENSITY_UINT8,
  835.       "MESA_FORMAT_INTENSITY_UINT8",
  836.       GL_INTENSITY,
  837.       GL_UNSIGNED_INT,
  838.       0, 0, 0, 0,
  839.       0, 8, 0, 0, 0,
  840.       1, 1, 1
  841.    },
  842.    {
  843.       MESA_FORMAT_INTENSITY_UINT16,
  844.       "MESA_FORMAT_INTENSITY_UINT16",
  845.       GL_INTENSITY,
  846.       GL_UNSIGNED_INT,
  847.       0, 0, 0, 0,
  848.       0, 16, 0, 0, 0,
  849.       1, 1, 2
  850.    },
  851.    {
  852.       MESA_FORMAT_INTENSITY_UINT32,
  853.       "MESA_FORMAT_INTENSITY_UINT32",
  854.       GL_INTENSITY,
  855.       GL_UNSIGNED_INT,
  856.       0, 0, 0, 0,
  857.       0, 32, 0, 0, 0,
  858.       1, 1, 4
  859.    },
  860.    {
  861.       MESA_FORMAT_INTENSITY_INT8,
  862.       "MESA_FORMAT_INTENSITY_INT8",
  863.       GL_INTENSITY,
  864.       GL_INT,
  865.       0, 0, 0, 0,
  866.       0, 8, 0, 0, 0,
  867.       1, 1, 1
  868.    },
  869.    {
  870.       MESA_FORMAT_INTENSITY_INT16,
  871.       "MESA_FORMAT_INTENSITY_INT16",
  872.       GL_INTENSITY,
  873.       GL_INT,
  874.       0, 0, 0, 0,
  875.       0, 16, 0, 0, 0,
  876.       1, 1, 2
  877.    },
  878.    {
  879.       MESA_FORMAT_INTENSITY_INT32,
  880.       "MESA_FORMAT_INTENSITY_INT32",
  881.       GL_INTENSITY,
  882.       GL_INT,
  883.       0, 0, 0, 0,
  884.       0, 32, 0, 0, 0,
  885.       1, 1, 4
  886.    },
  887.    {
  888.       MESA_FORMAT_LUMINANCE_UINT8,
  889.       "MESA_FORMAT_LUMINANCE_UINT8",
  890.       GL_LUMINANCE,
  891.       GL_UNSIGNED_INT,
  892.       0, 0, 0, 0,
  893.       8, 0, 0, 0, 0,
  894.       1, 1, 1
  895.    },
  896.    {
  897.       MESA_FORMAT_LUMINANCE_UINT16,
  898.       "MESA_FORMAT_LUMINANCE_UINT16",
  899.       GL_LUMINANCE,
  900.       GL_UNSIGNED_INT,
  901.       0, 0, 0, 0,
  902.       16, 0, 0, 0, 0,
  903.       1, 1, 2
  904.    },
  905.    {
  906.       MESA_FORMAT_LUMINANCE_UINT32,
  907.       "MESA_FORMAT_LUMINANCE_UINT32",
  908.       GL_LUMINANCE,
  909.       GL_UNSIGNED_INT,
  910.       0, 0, 0, 0,
  911.       32, 0, 0, 0, 0,
  912.       1, 1, 4
  913.    },
  914.    {
  915.       MESA_FORMAT_LUMINANCE_INT8,
  916.       "MESA_FORMAT_LUMINANCE_INT8",
  917.       GL_LUMINANCE,
  918.       GL_INT,
  919.       0, 0, 0, 0,
  920.       8, 0, 0, 0, 0,
  921.       1, 1, 1
  922.    },
  923.    {
  924.       MESA_FORMAT_LUMINANCE_INT16,
  925.       "MESA_FORMAT_LUMINANCE_INT16",
  926.       GL_LUMINANCE,
  927.       GL_INT,
  928.       0, 0, 0, 0,
  929.       16, 0, 0, 0, 0,
  930.       1, 1, 2
  931.    },
  932.    {
  933.       MESA_FORMAT_LUMINANCE_INT32,
  934.       "MESA_FORMAT_LUMINANCE_INT32",
  935.       GL_LUMINANCE,
  936.       GL_INT,
  937.       0, 0, 0, 0,
  938.       32, 0, 0, 0, 0,
  939.       1, 1, 4
  940.    },
  941.    {
  942.       MESA_FORMAT_LUMINANCE_ALPHA_UINT8,
  943.       "MESA_FORMAT_LUMINANCE_ALPHA_UINT8",
  944.       GL_LUMINANCE_ALPHA,
  945.       GL_UNSIGNED_INT,
  946.       0, 0, 0, 8,
  947.       8, 0, 0, 0, 0,
  948.       1, 1, 2
  949.    },
  950.    {
  951.       MESA_FORMAT_LUMINANCE_ALPHA_UINT16,
  952.       "MESA_FORMAT_LUMINANCE_ALPHA_UINT16",
  953.       GL_LUMINANCE_ALPHA,
  954.       GL_UNSIGNED_INT,
  955.       0, 0, 0, 16,
  956.       16, 0, 0, 0, 0,
  957.       1, 1, 4
  958.    },
  959.    {
  960.       MESA_FORMAT_LUMINANCE_ALPHA_UINT32,
  961.       "MESA_FORMAT_LUMINANCE_ALPHA_UINT32",
  962.       GL_LUMINANCE_ALPHA,
  963.       GL_UNSIGNED_INT,
  964.       0, 0, 0, 32,
  965.       32, 0, 0, 0, 0,
  966.       1, 1, 8
  967.    },
  968.    {
  969.       MESA_FORMAT_LUMINANCE_ALPHA_INT8,
  970.       "MESA_FORMAT_LUMINANCE_ALPHA_INT8",
  971.       GL_LUMINANCE_ALPHA,
  972.       GL_INT,
  973.       0, 0, 0, 8,
  974.       8, 0, 0, 0, 0,
  975.       1, 1, 2
  976.    },
  977.    {
  978.       MESA_FORMAT_LUMINANCE_ALPHA_INT16,
  979.       "MESA_FORMAT_LUMINANCE_ALPHA_INT16",
  980.       GL_LUMINANCE_ALPHA,
  981.       GL_INT,
  982.       0, 0, 0, 16,
  983.       16, 0, 0, 0, 0,
  984.       1, 1, 4
  985.    },
  986.    {
  987.       MESA_FORMAT_LUMINANCE_ALPHA_INT32,
  988.       "MESA_FORMAT_LUMINANCE_ALPHA_INT32",
  989.       GL_LUMINANCE_ALPHA,
  990.       GL_INT,
  991.       0, 0, 0, 32,
  992.       32, 0, 0, 0, 0,
  993.       1, 1, 8
  994.    },
  995.  
  996.    {
  997.       MESA_FORMAT_R_INT8,
  998.       "MESA_FORMAT_R_INT8",
  999.       GL_RED,
  1000.       GL_INT,
  1001.       8, 0, 0, 0,
  1002.       0, 0, 0, 0, 0,
  1003.       1, 1, 1
  1004.    },
  1005.    {
  1006.       MESA_FORMAT_RG_INT8,
  1007.       "MESA_FORMAT_RG_INT8",
  1008.       GL_RG,
  1009.       GL_INT,
  1010.       8, 8, 0, 0,
  1011.       0, 0, 0, 0, 0,
  1012.       1, 1, 2
  1013.    },
  1014.    {
  1015.       MESA_FORMAT_RGB_INT8,
  1016.       "MESA_FORMAT_RGB_INT8",
  1017.       GL_RGB,
  1018.       GL_INT,
  1019.       8, 8, 8, 0,
  1020.       0, 0, 0, 0, 0,
  1021.       1, 1, 3
  1022.    },
  1023.    {
  1024.       MESA_FORMAT_RGBA_INT8,
  1025.       "MESA_FORMAT_RGBA_INT8",
  1026.       GL_RGBA,
  1027.       GL_INT,
  1028.       8, 8, 8, 8,
  1029.       0, 0, 0, 0, 0,
  1030.       1, 1, 4
  1031.    },
  1032.    {
  1033.       MESA_FORMAT_R_INT16,
  1034.       "MESA_FORMAT_R_INT16",
  1035.       GL_RED,
  1036.       GL_INT,
  1037.       16, 0, 0, 0,
  1038.       0, 0, 0, 0, 0,
  1039.       1, 1, 2
  1040.    },
  1041.    {
  1042.       MESA_FORMAT_RG_INT16,
  1043.       "MESA_FORMAT_RG_INT16",
  1044.       GL_RG,
  1045.       GL_INT,
  1046.       16, 16, 0, 0,
  1047.       0, 0, 0, 0, 0,
  1048.       1, 1, 4
  1049.    },
  1050.    {
  1051.       MESA_FORMAT_RGB_INT16,
  1052.       "MESA_FORMAT_RGB_INT16",
  1053.       GL_RGB,
  1054.       GL_INT,
  1055.       16, 16, 16, 0,
  1056.       0, 0, 0, 0, 0,
  1057.       1, 1, 6
  1058.    },
  1059.    {
  1060.       MESA_FORMAT_RGBA_INT16,
  1061.       "MESA_FORMAT_RGBA_INT16",
  1062.       GL_RGBA,
  1063.       GL_INT,
  1064.       16, 16, 16, 16,
  1065.       0, 0, 0, 0, 0,
  1066.       1, 1, 8
  1067.    },
  1068.    {
  1069.       MESA_FORMAT_R_INT32,
  1070.       "MESA_FORMAT_R_INT32",
  1071.       GL_RED,
  1072.       GL_INT,
  1073.       32, 0, 0, 0,
  1074.       0, 0, 0, 0, 0,
  1075.       1, 1, 4
  1076.    },
  1077.    {
  1078.       MESA_FORMAT_RG_INT32,
  1079.       "MESA_FORMAT_RG_INT32",
  1080.       GL_RG,
  1081.       GL_INT,
  1082.       32, 32, 0, 0,
  1083.       0, 0, 0, 0, 0,
  1084.       1, 1, 8
  1085.    },
  1086.    {
  1087.       MESA_FORMAT_RGB_INT32,
  1088.       "MESA_FORMAT_RGB_INT32",
  1089.       GL_RGB,
  1090.       GL_INT,
  1091.       32, 32, 32, 0,
  1092.       0, 0, 0, 0, 0,
  1093.       1, 1, 12
  1094.    },
  1095.    {
  1096.       MESA_FORMAT_RGBA_INT32,
  1097.       "MESA_FORMAT_RGBA_INT32",
  1098.       GL_RGBA,
  1099.       GL_INT,
  1100.       32, 32, 32, 32,
  1101.       0, 0, 0, 0, 0,
  1102.       1, 1, 16
  1103.    },
  1104.    {
  1105.       MESA_FORMAT_R_UINT8,
  1106.       "MESA_FORMAT_R_UINT8",
  1107.       GL_RED,
  1108.       GL_UNSIGNED_INT,
  1109.       8, 0, 0, 0,
  1110.       0, 0, 0, 0, 0,
  1111.       1, 1, 1
  1112.    },
  1113.    {
  1114.       MESA_FORMAT_RG_UINT8,
  1115.       "MESA_FORMAT_RG_UINT8",
  1116.       GL_RG,
  1117.       GL_UNSIGNED_INT,
  1118.       8, 8, 0, 0,
  1119.       0, 0, 0, 0, 0,
  1120.       1, 1, 2
  1121.    },
  1122.    {
  1123.       MESA_FORMAT_RGB_UINT8,
  1124.       "MESA_FORMAT_RGB_UINT8",
  1125.       GL_RGB,
  1126.       GL_UNSIGNED_INT,
  1127.       8, 8, 8, 0,
  1128.       0, 0, 0, 0, 0,
  1129.       1, 1, 3
  1130.    },
  1131.    {
  1132.       MESA_FORMAT_RGBA_UINT8,
  1133.       "MESA_FORMAT_RGBA_UINT8",
  1134.       GL_RGBA,
  1135.       GL_UNSIGNED_INT,
  1136.       8, 8, 8, 8,
  1137.       0, 0, 0, 0, 0,
  1138.       1, 1, 4
  1139.    },
  1140.    {
  1141.       MESA_FORMAT_R_UINT16,
  1142.       "MESA_FORMAT_R_UINT16",
  1143.       GL_RED,
  1144.       GL_UNSIGNED_INT,
  1145.       16, 0, 0, 0,
  1146.       0, 0, 0, 0, 0,
  1147.       1, 1, 2
  1148.    },
  1149.    {
  1150.       MESA_FORMAT_RG_UINT16,
  1151.       "MESA_FORMAT_RG_UINT16",
  1152.       GL_RG,
  1153.       GL_UNSIGNED_INT,
  1154.       16, 16, 0, 0,
  1155.       0, 0, 0, 0, 0,
  1156.       1, 1, 4
  1157.    },
  1158.    {
  1159.       MESA_FORMAT_RGB_UINT16,
  1160.       "MESA_FORMAT_RGB_UINT16",
  1161.       GL_RGB,
  1162.       GL_UNSIGNED_INT,
  1163.       16, 16, 16, 0,
  1164.       0, 0, 0, 0, 0,
  1165.       1, 1, 6
  1166.    },
  1167.    {
  1168.       MESA_FORMAT_RGBA_UINT16,
  1169.       "MESA_FORMAT_RGBA_UINT16",
  1170.       GL_RGBA,
  1171.       GL_UNSIGNED_INT,
  1172.       16, 16, 16, 16,
  1173.       0, 0, 0, 0, 0,
  1174.       1, 1, 8
  1175.    },
  1176.    {
  1177.       MESA_FORMAT_R_UINT32,
  1178.       "MESA_FORMAT_R_UINT32",
  1179.       GL_RED,
  1180.       GL_UNSIGNED_INT,
  1181.       32, 0, 0, 0,
  1182.       0, 0, 0, 0, 0,
  1183.       1, 1, 4
  1184.    },
  1185.    {
  1186.       MESA_FORMAT_RG_UINT32,
  1187.       "MESA_FORMAT_RG_UINT32",
  1188.       GL_RG,
  1189.       GL_UNSIGNED_INT,
  1190.       32, 32, 0, 0,
  1191.       0, 0, 0, 0, 0,
  1192.       1, 1, 8
  1193.    },
  1194.    {
  1195.       MESA_FORMAT_RGB_UINT32,
  1196.       "MESA_FORMAT_RGB_UINT32",
  1197.       GL_RGB,
  1198.       GL_UNSIGNED_INT,
  1199.       32, 32, 32, 0,
  1200.       0, 0, 0, 0, 0,
  1201.       1, 1, 12
  1202.    },
  1203.    {
  1204.       MESA_FORMAT_RGBA_UINT32,
  1205.       "MESA_FORMAT_RGBA_UINT32",
  1206.       GL_RGBA,
  1207.       GL_UNSIGNED_INT,
  1208.       32, 32, 32, 32,
  1209.       0, 0, 0, 0, 0,
  1210.       1, 1, 16
  1211.    },
  1212.  
  1213.  
  1214.    {
  1215.       MESA_FORMAT_DUDV8,
  1216.       "MESA_FORMAT_DUDV8",
  1217.       GL_DUDV_ATI,
  1218.       GL_SIGNED_NORMALIZED,
  1219.       0, 0, 0, 0,
  1220.       0, 0, 0, 0, 0,
  1221.       1, 1, 2
  1222.    },
  1223.  
  1224.    /* Signed 8 bits / channel */
  1225.    {
  1226.       MESA_FORMAT_SIGNED_R8,        /* Name */
  1227.       "MESA_FORMAT_SIGNED_R8",      /* StrName */
  1228.       GL_RED,                       /* BaseFormat */
  1229.       GL_SIGNED_NORMALIZED,         /* DataType */
  1230.       8, 0, 0, 0,                   /* Red/Green/Blue/AlphaBits */
  1231.       0, 0, 0, 0, 0,                /* Lum/Int/Index/Depth/StencilBits */
  1232.       1, 1, 1                       /* BlockWidth/Height,Bytes */
  1233.    },
  1234.    {
  1235.       MESA_FORMAT_SIGNED_RG88_REV,
  1236.       "MESA_FORMAT_SIGNED_RG88_REV",
  1237.       GL_RG,
  1238.       GL_SIGNED_NORMALIZED,
  1239.       8, 8, 0, 0,
  1240.       0, 0, 0, 0, 0,
  1241.       1, 1, 2
  1242.    },
  1243.    {
  1244.       MESA_FORMAT_SIGNED_RGBX8888,
  1245.       "MESA_FORMAT_SIGNED_RGBX8888",
  1246.       GL_RGB,
  1247.       GL_SIGNED_NORMALIZED,
  1248.       8, 8, 8, 0,
  1249.       0, 0, 0, 0, 0,
  1250.       1, 1, 4                       /* 4 bpp, but no alpha */
  1251.    },
  1252.    {
  1253.       MESA_FORMAT_SIGNED_RGBA8888,
  1254.       "MESA_FORMAT_SIGNED_RGBA8888",
  1255.       GL_RGBA,
  1256.       GL_SIGNED_NORMALIZED,
  1257.       8, 8, 8, 8,
  1258.       0, 0, 0, 0, 0,
  1259.       1, 1, 4
  1260.    },
  1261.    {
  1262.       MESA_FORMAT_SIGNED_RGBA8888_REV,
  1263.       "MESA_FORMAT_SIGNED_RGBA8888_REV",
  1264.       GL_RGBA,
  1265.       GL_SIGNED_NORMALIZED,
  1266.       8, 8, 8, 8,
  1267.       0, 0, 0, 0, 0,
  1268.       1, 1, 4
  1269.    },
  1270.  
  1271.    /* Signed 16 bits / channel */
  1272.    {
  1273.       MESA_FORMAT_SIGNED_R16,
  1274.       "MESA_FORMAT_SIGNED_R16",
  1275.       GL_RED,
  1276.       GL_SIGNED_NORMALIZED,
  1277.       16, 0, 0, 0,
  1278.       0, 0, 0, 0, 0,
  1279.       1, 1, 2
  1280.    },
  1281.    {
  1282.       MESA_FORMAT_SIGNED_GR1616,
  1283.       "MESA_FORMAT_SIGNED_GR1616",
  1284.       GL_RG,
  1285.       GL_SIGNED_NORMALIZED,
  1286.       16, 16, 0, 0,
  1287.       0, 0, 0, 0, 0,
  1288.       1, 1, 4
  1289.    },
  1290.    {
  1291.       MESA_FORMAT_SIGNED_RGB_16,
  1292.       "MESA_FORMAT_SIGNED_RGB_16",
  1293.       GL_RGB,
  1294.       GL_SIGNED_NORMALIZED,
  1295.       16, 16, 16, 0,
  1296.       0, 0, 0, 0, 0,
  1297.       1, 1, 6
  1298.    },
  1299.    {
  1300.       MESA_FORMAT_SIGNED_RGBA_16,
  1301.       "MESA_FORMAT_SIGNED_RGBA_16",
  1302.       GL_RGBA,
  1303.       GL_SIGNED_NORMALIZED,
  1304.       16, 16, 16, 16,
  1305.       0, 0, 0, 0, 0,
  1306.       1, 1, 8
  1307.    },
  1308.    {
  1309.       MESA_FORMAT_RGBA_16,
  1310.       "MESA_FORMAT_RGBA_16",
  1311.       GL_RGBA,
  1312.       GL_UNSIGNED_NORMALIZED,
  1313.       16, 16, 16, 16,
  1314.       0, 0, 0, 0, 0,
  1315.       1, 1, 8
  1316.    },
  1317.    {
  1318.      MESA_FORMAT_RED_RGTC1,
  1319.      "MESA_FORMAT_RED_RGTC1",
  1320.      GL_RED,
  1321.      GL_UNSIGNED_NORMALIZED,
  1322.      8, 0, 0, 0,
  1323.      0, 0, 0, 0, 0,
  1324.      4, 4, 8                     /* 8 bytes per 4x4 block */
  1325.    },
  1326.    {
  1327.      MESA_FORMAT_SIGNED_RED_RGTC1,
  1328.      "MESA_FORMAT_SIGNED_RED_RGTC1",
  1329.      GL_RED,
  1330.      GL_SIGNED_NORMALIZED,
  1331.      8, 0, 0, 0,
  1332.      0, 0, 0, 0, 0,
  1333.      4, 4, 8                     /* 8 bytes per 4x4 block */
  1334.    },
  1335.    {
  1336.      MESA_FORMAT_RG_RGTC2,
  1337.      "MESA_FORMAT_RG_RGTC2",
  1338.      GL_RG,
  1339.      GL_UNSIGNED_NORMALIZED,
  1340.      8, 8, 0, 0,
  1341.      0, 0, 0, 0, 0,
  1342.      4, 4, 16                     /* 16 bytes per 4x4 block */
  1343.    },
  1344.    {
  1345.      MESA_FORMAT_SIGNED_RG_RGTC2,
  1346.      "MESA_FORMAT_SIGNED_RG_RGTC2",
  1347.      GL_RG,
  1348.      GL_SIGNED_NORMALIZED,
  1349.      8, 8, 0, 0,
  1350.      0, 0, 0, 0, 0,
  1351.      4, 4, 16                     /* 16 bytes per 4x4 block */
  1352.    },
  1353.    {
  1354.      MESA_FORMAT_L_LATC1,
  1355.      "MESA_FORMAT_L_LATC1",
  1356.      GL_LUMINANCE,
  1357.      GL_UNSIGNED_NORMALIZED,
  1358.      0, 0, 0, 0,
  1359.      4, 0, 0, 0, 0,
  1360.      4, 4, 8                     /* 8 bytes per 4x4 block */
  1361.    },
  1362.    {
  1363.      MESA_FORMAT_SIGNED_L_LATC1,
  1364.      "MESA_FORMAT_SIGNED_L_LATC1",
  1365.      GL_LUMINANCE,
  1366.      GL_SIGNED_NORMALIZED,
  1367.      0, 0, 0, 0,
  1368.      4, 0, 0, 0, 0,
  1369.      4, 4, 8                     /* 8 bytes per 4x4 block */
  1370.    },
  1371.    {
  1372.      MESA_FORMAT_LA_LATC2,
  1373.      "MESA_FORMAT_LA_LATC2",
  1374.      GL_LUMINANCE_ALPHA,
  1375.      GL_UNSIGNED_NORMALIZED,
  1376.      0, 0, 0, 4,
  1377.      4, 0, 0, 0, 0,
  1378.      4, 4, 16                     /* 16 bytes per 4x4 block */
  1379.    },
  1380.    {
  1381.      MESA_FORMAT_SIGNED_LA_LATC2,
  1382.      "MESA_FORMAT_SIGNED_LA_LATC2",
  1383.      GL_LUMINANCE_ALPHA,
  1384.      GL_SIGNED_NORMALIZED,
  1385.      0, 0, 0, 4,
  1386.      4, 0, 0, 0, 0,
  1387.      4, 4, 16                     /* 16 bytes per 4x4 block */
  1388.    },
  1389.  
  1390.    {
  1391.       MESA_FORMAT_ETC1_RGB8,
  1392.       "MESA_FORMAT_ETC1_RGB8",
  1393.       GL_RGB,
  1394.       GL_UNSIGNED_NORMALIZED,
  1395.       8, 8, 8, 0,
  1396.       0, 0, 0, 0, 0,
  1397.       4, 4, 8                     /* 8 bytes per 4x4 block */
  1398.    },
  1399.  
  1400.    {
  1401.       MESA_FORMAT_ETC2_RGB8,
  1402.       "MESA_FORMAT_ETC2_RGB8",
  1403.       GL_RGB,
  1404.       GL_UNSIGNED_NORMALIZED,
  1405.       8, 8, 8, 0,
  1406.       0, 0, 0, 0, 0,
  1407.       4, 4, 8                     /* 8 bytes per 4x4 block */
  1408.    },
  1409.  
  1410.    {
  1411.       MESA_FORMAT_ETC2_SRGB8,
  1412.       "MESA_FORMAT_ETC2_SRGB8",
  1413.       GL_RGB,
  1414.       GL_UNSIGNED_NORMALIZED,
  1415.       8, 8, 8, 0,
  1416.       0, 0, 0, 0, 0,
  1417.       4, 4, 8                     /* 8 bytes per 4x4 block */
  1418.    },
  1419.  
  1420.    {
  1421.       MESA_FORMAT_ETC2_RGBA8_EAC,
  1422.       "MESA_FORMAT_ETC2_RGBA8_EAC",
  1423.       GL_RGBA,
  1424.       GL_UNSIGNED_NORMALIZED,
  1425.       8, 8, 8, 8,
  1426.       0, 0, 0, 0, 0,
  1427.       4, 4, 16                    /* 16 bytes per 4x4 block */
  1428.    },
  1429.  
  1430.    {
  1431.       MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC,
  1432.       "MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC",
  1433.       GL_RGBA,
  1434.       GL_UNSIGNED_NORMALIZED,
  1435.       8, 8, 8, 8,
  1436.       0, 0, 0, 0, 0,
  1437.       4, 4, 16                    /* 16 bytes per 4x4 block */
  1438.    },
  1439.  
  1440.    {
  1441.       MESA_FORMAT_ETC2_R11_EAC,
  1442.       "MESA_FORMAT_ETC2_R11_EAC",
  1443.       GL_RED,
  1444.       GL_UNSIGNED_NORMALIZED,
  1445.       11, 0, 0, 0,
  1446.       0, 0, 0, 0, 0,
  1447.       4, 4, 8                    /* 8 bytes per 4x4 block */
  1448.    },
  1449.  
  1450.    {
  1451.       MESA_FORMAT_ETC2_RG11_EAC,
  1452.       "MESA_FORMAT_ETC2_RG11_EAC",
  1453.       GL_RG,
  1454.       GL_UNSIGNED_NORMALIZED,
  1455.       11, 11, 0, 0,
  1456.       0, 0, 0, 0, 0,
  1457.       4, 4, 16                    /* 16 bytes per 4x4 block */
  1458.    },
  1459.  
  1460.    {
  1461.       MESA_FORMAT_ETC2_SIGNED_R11_EAC,
  1462.       "MESA_FORMAT_ETC2_SIGNED_R11_EAC",
  1463.       GL_RED,
  1464.       GL_SIGNED_NORMALIZED,
  1465.       11, 0, 0, 0,
  1466.       0, 0, 0, 0, 0,
  1467.       4, 4, 8                    /* 8 bytes per 4x4 block */
  1468.    },
  1469.  
  1470.    {
  1471.       MESA_FORMAT_ETC2_SIGNED_RG11_EAC,
  1472.       "MESA_FORMAT_ETC2_SIGNED_RG11_EAC",
  1473.       GL_RG,
  1474.       GL_SIGNED_NORMALIZED,
  1475.       11, 11, 0, 0,
  1476.       0, 0, 0, 0, 0,
  1477.       4, 4, 16                    /* 16 bytes per 4x4 block */
  1478.    },
  1479.  
  1480.    {
  1481.       MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1,
  1482.       "MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1",
  1483.       GL_RGBA,
  1484.       GL_UNSIGNED_NORMALIZED,
  1485.       8, 8, 8, 1,
  1486.       0, 0, 0, 0, 0,
  1487.       4, 4, 8                     /* 8 bytes per 4x4 block */
  1488.    },
  1489.  
  1490.    {
  1491.       MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1,
  1492.       "MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1",
  1493.       GL_RGBA,
  1494.       GL_UNSIGNED_NORMALIZED,
  1495.       8, 8, 8, 1,
  1496.       0, 0, 0, 0, 0,
  1497.       4, 4, 8                     /* 8 bytes per 4x4 block */
  1498.    },
  1499.  
  1500.    /* Signed formats from EXT_texture_snorm that are not in GL3.1 */
  1501.    {
  1502.       MESA_FORMAT_SIGNED_A8,
  1503.       "MESA_FORMAT_SIGNED_A8",
  1504.       GL_ALPHA,
  1505.       GL_SIGNED_NORMALIZED,
  1506.       0, 0, 0, 8,
  1507.       0, 0, 0, 0, 0,
  1508.       1, 1, 1
  1509.    },
  1510.    {
  1511.       MESA_FORMAT_SIGNED_L8,
  1512.       "MESA_FORMAT_SIGNED_L8",
  1513.       GL_LUMINANCE,
  1514.       GL_SIGNED_NORMALIZED,
  1515.       0, 0, 0, 0,
  1516.       8, 0, 0, 0, 0,
  1517.       1, 1, 1
  1518.    },
  1519.    {
  1520.       MESA_FORMAT_SIGNED_AL88,
  1521.       "MESA_FORMAT_SIGNED_AL88",
  1522.       GL_LUMINANCE_ALPHA,
  1523.       GL_SIGNED_NORMALIZED,
  1524.       0, 0, 0, 8,
  1525.       8, 0, 0, 0, 0,
  1526.       1, 1, 2
  1527.    },
  1528.    {
  1529.       MESA_FORMAT_SIGNED_I8,
  1530.       "MESA_FORMAT_SIGNED_I8",
  1531.       GL_INTENSITY,
  1532.       GL_SIGNED_NORMALIZED,
  1533.       0, 0, 0, 0,
  1534.       0, 8, 0, 0, 0,
  1535.       1, 1, 1
  1536.    },
  1537.    {
  1538.       MESA_FORMAT_SIGNED_A16,
  1539.       "MESA_FORMAT_SIGNED_A16",
  1540.       GL_ALPHA,
  1541.       GL_SIGNED_NORMALIZED,
  1542.       0, 0, 0, 16,
  1543.       0, 0, 0, 0, 0,
  1544.       1, 1, 2
  1545.    },
  1546.    {
  1547.       MESA_FORMAT_SIGNED_L16,
  1548.       "MESA_FORMAT_SIGNED_L16",
  1549.       GL_LUMINANCE,
  1550.       GL_SIGNED_NORMALIZED,
  1551.       0, 0, 0, 0,
  1552.       16, 0, 0, 0, 0,
  1553.       1, 1, 2
  1554.    },
  1555.    {
  1556.       MESA_FORMAT_SIGNED_AL1616,
  1557.       "MESA_FORMAT_SIGNED_AL1616",
  1558.       GL_LUMINANCE_ALPHA,
  1559.       GL_SIGNED_NORMALIZED,
  1560.       0, 0, 0, 16,
  1561.       16, 0, 0, 0, 0,
  1562.       1, 1, 4
  1563.    },
  1564.    {
  1565.       MESA_FORMAT_SIGNED_I16,
  1566.       "MESA_FORMAT_SIGNED_I16",
  1567.       GL_INTENSITY,
  1568.       GL_SIGNED_NORMALIZED,
  1569.       0, 0, 0, 0,
  1570.       0, 16, 0, 0, 0,
  1571.       1, 1, 2
  1572.    },
  1573.    {
  1574.       MESA_FORMAT_RGB9_E5_FLOAT,
  1575.       "MESA_FORMAT_RGB9_E5",
  1576.       GL_RGB,
  1577.       GL_FLOAT,
  1578.       9, 9, 9, 0,
  1579.       0, 0, 0, 0, 0,
  1580.       1, 1, 4
  1581.    },
  1582.    {
  1583.       MESA_FORMAT_R11_G11_B10_FLOAT,
  1584.       "MESA_FORMAT_R11_G11_B10_FLOAT",
  1585.       GL_RGB,
  1586.       GL_FLOAT,
  1587.       11, 11, 10, 0,
  1588.       0, 0, 0, 0, 0,
  1589.       1, 1, 4
  1590.    },
  1591.    /* ARB_depth_buffer_float */
  1592.    {
  1593.       MESA_FORMAT_Z32_FLOAT,       /* Name */
  1594.       "MESA_FORMAT_Z32_FLOAT",     /* StrName */
  1595.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  1596.       GL_FLOAT,                    /* DataType */
  1597.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  1598.       0, 0, 0, 32, 0,              /* Lum/Int/Index/Depth/StencilBits */
  1599.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  1600.    },
  1601.    {
  1602.       MESA_FORMAT_Z32_FLOAT_X24S8, /* Name */
  1603.       "MESA_FORMAT_Z32_FLOAT_X24S8", /* StrName */
  1604.       GL_DEPTH_STENCIL,            /* BaseFormat */
  1605.       /* DataType here is used to answer GL_TEXTURE_DEPTH_TYPE queries, and is
  1606.        * never used for stencil because stencil is always GL_UNSIGNED_INT.
  1607.        */
  1608.       GL_FLOAT,                    /* DataType */
  1609.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  1610.       0, 0, 0, 32, 8,              /* Lum/Int/Index/Depth/StencilBits */
  1611.       1, 1, 8                      /* BlockWidth/Height,Bytes */
  1612.    },
  1613.    {
  1614.       MESA_FORMAT_ARGB2101010_UINT,
  1615.       "MESA_FORMAT_ARGB2101010_UINT",
  1616.       GL_RGBA,
  1617.       GL_UNSIGNED_INT,
  1618.       10, 10, 10, 2,
  1619.       0, 0, 0, 0, 0,
  1620.       1, 1, 4
  1621.    },
  1622.    {
  1623.       MESA_FORMAT_ABGR2101010_UINT,
  1624.       "MESA_FORMAT_ABGR2101010_UINT",
  1625.       GL_RGBA,
  1626.       GL_UNSIGNED_INT,
  1627.       10, 10, 10, 2,
  1628.       0, 0, 0, 0, 0,
  1629.       1, 1, 4
  1630.    },
  1631.    {
  1632.       MESA_FORMAT_XRGB4444_UNORM,
  1633.       "MESA_FORMAT_XRGB4444_UNORM",
  1634.       GL_RGB,
  1635.       GL_UNSIGNED_NORMALIZED,
  1636.       4, 4, 4, 0,
  1637.       0, 0, 0, 0, 0,
  1638.       1, 1, 2
  1639.    },
  1640.    {
  1641.       MESA_FORMAT_XRGB1555_UNORM,
  1642.       "MESA_FORMAT_XRGB1555_UNORM",
  1643.       GL_RGB,
  1644.       GL_UNSIGNED_NORMALIZED,
  1645.       5, 5, 5, 0,
  1646.       0, 0, 0, 0, 0,
  1647.       1, 1, 2
  1648.    },
  1649.    {
  1650.       MESA_FORMAT_XBGR8888_SNORM,
  1651.       "MESA_FORMAT_XBGR8888_SNORM",
  1652.       GL_RGB,
  1653.       GL_SIGNED_NORMALIZED,
  1654.       8, 8, 8, 0,
  1655.       0, 0, 0, 0, 0,
  1656.       1, 1, 4
  1657.    },
  1658.    {
  1659.       MESA_FORMAT_XBGR8888_SRGB,
  1660.       "MESA_FORMAT_XBGR8888_SRGB",
  1661.       GL_RGB,
  1662.       GL_UNSIGNED_NORMALIZED,
  1663.       8, 8, 8, 0,
  1664.       0, 0, 0, 0, 0,
  1665.       1, 1, 4
  1666.    },
  1667.    {
  1668.       MESA_FORMAT_XBGR8888_UINT,
  1669.       "MESA_FORMAT_XBGR8888_UINT",
  1670.       GL_RGB,
  1671.       GL_UNSIGNED_INT,
  1672.       8, 8, 8, 0,
  1673.       0, 0, 0, 0, 0,
  1674.       1, 1, 4
  1675.    },
  1676.    {
  1677.       MESA_FORMAT_XBGR8888_SINT,
  1678.       "MESA_FORMAT_XBGR8888_SINT",
  1679.       GL_RGB,
  1680.       GL_INT,
  1681.       8, 8, 8, 0,
  1682.       0, 0, 0, 0, 0,
  1683.       1, 1, 4
  1684.    },
  1685.    {
  1686.       MESA_FORMAT_XRGB2101010_UNORM,
  1687.       "MESA_FORMAT_XRGB2101010_UNORM",
  1688.       GL_RGB,
  1689.       GL_UNSIGNED_NORMALIZED,
  1690.       10, 10, 10, 0,
  1691.       0, 0, 0, 0, 0,
  1692.       1, 1, 4
  1693.    },
  1694.    {
  1695.       MESA_FORMAT_XBGR16161616_UNORM,
  1696.       "MESA_FORMAT_XBGR16161616_UNORM",
  1697.       GL_RGB,
  1698.       GL_UNSIGNED_NORMALIZED,
  1699.       16, 16, 16, 0,
  1700.       0, 0, 0, 0, 0,
  1701.       1, 1, 8
  1702.    },
  1703.    {
  1704.       MESA_FORMAT_XBGR16161616_SNORM,
  1705.       "MESA_FORMAT_XBGR16161616_SNORM",
  1706.       GL_RGB,
  1707.       GL_SIGNED_NORMALIZED,
  1708.       16, 16, 16, 0,
  1709.       0, 0, 0, 0, 0,
  1710.       1, 1, 8
  1711.    },
  1712.    {
  1713.       MESA_FORMAT_XBGR16161616_FLOAT,
  1714.       "MESA_FORMAT_XBGR16161616_FLOAT",
  1715.       GL_RGB,
  1716.       GL_FLOAT,
  1717.       16, 16, 16, 0,
  1718.       0, 0, 0, 0, 0,
  1719.       1, 1, 8
  1720.    },
  1721.    {
  1722.       MESA_FORMAT_XBGR16161616_UINT,
  1723.       "MESA_FORMAT_XBGR16161616_UINT",
  1724.       GL_RGB,
  1725.       GL_UNSIGNED_INT,
  1726.       16, 16, 16, 0,
  1727.       0, 0, 0, 0, 0,
  1728.       1, 1, 8
  1729.    },
  1730.    {
  1731.       MESA_FORMAT_XBGR16161616_SINT,
  1732.       "MESA_FORMAT_XBGR16161616_SINT",
  1733.       GL_RGB,
  1734.       GL_INT,
  1735.       16, 16, 16, 0,
  1736.       0, 0, 0, 0, 0,
  1737.       1, 1, 8
  1738.    },
  1739.    {
  1740.       MESA_FORMAT_XBGR32323232_FLOAT,
  1741.       "MESA_FORMAT_XBGR32323232_FLOAT",
  1742.       GL_RGB,
  1743.       GL_FLOAT,
  1744.       32, 32, 32, 0,
  1745.       0, 0, 0, 0, 0,
  1746.       1, 1, 16
  1747.    },
  1748.    {
  1749.       MESA_FORMAT_XBGR32323232_UINT,
  1750.       "MESA_FORMAT_XBGR32323232_UINT",
  1751.       GL_RGB,
  1752.       GL_UNSIGNED_INT,
  1753.       32, 32, 32, 0,
  1754.       0, 0, 0, 0, 0,
  1755.       1, 1, 16
  1756.    },
  1757.    {
  1758.       MESA_FORMAT_XBGR32323232_SINT,
  1759.       "MESA_FORMAT_XBGR32323232_SINT",
  1760.       GL_RGB,
  1761.       GL_INT,
  1762.       32, 32, 32, 0,
  1763.       0, 0, 0, 0, 0,
  1764.       1, 1, 16
  1765.    },
  1766. };
  1767.  
  1768.  
  1769.  
  1770. static const struct gl_format_info *
  1771. _mesa_get_format_info(gl_format format)
  1772. {
  1773.    const struct gl_format_info *info = &format_info[format];
  1774.    assert(info->Name == format);
  1775.    return info;
  1776. }
  1777.  
  1778.  
  1779. /** Return string name of format (for debugging) */
  1780. const char *
  1781. _mesa_get_format_name(gl_format format)
  1782. {
  1783.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1784.    return info->StrName;
  1785. }
  1786.  
  1787.  
  1788.  
  1789. /**
  1790.  * Return bytes needed to store a block of pixels in the given format.
  1791.  * Normally, a block is 1x1 (a single pixel).  But for compressed formats
  1792.  * a block may be 4x4 or 8x4, etc.
  1793.  *
  1794.  * Note: not GLuint, so as not to coerce math to unsigned. cf. fdo #37351
  1795.  */
  1796. GLint
  1797. _mesa_get_format_bytes(gl_format format)
  1798. {
  1799.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1800.    ASSERT(info->BytesPerBlock);
  1801.    ASSERT(info->BytesPerBlock <= MAX_PIXEL_BYTES ||
  1802.           _mesa_is_format_compressed(format));
  1803.    return info->BytesPerBlock;
  1804. }
  1805.  
  1806.  
  1807. /**
  1808.  * Return bits per component for the given format.
  1809.  * \param format  one of MESA_FORMAT_x
  1810.  * \param pname  the component, such as GL_RED_BITS, GL_TEXTURE_BLUE_BITS, etc.
  1811.  */
  1812. GLint
  1813. _mesa_get_format_bits(gl_format format, GLenum pname)
  1814. {
  1815.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1816.  
  1817.    switch (pname) {
  1818.    case GL_RED_BITS:
  1819.    case GL_TEXTURE_RED_SIZE:
  1820.    case GL_RENDERBUFFER_RED_SIZE_EXT:
  1821.    case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
  1822.       return info->RedBits;
  1823.    case GL_GREEN_BITS:
  1824.    case GL_TEXTURE_GREEN_SIZE:
  1825.    case GL_RENDERBUFFER_GREEN_SIZE_EXT:
  1826.    case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
  1827.       return info->GreenBits;
  1828.    case GL_BLUE_BITS:
  1829.    case GL_TEXTURE_BLUE_SIZE:
  1830.    case GL_RENDERBUFFER_BLUE_SIZE_EXT:
  1831.    case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
  1832.       return info->BlueBits;
  1833.    case GL_ALPHA_BITS:
  1834.    case GL_TEXTURE_ALPHA_SIZE:
  1835.    case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
  1836.    case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
  1837.       return info->AlphaBits;
  1838.    case GL_TEXTURE_INTENSITY_SIZE:
  1839.       return info->IntensityBits;
  1840.    case GL_TEXTURE_LUMINANCE_SIZE:
  1841.       return info->LuminanceBits;
  1842.    case GL_INDEX_BITS:
  1843.       return info->IndexBits;
  1844.    case GL_DEPTH_BITS:
  1845.    case GL_TEXTURE_DEPTH_SIZE_ARB:
  1846.    case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
  1847.    case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
  1848.       return info->DepthBits;
  1849.    case GL_STENCIL_BITS:
  1850.    case GL_TEXTURE_STENCIL_SIZE_EXT:
  1851.    case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
  1852.    case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
  1853.       return info->StencilBits;
  1854.    default:
  1855.       _mesa_problem(NULL, "bad pname in _mesa_get_format_bits()");
  1856.       return 0;
  1857.    }
  1858. }
  1859.  
  1860.  
  1861. GLuint
  1862. _mesa_get_format_max_bits(gl_format format)
  1863. {
  1864.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1865.    GLuint max = MAX2(info->RedBits, info->GreenBits);
  1866.    max = MAX2(max, info->BlueBits);
  1867.    max = MAX2(max, info->AlphaBits);
  1868.    max = MAX2(max, info->LuminanceBits);
  1869.    max = MAX2(max, info->IntensityBits);
  1870.    max = MAX2(max, info->DepthBits);
  1871.    max = MAX2(max, info->StencilBits);
  1872.    return max;
  1873. }
  1874.  
  1875.  
  1876. /**
  1877.  * Return the data type (or more specifically, the data representation)
  1878.  * for the given format.
  1879.  * The return value will be one of:
  1880.  *    GL_UNSIGNED_NORMALIZED = unsigned int representing [0,1]
  1881.  *    GL_SIGNED_NORMALIZED = signed int representing [-1, 1]
  1882.  *    GL_UNSIGNED_INT = an ordinary unsigned integer
  1883.  *    GL_INT = an ordinary signed integer
  1884.  *    GL_FLOAT = an ordinary float
  1885.  */
  1886. GLenum
  1887. _mesa_get_format_datatype(gl_format format)
  1888. {
  1889.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1890.    return info->DataType;
  1891. }
  1892.  
  1893.  
  1894. /**
  1895.  * Return the basic format for the given type.  The result will be one of
  1896.  * GL_RGB, GL_RGBA, GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_INTENSITY,
  1897.  * GL_YCBCR_MESA, GL_DEPTH_COMPONENT, GL_STENCIL_INDEX, GL_DEPTH_STENCIL.
  1898.  */
  1899. GLenum
  1900. _mesa_get_format_base_format(gl_format format)
  1901. {
  1902.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1903.    return info->BaseFormat;
  1904. }
  1905.  
  1906.  
  1907. /**
  1908.  * Return the block size (in pixels) for the given format.  Normally
  1909.  * the block size is 1x1.  But compressed formats will have block sizes
  1910.  * of 4x4 or 8x4 pixels, etc.
  1911.  * \param bw  returns block width in pixels
  1912.  * \param bh  returns block height in pixels
  1913.  */
  1914. void
  1915. _mesa_get_format_block_size(gl_format format, GLuint *bw, GLuint *bh)
  1916. {
  1917.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1918.    *bw = info->BlockWidth;
  1919.    *bh = info->BlockHeight;
  1920. }
  1921.  
  1922.  
  1923. /** Is the given format a compressed format? */
  1924. GLboolean
  1925. _mesa_is_format_compressed(gl_format format)
  1926. {
  1927.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1928.    return info->BlockWidth > 1 || info->BlockHeight > 1;
  1929. }
  1930.  
  1931.  
  1932. /**
  1933.  * Determine if the given format represents a packed depth/stencil buffer.
  1934.  */
  1935. GLboolean
  1936. _mesa_is_format_packed_depth_stencil(gl_format format)
  1937. {
  1938.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1939.  
  1940.    return info->BaseFormat == GL_DEPTH_STENCIL;
  1941. }
  1942.  
  1943.  
  1944. /**
  1945.  * Is the given format a signed/unsigned integer color format?
  1946.  */
  1947. GLboolean
  1948. _mesa_is_format_integer_color(gl_format format)
  1949. {
  1950.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1951.    return (info->DataType == GL_INT || info->DataType == GL_UNSIGNED_INT) &&
  1952.       info->BaseFormat != GL_DEPTH_COMPONENT &&
  1953.       info->BaseFormat != GL_DEPTH_STENCIL &&
  1954.       info->BaseFormat != GL_STENCIL_INDEX;
  1955. }
  1956.  
  1957.  
  1958. /**
  1959.  * Is the given format an unsigned integer format?
  1960.  */
  1961. GLboolean
  1962. _mesa_is_format_unsigned(gl_format format)
  1963. {
  1964.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1965.    return _mesa_is_type_unsigned(info->DataType);
  1966. }
  1967.  
  1968.  
  1969. /**
  1970.  * Return color encoding for given format.
  1971.  * \return GL_LINEAR or GL_SRGB
  1972.  */
  1973. GLenum
  1974. _mesa_get_format_color_encoding(gl_format format)
  1975. {
  1976.    /* XXX this info should be encoded in gl_format_info */
  1977.    switch (format) {
  1978.    case MESA_FORMAT_SRGB8:
  1979.    case MESA_FORMAT_SRGBA8:
  1980.    case MESA_FORMAT_SARGB8:
  1981.    case MESA_FORMAT_SL8:
  1982.    case MESA_FORMAT_SLA8:
  1983.    case MESA_FORMAT_SRGB_DXT1:
  1984.    case MESA_FORMAT_SRGBA_DXT1:
  1985.    case MESA_FORMAT_SRGBA_DXT3:
  1986.    case MESA_FORMAT_SRGBA_DXT5:
  1987.    case MESA_FORMAT_XBGR8888_SRGB:
  1988.       return GL_SRGB;
  1989.    default:
  1990.       return GL_LINEAR;
  1991.    }
  1992. }
  1993.  
  1994.  
  1995. /**
  1996.  * For an sRGB format, return the corresponding linear color space format.
  1997.  * For non-sRGB formats, return the format as-is.
  1998.  */
  1999. gl_format
  2000. _mesa_get_srgb_format_linear(gl_format format)
  2001. {
  2002.    switch (format) {
  2003.    case MESA_FORMAT_SRGB8:
  2004.       format = MESA_FORMAT_RGB888;
  2005.       break;
  2006.    case MESA_FORMAT_SRGBA8:
  2007.       format = MESA_FORMAT_RGBA8888;
  2008.       break;
  2009.    case MESA_FORMAT_SARGB8:
  2010.       format = MESA_FORMAT_ARGB8888;
  2011.       break;
  2012.    case MESA_FORMAT_SL8:
  2013.       format = MESA_FORMAT_L8;
  2014.       break;
  2015.    case MESA_FORMAT_SLA8:
  2016.       format = MESA_FORMAT_AL88;
  2017.       break;
  2018.    case MESA_FORMAT_SRGB_DXT1:
  2019.       format = MESA_FORMAT_RGB_DXT1;
  2020.       break;
  2021.    case MESA_FORMAT_SRGBA_DXT1:
  2022.       format = MESA_FORMAT_RGBA_DXT1;
  2023.       break;
  2024.    case MESA_FORMAT_SRGBA_DXT3:
  2025.       format = MESA_FORMAT_RGBA_DXT3;
  2026.       break;
  2027.    case MESA_FORMAT_SRGBA_DXT5:
  2028.       format = MESA_FORMAT_RGBA_DXT5;
  2029.       break;
  2030.    case MESA_FORMAT_XBGR8888_SRGB:
  2031.       format = MESA_FORMAT_RGBX8888_REV;
  2032.       break;
  2033.    default:
  2034.       break;
  2035.    }
  2036.    return format;
  2037. }
  2038.  
  2039.  
  2040. /**
  2041.  * If the given format is a compressed format, return a corresponding
  2042.  * uncompressed format.
  2043.  */
  2044. gl_format
  2045. _mesa_get_uncompressed_format(gl_format format)
  2046. {
  2047.    switch (format) {
  2048.    case MESA_FORMAT_RGB_FXT1:
  2049.       return MESA_FORMAT_RGB888;
  2050.    case MESA_FORMAT_RGBA_FXT1:
  2051.       return MESA_FORMAT_RGBA8888;
  2052.    case MESA_FORMAT_RGB_DXT1:
  2053.    case MESA_FORMAT_SRGB_DXT1:
  2054.       return MESA_FORMAT_RGB888;
  2055.    case MESA_FORMAT_RGBA_DXT1:
  2056.    case MESA_FORMAT_SRGBA_DXT1:
  2057.       return MESA_FORMAT_RGBA8888;
  2058.    case MESA_FORMAT_RGBA_DXT3:
  2059.    case MESA_FORMAT_SRGBA_DXT3:
  2060.       return MESA_FORMAT_RGBA8888;
  2061.    case MESA_FORMAT_RGBA_DXT5:
  2062.    case MESA_FORMAT_SRGBA_DXT5:
  2063.       return MESA_FORMAT_RGBA8888;
  2064.    case MESA_FORMAT_RED_RGTC1:
  2065.       return MESA_FORMAT_R8;
  2066.    case MESA_FORMAT_SIGNED_RED_RGTC1:
  2067.       return MESA_FORMAT_SIGNED_R8;
  2068.    case MESA_FORMAT_RG_RGTC2:
  2069.       return MESA_FORMAT_GR88;
  2070.    case MESA_FORMAT_SIGNED_RG_RGTC2:
  2071.       return MESA_FORMAT_SIGNED_RG88_REV;
  2072.    case MESA_FORMAT_L_LATC1:
  2073.       return MESA_FORMAT_L8;
  2074.    case MESA_FORMAT_SIGNED_L_LATC1:
  2075.       return MESA_FORMAT_SIGNED_L8;
  2076.    case MESA_FORMAT_LA_LATC2:
  2077.       return MESA_FORMAT_AL88;
  2078.    case MESA_FORMAT_SIGNED_LA_LATC2:
  2079.       return MESA_FORMAT_SIGNED_AL88;
  2080.    case MESA_FORMAT_ETC1_RGB8:
  2081.    case MESA_FORMAT_ETC2_RGB8:
  2082.    case MESA_FORMAT_ETC2_SRGB8:
  2083.       return MESA_FORMAT_RGB888;
  2084.    case MESA_FORMAT_ETC2_RGBA8_EAC:
  2085.    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
  2086.    case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
  2087.    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
  2088.       return MESA_FORMAT_RGBA8888;
  2089.    case MESA_FORMAT_ETC2_R11_EAC:
  2090.    case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
  2091.       return MESA_FORMAT_R16;
  2092.    case MESA_FORMAT_ETC2_RG11_EAC:
  2093.    case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
  2094.       return MESA_FORMAT_GR1616;
  2095.    default:
  2096. #ifdef DEBUG
  2097.       assert(!_mesa_is_format_compressed(format));
  2098. #endif
  2099.       return format;
  2100.    }
  2101. }
  2102.  
  2103.  
  2104. GLuint
  2105. _mesa_format_num_components(gl_format format)
  2106. {
  2107.    const struct gl_format_info *info = _mesa_get_format_info(format);
  2108.    return ((info->RedBits > 0) +
  2109.            (info->GreenBits > 0) +
  2110.            (info->BlueBits > 0) +
  2111.            (info->AlphaBits > 0) +
  2112.            (info->LuminanceBits > 0) +
  2113.            (info->IntensityBits > 0) +
  2114.            (info->DepthBits > 0) +
  2115.            (info->StencilBits > 0));
  2116. }
  2117.  
  2118.  
  2119. /**
  2120.  * Return number of bytes needed to store an image of the given size
  2121.  * in the given format.
  2122.  */
  2123. GLuint
  2124. _mesa_format_image_size(gl_format format, GLsizei width,
  2125.                         GLsizei height, GLsizei depth)
  2126. {
  2127.    const struct gl_format_info *info = _mesa_get_format_info(format);
  2128.    /* Strictly speaking, a conditional isn't needed here */
  2129.    if (info->BlockWidth > 1 || info->BlockHeight > 1) {
  2130.       /* compressed format (2D only for now) */
  2131.       const GLuint bw = info->BlockWidth, bh = info->BlockHeight;
  2132.       const GLuint wblocks = (width + bw - 1) / bw;
  2133.       const GLuint hblocks = (height + bh - 1) / bh;
  2134.       const GLuint sz = wblocks * hblocks * info->BytesPerBlock;
  2135.       return sz * depth;
  2136.    }
  2137.    else {
  2138.       /* non-compressed */
  2139.       const GLuint sz = width * height * depth * info->BytesPerBlock;
  2140.       return sz;
  2141.    }
  2142. }
  2143.  
  2144.  
  2145. /**
  2146.  * Same as _mesa_format_image_size() but returns a 64-bit value to
  2147.  * accomodate very large textures.
  2148.  */
  2149. uint64_t
  2150. _mesa_format_image_size64(gl_format format, GLsizei width,
  2151.                           GLsizei height, GLsizei depth)
  2152. {
  2153.    const struct gl_format_info *info = _mesa_get_format_info(format);
  2154.    /* Strictly speaking, a conditional isn't needed here */
  2155.    if (info->BlockWidth > 1 || info->BlockHeight > 1) {
  2156.       /* compressed format (2D only for now) */
  2157.       const uint64_t bw = info->BlockWidth, bh = info->BlockHeight;
  2158.       const uint64_t wblocks = (width + bw - 1) / bw;
  2159.       const uint64_t hblocks = (height + bh - 1) / bh;
  2160.       const uint64_t sz = wblocks * hblocks * info->BytesPerBlock;
  2161.       return sz * depth;
  2162.    }
  2163.    else {
  2164.       /* non-compressed */
  2165.       const uint64_t sz = ((uint64_t) width *
  2166.                            (uint64_t) height *
  2167.                            (uint64_t) depth *
  2168.                            info->BytesPerBlock);
  2169.       return sz;
  2170.    }
  2171. }
  2172.  
  2173.  
  2174.  
  2175. GLint
  2176. _mesa_format_row_stride(gl_format format, GLsizei width)
  2177. {
  2178.    const struct gl_format_info *info = _mesa_get_format_info(format);
  2179.    /* Strictly speaking, a conditional isn't needed here */
  2180.    if (info->BlockWidth > 1 || info->BlockHeight > 1) {
  2181.       /* compressed format */
  2182.       const GLuint bw = info->BlockWidth;
  2183.       const GLuint wblocks = (width + bw - 1) / bw;
  2184.       const GLint stride = wblocks * info->BytesPerBlock;
  2185.       return stride;
  2186.    }
  2187.    else {
  2188.       const GLint stride = width * info->BytesPerBlock;
  2189.       return stride;
  2190.    }
  2191. }
  2192.  
  2193.  
  2194. /**
  2195.  * Debug/test: check that all formats are handled in the
  2196.  * _mesa_format_to_type_and_comps() function.  When new pixel formats
  2197.  * are added to Mesa, that function needs to be updated.
  2198.  * This is a no-op after the first call.
  2199.  */
  2200. static void
  2201. check_format_to_type_and_comps(void)
  2202. {
  2203.    gl_format f;
  2204.  
  2205.    for (f = MESA_FORMAT_NONE + 1; f < MESA_FORMAT_COUNT; f++) {
  2206.       GLenum datatype = 0;
  2207.       GLuint comps = 0;
  2208.       /* This function will emit a problem/warning if the format is
  2209.        * not handled.
  2210.        */
  2211.       _mesa_format_to_type_and_comps(f, &datatype, &comps);
  2212.    }
  2213. }
  2214.  
  2215.  
  2216. /**
  2217.  * Do sanity checking of the format info table.
  2218.  */
  2219. void
  2220. _mesa_test_formats(void)
  2221. {
  2222.    GLuint i;
  2223.  
  2224.    STATIC_ASSERT(Elements(format_info) == MESA_FORMAT_COUNT);
  2225.  
  2226.    for (i = 0; i < MESA_FORMAT_COUNT; i++) {
  2227.       const struct gl_format_info *info = _mesa_get_format_info(i);
  2228.       assert(info);
  2229.  
  2230.       assert(info->Name == i);
  2231.  
  2232.       if (info->Name == MESA_FORMAT_NONE)
  2233.          continue;
  2234.  
  2235.       if (info->BlockWidth == 1 && info->BlockHeight == 1) {
  2236.          if (info->RedBits > 0) {
  2237.             GLuint t = info->RedBits + info->GreenBits
  2238.                + info->BlueBits + info->AlphaBits;
  2239.             assert(t / 8 <= info->BytesPerBlock);
  2240.             (void) t;
  2241.          }
  2242.       }
  2243.  
  2244.       assert(info->DataType == GL_UNSIGNED_NORMALIZED ||
  2245.              info->DataType == GL_SIGNED_NORMALIZED ||
  2246.              info->DataType == GL_UNSIGNED_INT ||
  2247.              info->DataType == GL_INT ||
  2248.              info->DataType == GL_FLOAT ||
  2249.              /* Z32_FLOAT_X24S8 has DataType of GL_NONE */
  2250.              info->DataType == GL_NONE);
  2251.  
  2252.       if (info->BaseFormat == GL_RGB) {
  2253.          assert(info->RedBits > 0);
  2254.          assert(info->GreenBits > 0);
  2255.          assert(info->BlueBits > 0);
  2256.          assert(info->AlphaBits == 0);
  2257.          assert(info->LuminanceBits == 0);
  2258.          assert(info->IntensityBits == 0);
  2259.       }
  2260.       else if (info->BaseFormat == GL_RGBA) {
  2261.          assert(info->RedBits > 0);
  2262.          assert(info->GreenBits > 0);
  2263.          assert(info->BlueBits > 0);
  2264.          assert(info->AlphaBits > 0);
  2265.          assert(info->LuminanceBits == 0);
  2266.          assert(info->IntensityBits == 0);
  2267.       }
  2268.       else if (info->BaseFormat == GL_RG) {
  2269.          assert(info->RedBits > 0);
  2270.          assert(info->GreenBits > 0);
  2271.          assert(info->BlueBits == 0);
  2272.          assert(info->AlphaBits == 0);
  2273.          assert(info->LuminanceBits == 0);
  2274.          assert(info->IntensityBits == 0);
  2275.       }
  2276.       else if (info->BaseFormat == GL_RED) {
  2277.          assert(info->RedBits > 0);
  2278.          assert(info->GreenBits == 0);
  2279.          assert(info->BlueBits == 0);
  2280.          assert(info->AlphaBits == 0);
  2281.          assert(info->LuminanceBits == 0);
  2282.          assert(info->IntensityBits == 0);
  2283.       }
  2284.       else if (info->BaseFormat == GL_LUMINANCE) {
  2285.          assert(info->RedBits == 0);
  2286.          assert(info->GreenBits == 0);
  2287.          assert(info->BlueBits == 0);
  2288.          assert(info->AlphaBits == 0);
  2289.          assert(info->LuminanceBits > 0);
  2290.          assert(info->IntensityBits == 0);
  2291.       }
  2292.       else if (info->BaseFormat == GL_INTENSITY) {
  2293.          assert(info->RedBits == 0);
  2294.          assert(info->GreenBits == 0);
  2295.          assert(info->BlueBits == 0);
  2296.          assert(info->AlphaBits == 0);
  2297.          assert(info->LuminanceBits == 0);
  2298.          assert(info->IntensityBits > 0);
  2299.       }
  2300.    }
  2301.  
  2302.    check_format_to_type_and_comps();
  2303. }
  2304.  
  2305.  
  2306.  
  2307. /**
  2308.  * Return datatype and number of components per texel for the given gl_format.
  2309.  * Only used for mipmap generation code.
  2310.  */
  2311. void
  2312. _mesa_format_to_type_and_comps(gl_format format,
  2313.                                GLenum *datatype, GLuint *comps)
  2314. {
  2315.    switch (format) {
  2316.    case MESA_FORMAT_RGBA8888:
  2317.    case MESA_FORMAT_RGBA8888_REV:
  2318.    case MESA_FORMAT_ARGB8888:
  2319.    case MESA_FORMAT_ARGB8888_REV:
  2320.    case MESA_FORMAT_RGBX8888:
  2321.    case MESA_FORMAT_RGBX8888_REV:
  2322.    case MESA_FORMAT_XRGB8888:
  2323.    case MESA_FORMAT_XRGB8888_REV:
  2324.       *datatype = GL_UNSIGNED_BYTE;
  2325.       *comps = 4;
  2326.       return;
  2327.    case MESA_FORMAT_RGB888:
  2328.    case MESA_FORMAT_BGR888:
  2329.       *datatype = GL_UNSIGNED_BYTE;
  2330.       *comps = 3;
  2331.       return;
  2332.    case MESA_FORMAT_RGB565:
  2333.    case MESA_FORMAT_RGB565_REV:
  2334.       *datatype = GL_UNSIGNED_SHORT_5_6_5;
  2335.       *comps = 3;
  2336.       return;
  2337.  
  2338.    case MESA_FORMAT_ARGB4444:
  2339.    case MESA_FORMAT_ARGB4444_REV:
  2340.    case MESA_FORMAT_XRGB4444_UNORM:
  2341.       *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
  2342.       *comps = 4;
  2343.       return;
  2344.  
  2345.    case MESA_FORMAT_ARGB1555:
  2346.    case MESA_FORMAT_ARGB1555_REV:
  2347.    case MESA_FORMAT_XRGB1555_UNORM:
  2348.       *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
  2349.       *comps = 4;
  2350.       return;
  2351.  
  2352.    case MESA_FORMAT_ARGB2101010:
  2353.       *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
  2354.       *comps = 4;
  2355.       return;
  2356.  
  2357.    case MESA_FORMAT_RGBA5551:
  2358.       *datatype = GL_UNSIGNED_SHORT_5_5_5_1;
  2359.       *comps = 4;
  2360.       return;
  2361.  
  2362.    case MESA_FORMAT_AL44:
  2363.       *datatype = MESA_UNSIGNED_BYTE_4_4;
  2364.       *comps = 2;
  2365.       return;
  2366.  
  2367.    case MESA_FORMAT_AL88:
  2368.    case MESA_FORMAT_AL88_REV:
  2369.    case MESA_FORMAT_GR88:
  2370.    case MESA_FORMAT_RG88:
  2371.       *datatype = GL_UNSIGNED_BYTE;
  2372.       *comps = 2;
  2373.       return;
  2374.  
  2375.    case MESA_FORMAT_AL1616:
  2376.    case MESA_FORMAT_AL1616_REV:
  2377.    case MESA_FORMAT_GR1616:
  2378.    case MESA_FORMAT_RG1616:
  2379.       *datatype = GL_UNSIGNED_SHORT;
  2380.       *comps = 2;
  2381.       return;
  2382.  
  2383.    case MESA_FORMAT_R16:
  2384.    case MESA_FORMAT_A16:
  2385.    case MESA_FORMAT_L16:
  2386.    case MESA_FORMAT_I16:
  2387.       *datatype = GL_UNSIGNED_SHORT;
  2388.       *comps = 1;
  2389.       return;
  2390.  
  2391.    case MESA_FORMAT_RGB332:
  2392.       *datatype = GL_UNSIGNED_BYTE_3_3_2;
  2393.       *comps = 3;
  2394.       return;
  2395.  
  2396.    case MESA_FORMAT_A8:
  2397.    case MESA_FORMAT_L8:
  2398.    case MESA_FORMAT_I8:
  2399.    case MESA_FORMAT_R8:
  2400.    case MESA_FORMAT_S8:
  2401.       *datatype = GL_UNSIGNED_BYTE;
  2402.       *comps = 1;
  2403.       return;
  2404.  
  2405.    case MESA_FORMAT_YCBCR:
  2406.    case MESA_FORMAT_YCBCR_REV:
  2407.       *datatype = GL_UNSIGNED_SHORT;
  2408.       *comps = 2;
  2409.       return;
  2410.  
  2411.    case MESA_FORMAT_Z24_S8:
  2412.       *datatype = GL_UNSIGNED_INT_24_8_MESA;
  2413.       *comps = 2;
  2414.       return;
  2415.  
  2416.    case MESA_FORMAT_S8_Z24:
  2417.       *datatype = GL_UNSIGNED_INT_8_24_REV_MESA;
  2418.       *comps = 2;
  2419.       return;
  2420.  
  2421.    case MESA_FORMAT_Z16:
  2422.       *datatype = GL_UNSIGNED_SHORT;
  2423.       *comps = 1;
  2424.       return;
  2425.  
  2426.    case MESA_FORMAT_X8_Z24:
  2427.       *datatype = GL_UNSIGNED_INT;
  2428.       *comps = 1;
  2429.       return;
  2430.  
  2431.    case MESA_FORMAT_Z24_X8:
  2432.       *datatype = GL_UNSIGNED_INT;
  2433.       *comps = 1;
  2434.       return;
  2435.  
  2436.    case MESA_FORMAT_Z32:
  2437.       *datatype = GL_UNSIGNED_INT;
  2438.       *comps = 1;
  2439.       return;
  2440.  
  2441.    case MESA_FORMAT_Z32_FLOAT:
  2442.       *datatype = GL_FLOAT;
  2443.       *comps = 1;
  2444.       return;
  2445.  
  2446.    case MESA_FORMAT_Z32_FLOAT_X24S8:
  2447.       *datatype = GL_FLOAT_32_UNSIGNED_INT_24_8_REV;
  2448.       *comps = 1;
  2449.       return;
  2450.  
  2451.    case MESA_FORMAT_DUDV8:
  2452.       *datatype = GL_BYTE;
  2453.       *comps = 2;
  2454.       return;
  2455.  
  2456.    case MESA_FORMAT_SIGNED_R8:
  2457.    case MESA_FORMAT_SIGNED_A8:
  2458.    case MESA_FORMAT_SIGNED_L8:
  2459.    case MESA_FORMAT_SIGNED_I8:
  2460.       *datatype = GL_BYTE;
  2461.       *comps = 1;
  2462.       return;
  2463.    case MESA_FORMAT_SIGNED_RG88_REV:
  2464.    case MESA_FORMAT_SIGNED_AL88:
  2465.       *datatype = GL_BYTE;
  2466.       *comps = 2;
  2467.       return;
  2468.    case MESA_FORMAT_SIGNED_RGBA8888:
  2469.    case MESA_FORMAT_SIGNED_RGBA8888_REV:
  2470.    case MESA_FORMAT_SIGNED_RGBX8888:
  2471.       *datatype = GL_BYTE;
  2472.       *comps = 4;
  2473.       return;
  2474.  
  2475.    case MESA_FORMAT_RGBA_16:
  2476.       *datatype = GL_UNSIGNED_SHORT;
  2477.       *comps = 4;
  2478.       return;
  2479.  
  2480.    case MESA_FORMAT_SIGNED_R16:
  2481.    case MESA_FORMAT_SIGNED_A16:
  2482.    case MESA_FORMAT_SIGNED_L16:
  2483.    case MESA_FORMAT_SIGNED_I16:
  2484.       *datatype = GL_SHORT;
  2485.       *comps = 1;
  2486.       return;
  2487.    case MESA_FORMAT_SIGNED_GR1616:
  2488.    case MESA_FORMAT_SIGNED_AL1616:
  2489.       *datatype = GL_SHORT;
  2490.       *comps = 2;
  2491.       return;
  2492.    case MESA_FORMAT_SIGNED_RGB_16:
  2493.       *datatype = GL_SHORT;
  2494.       *comps = 3;
  2495.       return;
  2496.    case MESA_FORMAT_SIGNED_RGBA_16:
  2497.       *datatype = GL_SHORT;
  2498.       *comps = 4;
  2499.       return;
  2500.  
  2501.    case MESA_FORMAT_SRGB8:
  2502.       *datatype = GL_UNSIGNED_BYTE;
  2503.       *comps = 3;
  2504.       return;
  2505.    case MESA_FORMAT_SRGBA8:
  2506.    case MESA_FORMAT_SARGB8:
  2507.       *datatype = GL_UNSIGNED_BYTE;
  2508.       *comps = 4;
  2509.       return;
  2510.    case MESA_FORMAT_SL8:
  2511.       *datatype = GL_UNSIGNED_BYTE;
  2512.       *comps = 1;
  2513.       return;
  2514.    case MESA_FORMAT_SLA8:
  2515.       *datatype = GL_UNSIGNED_BYTE;
  2516.       *comps = 2;
  2517.       return;
  2518.  
  2519.    case MESA_FORMAT_RGB_FXT1:
  2520.    case MESA_FORMAT_RGBA_FXT1:
  2521.    case MESA_FORMAT_RGB_DXT1:
  2522.    case MESA_FORMAT_RGBA_DXT1:
  2523.    case MESA_FORMAT_RGBA_DXT3:
  2524.    case MESA_FORMAT_RGBA_DXT5:
  2525.    case MESA_FORMAT_SRGB_DXT1:
  2526.    case MESA_FORMAT_SRGBA_DXT1:
  2527.    case MESA_FORMAT_SRGBA_DXT3:
  2528.    case MESA_FORMAT_SRGBA_DXT5:
  2529.    case MESA_FORMAT_RED_RGTC1:
  2530.    case MESA_FORMAT_SIGNED_RED_RGTC1:
  2531.    case MESA_FORMAT_RG_RGTC2:
  2532.    case MESA_FORMAT_SIGNED_RG_RGTC2:
  2533.    case MESA_FORMAT_L_LATC1:
  2534.    case MESA_FORMAT_SIGNED_L_LATC1:
  2535.    case MESA_FORMAT_LA_LATC2:
  2536.    case MESA_FORMAT_SIGNED_LA_LATC2:
  2537.    case MESA_FORMAT_ETC1_RGB8:
  2538.    case MESA_FORMAT_ETC2_RGB8:
  2539.    case MESA_FORMAT_ETC2_SRGB8:
  2540.    case MESA_FORMAT_ETC2_RGBA8_EAC:
  2541.    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
  2542.    case MESA_FORMAT_ETC2_R11_EAC:
  2543.    case MESA_FORMAT_ETC2_RG11_EAC:
  2544.    case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
  2545.    case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
  2546.    case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
  2547.    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
  2548.       /* XXX generate error instead? */
  2549.       *datatype = GL_UNSIGNED_BYTE;
  2550.       *comps = 0;
  2551.       return;
  2552.  
  2553.    case MESA_FORMAT_RGBA_FLOAT32:
  2554.       *datatype = GL_FLOAT;
  2555.       *comps = 4;
  2556.       return;
  2557.    case MESA_FORMAT_RGBA_FLOAT16:
  2558.       *datatype = GL_HALF_FLOAT_ARB;
  2559.       *comps = 4;
  2560.       return;
  2561.    case MESA_FORMAT_RGB_FLOAT32:
  2562.       *datatype = GL_FLOAT;
  2563.       *comps = 3;
  2564.       return;
  2565.    case MESA_FORMAT_RGB_FLOAT16:
  2566.       *datatype = GL_HALF_FLOAT_ARB;
  2567.       *comps = 3;
  2568.       return;
  2569.    case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
  2570.    case MESA_FORMAT_RG_FLOAT32:
  2571.       *datatype = GL_FLOAT;
  2572.       *comps = 2;
  2573.       return;
  2574.    case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
  2575.    case MESA_FORMAT_RG_FLOAT16:
  2576.       *datatype = GL_HALF_FLOAT_ARB;
  2577.       *comps = 2;
  2578.       return;
  2579.    case MESA_FORMAT_ALPHA_FLOAT32:
  2580.    case MESA_FORMAT_LUMINANCE_FLOAT32:
  2581.    case MESA_FORMAT_INTENSITY_FLOAT32:
  2582.    case MESA_FORMAT_R_FLOAT32:
  2583.       *datatype = GL_FLOAT;
  2584.       *comps = 1;
  2585.       return;
  2586.    case MESA_FORMAT_ALPHA_FLOAT16:
  2587.    case MESA_FORMAT_LUMINANCE_FLOAT16:
  2588.    case MESA_FORMAT_INTENSITY_FLOAT16:
  2589.    case MESA_FORMAT_R_FLOAT16:
  2590.       *datatype = GL_HALF_FLOAT_ARB;
  2591.       *comps = 1;
  2592.       return;
  2593.  
  2594.    case MESA_FORMAT_ALPHA_UINT8:
  2595.    case MESA_FORMAT_LUMINANCE_UINT8:
  2596.    case MESA_FORMAT_INTENSITY_UINT8:
  2597.       *datatype = GL_UNSIGNED_BYTE;
  2598.       *comps = 1;
  2599.       return;
  2600.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
  2601.       *datatype = GL_UNSIGNED_BYTE;
  2602.       *comps = 2;
  2603.       return;
  2604.  
  2605.    case MESA_FORMAT_ALPHA_UINT16:
  2606.    case MESA_FORMAT_LUMINANCE_UINT16:
  2607.    case MESA_FORMAT_INTENSITY_UINT16:
  2608.       *datatype = GL_UNSIGNED_SHORT;
  2609.       *comps = 1;
  2610.       return;
  2611.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
  2612.       *datatype = GL_UNSIGNED_SHORT;
  2613.       *comps = 2;
  2614.       return;
  2615.    case MESA_FORMAT_ALPHA_UINT32:
  2616.    case MESA_FORMAT_LUMINANCE_UINT32:
  2617.    case MESA_FORMAT_INTENSITY_UINT32:
  2618.       *datatype = GL_UNSIGNED_INT;
  2619.       *comps = 1;
  2620.       return;
  2621.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
  2622.       *datatype = GL_UNSIGNED_INT;
  2623.       *comps = 2;
  2624.       return;
  2625.    case MESA_FORMAT_ALPHA_INT8:
  2626.    case MESA_FORMAT_LUMINANCE_INT8:
  2627.    case MESA_FORMAT_INTENSITY_INT8:
  2628.       *datatype = GL_BYTE;
  2629.       *comps = 1;
  2630.       return;
  2631.    case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
  2632.       *datatype = GL_BYTE;
  2633.       *comps = 2;
  2634.       return;
  2635.  
  2636.    case MESA_FORMAT_ALPHA_INT16:
  2637.    case MESA_FORMAT_LUMINANCE_INT16:
  2638.    case MESA_FORMAT_INTENSITY_INT16:
  2639.       *datatype = GL_SHORT;
  2640.       *comps = 1;
  2641.       return;
  2642.    case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
  2643.       *datatype = GL_SHORT;
  2644.       *comps = 2;
  2645.       return;
  2646.  
  2647.    case MESA_FORMAT_ALPHA_INT32:
  2648.    case MESA_FORMAT_LUMINANCE_INT32:
  2649.    case MESA_FORMAT_INTENSITY_INT32:
  2650.       *datatype = GL_INT;
  2651.       *comps = 1;
  2652.       return;
  2653.    case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
  2654.       *datatype = GL_INT;
  2655.       *comps = 2;
  2656.       return;
  2657.  
  2658.    case MESA_FORMAT_R_INT8:
  2659.       *datatype = GL_BYTE;
  2660.       *comps = 1;
  2661.       return;
  2662.    case MESA_FORMAT_RG_INT8:
  2663.       *datatype = GL_BYTE;
  2664.       *comps = 2;
  2665.       return;
  2666.    case MESA_FORMAT_RGB_INT8:
  2667.       *datatype = GL_BYTE;
  2668.       *comps = 3;
  2669.       return;
  2670.    case MESA_FORMAT_RGBA_INT8:
  2671.       *datatype = GL_BYTE;
  2672.       *comps = 4;
  2673.       return;
  2674.    case MESA_FORMAT_R_INT16:
  2675.       *datatype = GL_SHORT;
  2676.       *comps = 1;
  2677.       return;
  2678.    case MESA_FORMAT_RG_INT16:
  2679.       *datatype = GL_SHORT;
  2680.       *comps = 2;
  2681.       return;
  2682.    case MESA_FORMAT_RGB_INT16:
  2683.       *datatype = GL_SHORT;
  2684.       *comps = 3;
  2685.       return;
  2686.    case MESA_FORMAT_RGBA_INT16:
  2687.       *datatype = GL_SHORT;
  2688.       *comps = 4;
  2689.       return;
  2690.    case MESA_FORMAT_R_INT32:
  2691.       *datatype = GL_INT;
  2692.       *comps = 1;
  2693.       return;
  2694.    case MESA_FORMAT_RG_INT32:
  2695.       *datatype = GL_INT;
  2696.       *comps = 2;
  2697.       return;
  2698.    case MESA_FORMAT_RGB_INT32:
  2699.       *datatype = GL_INT;
  2700.       *comps = 3;
  2701.       return;
  2702.    case MESA_FORMAT_RGBA_INT32:
  2703.       *datatype = GL_INT;
  2704.       *comps = 4;
  2705.       return;
  2706.  
  2707.    /**
  2708.     * \name Non-normalized unsigned integer formats.
  2709.     */
  2710.    case MESA_FORMAT_R_UINT8:
  2711.       *datatype = GL_UNSIGNED_BYTE;
  2712.       *comps = 1;
  2713.       return;
  2714.    case MESA_FORMAT_RG_UINT8:
  2715.       *datatype = GL_UNSIGNED_BYTE;
  2716.       *comps = 2;
  2717.       return;
  2718.    case MESA_FORMAT_RGB_UINT8:
  2719.       *datatype = GL_UNSIGNED_BYTE;
  2720.       *comps = 3;
  2721.       return;
  2722.    case MESA_FORMAT_RGBA_UINT8:
  2723.       *datatype = GL_UNSIGNED_BYTE;
  2724.       *comps = 4;
  2725.       return;
  2726.    case MESA_FORMAT_R_UINT16:
  2727.       *datatype = GL_UNSIGNED_SHORT;
  2728.       *comps = 1;
  2729.       return;
  2730.    case MESA_FORMAT_RG_UINT16:
  2731.       *datatype = GL_UNSIGNED_SHORT;
  2732.       *comps = 2;
  2733.       return;
  2734.    case MESA_FORMAT_RGB_UINT16:
  2735.       *datatype = GL_UNSIGNED_SHORT;
  2736.       *comps = 3;
  2737.       return;
  2738.    case MESA_FORMAT_RGBA_UINT16:
  2739.       *datatype = GL_UNSIGNED_SHORT;
  2740.       *comps = 4;
  2741.       return;
  2742.    case MESA_FORMAT_R_UINT32:
  2743.       *datatype = GL_UNSIGNED_INT;
  2744.       *comps = 1;
  2745.       return;
  2746.    case MESA_FORMAT_RG_UINT32:
  2747.       *datatype = GL_UNSIGNED_INT;
  2748.       *comps = 2;
  2749.       return;
  2750.    case MESA_FORMAT_RGB_UINT32:
  2751.       *datatype = GL_UNSIGNED_INT;
  2752.       *comps = 3;
  2753.       return;
  2754.    case MESA_FORMAT_RGBA_UINT32:
  2755.       *datatype = GL_UNSIGNED_INT;
  2756.       *comps = 4;
  2757.       return;
  2758.  
  2759.    case MESA_FORMAT_RGB9_E5_FLOAT:
  2760.       *datatype = GL_UNSIGNED_INT_5_9_9_9_REV;
  2761.       *comps = 3;
  2762.       return;
  2763.  
  2764.    case MESA_FORMAT_R11_G11_B10_FLOAT:
  2765.       *datatype = GL_UNSIGNED_INT_10F_11F_11F_REV;
  2766.       *comps = 3;
  2767.       return;
  2768.  
  2769.    case MESA_FORMAT_ARGB2101010_UINT:
  2770.    case MESA_FORMAT_ABGR2101010_UINT:
  2771.       *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
  2772.       *comps = 4;
  2773.       return;
  2774.  
  2775.    case MESA_FORMAT_XBGR8888_SRGB:
  2776.    case MESA_FORMAT_XBGR8888_UINT:
  2777.       *datatype = GL_UNSIGNED_BYTE;
  2778.       *comps = 4;
  2779.       return;
  2780.  
  2781.    case MESA_FORMAT_XBGR8888_SNORM:
  2782.    case MESA_FORMAT_XBGR8888_SINT:
  2783.       *datatype = GL_BYTE;
  2784.       *comps = 4;
  2785.       return;
  2786.  
  2787.    case MESA_FORMAT_XRGB2101010_UNORM:
  2788.       *datatype = GL_UNSIGNED_INT_2_10_10_10_REV;
  2789.       *comps = 4;
  2790.       return;
  2791.  
  2792.    case MESA_FORMAT_XBGR16161616_UNORM:
  2793.    case MESA_FORMAT_XBGR16161616_UINT:
  2794.       *datatype = GL_UNSIGNED_SHORT;
  2795.       *comps = 4;
  2796.       return;
  2797.  
  2798.    case MESA_FORMAT_XBGR16161616_SNORM:
  2799.    case MESA_FORMAT_XBGR16161616_SINT:
  2800.       *datatype = GL_SHORT;
  2801.       *comps = 4;
  2802.       return;
  2803.  
  2804.    case MESA_FORMAT_XBGR16161616_FLOAT:
  2805.       *datatype = GL_HALF_FLOAT;
  2806.       *comps = 4;
  2807.       return;
  2808.  
  2809.    case MESA_FORMAT_XBGR32323232_FLOAT:
  2810.       *datatype = GL_FLOAT;
  2811.       *comps = 4;
  2812.       return;
  2813.  
  2814.    case MESA_FORMAT_XBGR32323232_UINT:
  2815.       *datatype = GL_UNSIGNED_INT;
  2816.       *comps = 4;
  2817.       return;
  2818.  
  2819.    case MESA_FORMAT_XBGR32323232_SINT:
  2820.       *datatype = GL_INT;
  2821.       *comps = 4;
  2822.       return;
  2823.  
  2824.    case MESA_FORMAT_COUNT:
  2825.       assert(0);
  2826.       return;
  2827.  
  2828.    case MESA_FORMAT_NONE:
  2829.    /* For debug builds, warn if any formats are not handled */
  2830. #ifdef DEBUG
  2831.    default:
  2832. #endif
  2833.       _mesa_problem(NULL, "bad format %s in _mesa_format_to_type_and_comps",
  2834.                     _mesa_get_format_name(format));
  2835.       *datatype = 0;
  2836.       *comps = 1;
  2837.    }
  2838. }
  2839.  
  2840. /**
  2841.  * Check if a gl_format exactly matches a GL format/type combination
  2842.  * such that we can use memcpy() from one to the other.
  2843.  * \param gl_format  a MESA_FORMAT_x value
  2844.  * \param format  the user-specified image format
  2845.  * \param type  the user-specified image datatype
  2846.  * \param swapBytes  typically the current pixel pack/unpack byteswap state
  2847.  * \return GL_TRUE if the formats match, GL_FALSE otherwise.
  2848.  */
  2849. GLboolean
  2850. _mesa_format_matches_format_and_type(gl_format gl_format,
  2851.                                      GLenum format, GLenum type,
  2852.                                      GLboolean swapBytes)
  2853. {
  2854.    const GLboolean littleEndian = _mesa_little_endian();
  2855.  
  2856.    /* Note: When reading a GL format/type combination, the format lists channel
  2857.     * assignments from most significant channel in the type to least
  2858.     * significant.  A type with _REV indicates that the assignments are
  2859.     * swapped, so they are listed from least significant to most significant.
  2860.     *
  2861.     * For sanity, please keep this switch statement ordered the same as the
  2862.     * enums in formats.h.
  2863.     */
  2864.  
  2865.    switch (gl_format) {
  2866.  
  2867.    case MESA_FORMAT_NONE:
  2868.    case MESA_FORMAT_COUNT:
  2869.       return GL_FALSE;
  2870.  
  2871.    case MESA_FORMAT_RGBA8888:
  2872.    case MESA_FORMAT_SRGBA8:
  2873.       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
  2874.          return GL_TRUE;
  2875.  
  2876.       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV && swapBytes)
  2877.          return GL_TRUE;
  2878.  
  2879.       if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && !littleEndian)
  2880.          return GL_TRUE;
  2881.  
  2882.       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV
  2883.           && !swapBytes)
  2884.          return GL_TRUE;
  2885.  
  2886.       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8
  2887.           && swapBytes)
  2888.          return GL_TRUE;
  2889.  
  2890.       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && littleEndian)
  2891.          return GL_TRUE;
  2892.  
  2893.       return GL_FALSE;
  2894.  
  2895.    case MESA_FORMAT_RGBA8888_REV:
  2896.       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
  2897.           !swapBytes)
  2898.          return GL_TRUE;
  2899.  
  2900.       if (format == GL_RGBA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
  2901.          return GL_TRUE;
  2902.  
  2903.       if (format == GL_RGBA && type == GL_UNSIGNED_BYTE && littleEndian)
  2904.          return GL_TRUE;
  2905.  
  2906.       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8 &&
  2907.           !swapBytes)
  2908.          return GL_TRUE;
  2909.  
  2910.       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
  2911.           swapBytes)
  2912.          return GL_TRUE;
  2913.  
  2914.       if (format == GL_ABGR_EXT && type == GL_UNSIGNED_BYTE && !littleEndian)
  2915.          return GL_TRUE;
  2916.  
  2917.       return GL_FALSE;
  2918.  
  2919.    case MESA_FORMAT_ARGB8888:
  2920.    case MESA_FORMAT_SARGB8:
  2921.       if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
  2922.           !swapBytes)
  2923.          return GL_TRUE;
  2924.  
  2925.       if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && swapBytes)
  2926.          return GL_TRUE;
  2927.  
  2928.       if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && littleEndian)
  2929.          return GL_TRUE;
  2930.  
  2931.       return GL_FALSE;
  2932.  
  2933.    case MESA_FORMAT_ARGB8888_REV:
  2934.       if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8 && !swapBytes)
  2935.          return GL_TRUE;
  2936.  
  2937.       if (format == GL_BGRA && type == GL_UNSIGNED_INT_8_8_8_8_REV &&
  2938.           swapBytes)
  2939.          return GL_TRUE;
  2940.  
  2941.       if (format == GL_BGRA && type == GL_UNSIGNED_BYTE && !littleEndian)
  2942.          return GL_TRUE;
  2943.  
  2944.       return GL_FALSE;
  2945.  
  2946.    case MESA_FORMAT_RGBX8888:
  2947.    case MESA_FORMAT_RGBX8888_REV:
  2948.       return GL_FALSE;
  2949.  
  2950.    case MESA_FORMAT_XRGB8888:
  2951.    case MESA_FORMAT_XRGB8888_REV:
  2952.       return GL_FALSE;
  2953.  
  2954.    case MESA_FORMAT_RGB888:
  2955.    case MESA_FORMAT_SRGB8:
  2956.       return format == GL_BGR && type == GL_UNSIGNED_BYTE && littleEndian;
  2957.  
  2958.    case MESA_FORMAT_BGR888:
  2959.       return format == GL_RGB && type == GL_UNSIGNED_BYTE && littleEndian;
  2960.  
  2961.    case MESA_FORMAT_RGB565:
  2962.       return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5 && !swapBytes;
  2963.  
  2964.    case MESA_FORMAT_RGB565_REV:
  2965.       /* Some of the 16-bit MESA_FORMATs that would seem to correspond to
  2966.        * GL_UNSIGNED_SHORT_* are byte-swapped instead of channel-reversed,
  2967.        * according to formats.h, so they can't be matched.
  2968.        */
  2969.       return GL_FALSE;
  2970.  
  2971.    case MESA_FORMAT_ARGB4444:
  2972.       return format == GL_BGRA && type == GL_UNSIGNED_SHORT_4_4_4_4_REV &&
  2973.          !swapBytes;
  2974.  
  2975.    case MESA_FORMAT_ARGB4444_REV:
  2976.       return GL_FALSE;
  2977.  
  2978.    case MESA_FORMAT_RGBA5551:
  2979.       return format == GL_RGBA && type == GL_UNSIGNED_SHORT_5_5_5_1 &&
  2980.          !swapBytes;
  2981.  
  2982.    case MESA_FORMAT_ARGB1555:
  2983.       return format == GL_BGRA && type == GL_UNSIGNED_SHORT_1_5_5_5_REV &&
  2984.          !swapBytes;
  2985.  
  2986.    case MESA_FORMAT_ARGB1555_REV:
  2987.       return GL_FALSE;
  2988.  
  2989.    case MESA_FORMAT_AL44:
  2990.       return GL_FALSE;
  2991.    case MESA_FORMAT_AL88:
  2992.    case MESA_FORMAT_SLA8:
  2993.       return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_BYTE && littleEndian;
  2994.    case MESA_FORMAT_AL88_REV:
  2995.       return GL_FALSE;
  2996.  
  2997.    case MESA_FORMAT_AL1616:
  2998.       return format == GL_LUMINANCE_ALPHA && type == GL_UNSIGNED_SHORT && littleEndian && !swapBytes;
  2999.    case MESA_FORMAT_AL1616_REV:
  3000.       return GL_FALSE;
  3001.  
  3002.    case MESA_FORMAT_RGB332:
  3003.       return format == GL_RGB && type == GL_UNSIGNED_BYTE_3_3_2;
  3004.  
  3005.    case MESA_FORMAT_A8:
  3006.       return format == GL_ALPHA && type == GL_UNSIGNED_BYTE;
  3007.    case MESA_FORMAT_A16:
  3008.       return format == GL_ALPHA && type == GL_UNSIGNED_SHORT && !swapBytes;
  3009.    case MESA_FORMAT_L8:
  3010.    case MESA_FORMAT_SL8:
  3011.       return format == GL_LUMINANCE && type == GL_UNSIGNED_BYTE;
  3012.    case MESA_FORMAT_L16:
  3013.       return format == GL_LUMINANCE && type == GL_UNSIGNED_SHORT && !swapBytes;
  3014.    case MESA_FORMAT_I8:
  3015.       return format == GL_INTENSITY && type == GL_UNSIGNED_BYTE;
  3016.    case MESA_FORMAT_I16:
  3017.       return format == GL_INTENSITY && type == GL_UNSIGNED_SHORT && !swapBytes;
  3018.  
  3019.    case MESA_FORMAT_YCBCR:
  3020.       return format == GL_YCBCR_MESA &&
  3021.              ((type == GL_UNSIGNED_SHORT_8_8_MESA && littleEndian != swapBytes) ||
  3022.               (type == GL_UNSIGNED_SHORT_8_8_REV_MESA && littleEndian == swapBytes));
  3023.    case MESA_FORMAT_YCBCR_REV:
  3024.       return format == GL_YCBCR_MESA &&
  3025.              ((type == GL_UNSIGNED_SHORT_8_8_MESA && littleEndian == swapBytes) ||
  3026.               (type == GL_UNSIGNED_SHORT_8_8_REV_MESA && littleEndian != swapBytes));
  3027.  
  3028.    case MESA_FORMAT_R8:
  3029.       return format == GL_RED && type == GL_UNSIGNED_BYTE;
  3030.    case MESA_FORMAT_GR88:
  3031.       return format == GL_RG && type == GL_UNSIGNED_BYTE && littleEndian;
  3032.    case MESA_FORMAT_RG88:
  3033.       return GL_FALSE;
  3034.  
  3035.    case MESA_FORMAT_R16:
  3036.       return format == GL_RED && type == GL_UNSIGNED_SHORT &&
  3037.          !swapBytes;
  3038.    case MESA_FORMAT_GR1616:
  3039.       return format == GL_RG && type == GL_UNSIGNED_SHORT && littleEndian &&
  3040.          !swapBytes;
  3041.    case MESA_FORMAT_RG1616:
  3042.       return GL_FALSE;
  3043.  
  3044.    case MESA_FORMAT_ARGB2101010:
  3045.       return format == GL_BGRA && type == GL_UNSIGNED_INT_2_10_10_10_REV &&
  3046.          !swapBytes;
  3047.  
  3048.    case MESA_FORMAT_Z24_S8:
  3049.       return format == GL_DEPTH_STENCIL && type == GL_UNSIGNED_INT_24_8 &&
  3050.          !swapBytes;
  3051.    case MESA_FORMAT_Z24_X8:
  3052.    case MESA_FORMAT_S8_Z24:
  3053.       return GL_FALSE;
  3054.  
  3055.    case MESA_FORMAT_Z16:
  3056.       return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_SHORT &&
  3057.          !swapBytes;
  3058.  
  3059.    case MESA_FORMAT_X8_Z24:
  3060.       return GL_FALSE;
  3061.  
  3062.    case MESA_FORMAT_Z32:
  3063.       return format == GL_DEPTH_COMPONENT && type == GL_UNSIGNED_INT &&
  3064.          !swapBytes;
  3065.  
  3066.    case MESA_FORMAT_S8:
  3067.       return format == GL_STENCIL_INDEX && type == GL_UNSIGNED_BYTE;
  3068.  
  3069.    case MESA_FORMAT_SRGB_DXT1:
  3070.    case MESA_FORMAT_SRGBA_DXT1:
  3071.    case MESA_FORMAT_SRGBA_DXT3:
  3072.    case MESA_FORMAT_SRGBA_DXT5:
  3073.       return GL_FALSE;
  3074.  
  3075.    case MESA_FORMAT_RGB_FXT1:
  3076.    case MESA_FORMAT_RGBA_FXT1:
  3077.    case MESA_FORMAT_RGB_DXT1:
  3078.    case MESA_FORMAT_RGBA_DXT1:
  3079.    case MESA_FORMAT_RGBA_DXT3:
  3080.    case MESA_FORMAT_RGBA_DXT5:
  3081.       return GL_FALSE;
  3082.  
  3083.    case MESA_FORMAT_RGBA_FLOAT32:
  3084.       return format == GL_RGBA && type == GL_FLOAT && !swapBytes;
  3085.    case MESA_FORMAT_RGBA_FLOAT16:
  3086.       return format == GL_RGBA && type == GL_HALF_FLOAT && !swapBytes;
  3087.  
  3088.    case MESA_FORMAT_RGB_FLOAT32:
  3089.       return format == GL_RGB && type == GL_FLOAT && !swapBytes;
  3090.    case MESA_FORMAT_RGB_FLOAT16:
  3091.       return format == GL_RGB && type == GL_HALF_FLOAT && !swapBytes;
  3092.  
  3093.    case MESA_FORMAT_ALPHA_FLOAT32:
  3094.       return format == GL_ALPHA && type == GL_FLOAT && !swapBytes;
  3095.    case MESA_FORMAT_ALPHA_FLOAT16:
  3096.       return format == GL_ALPHA && type == GL_HALF_FLOAT && !swapBytes;
  3097.  
  3098.    case MESA_FORMAT_LUMINANCE_FLOAT32:
  3099.       return format == GL_LUMINANCE && type == GL_FLOAT && !swapBytes;
  3100.    case MESA_FORMAT_LUMINANCE_FLOAT16:
  3101.       return format == GL_LUMINANCE && type == GL_HALF_FLOAT && !swapBytes;
  3102.  
  3103.    case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
  3104.       return format == GL_LUMINANCE_ALPHA && type == GL_FLOAT && !swapBytes;
  3105.    case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
  3106.       return format == GL_LUMINANCE_ALPHA && type == GL_HALF_FLOAT && !swapBytes;
  3107.  
  3108.    case MESA_FORMAT_INTENSITY_FLOAT32:
  3109.       return format == GL_INTENSITY && type == GL_FLOAT && !swapBytes;
  3110.    case MESA_FORMAT_INTENSITY_FLOAT16:
  3111.       return format == GL_INTENSITY && type == GL_HALF_FLOAT && !swapBytes;
  3112.  
  3113.    case MESA_FORMAT_R_FLOAT32:
  3114.       return format == GL_RED && type == GL_FLOAT && !swapBytes;
  3115.    case MESA_FORMAT_R_FLOAT16:
  3116.       return format == GL_RED && type == GL_HALF_FLOAT && !swapBytes;
  3117.  
  3118.    case MESA_FORMAT_RG_FLOAT32:
  3119.       return format == GL_RG && type == GL_FLOAT && !swapBytes;
  3120.    case MESA_FORMAT_RG_FLOAT16:
  3121.       return format == GL_RG && type == GL_HALF_FLOAT && !swapBytes;
  3122.  
  3123.    case MESA_FORMAT_ALPHA_UINT8:
  3124.       return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_BYTE;
  3125.    case MESA_FORMAT_ALPHA_UINT16:
  3126.       return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_SHORT &&
  3127.              !swapBytes;
  3128.    case MESA_FORMAT_ALPHA_UINT32:
  3129.       return format == GL_ALPHA_INTEGER && type == GL_UNSIGNED_INT &&
  3130.              !swapBytes;
  3131.    case MESA_FORMAT_ALPHA_INT8:
  3132.       return format == GL_ALPHA_INTEGER && type == GL_BYTE;
  3133.    case MESA_FORMAT_ALPHA_INT16:
  3134.       return format == GL_ALPHA_INTEGER && type == GL_SHORT && !swapBytes;
  3135.    case MESA_FORMAT_ALPHA_INT32:
  3136.       return format == GL_ALPHA_INTEGER && type == GL_INT && !swapBytes;
  3137.  
  3138.    case MESA_FORMAT_INTENSITY_UINT8:
  3139.    case MESA_FORMAT_INTENSITY_UINT16:
  3140.    case MESA_FORMAT_INTENSITY_UINT32:
  3141.    case MESA_FORMAT_INTENSITY_INT8:
  3142.    case MESA_FORMAT_INTENSITY_INT16:
  3143.    case MESA_FORMAT_INTENSITY_INT32:
  3144.       /* GL_INTENSITY_INTEGER_EXT doesn't exist. */
  3145.       return GL_FALSE;
  3146.  
  3147.    case MESA_FORMAT_LUMINANCE_UINT8:
  3148.       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_BYTE;
  3149.    case MESA_FORMAT_LUMINANCE_UINT16:
  3150.       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_SHORT &&
  3151.              !swapBytes;
  3152.    case MESA_FORMAT_LUMINANCE_UINT32:
  3153.       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_UNSIGNED_INT &&
  3154.              !swapBytes;
  3155.    case MESA_FORMAT_LUMINANCE_INT8:
  3156.       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_BYTE;
  3157.    case MESA_FORMAT_LUMINANCE_INT16:
  3158.       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_SHORT &&
  3159.              !swapBytes;
  3160.    case MESA_FORMAT_LUMINANCE_INT32:
  3161.       return format == GL_LUMINANCE_INTEGER_EXT && type == GL_INT && !swapBytes;
  3162.  
  3163.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT8:
  3164.       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
  3165.              type == GL_UNSIGNED_BYTE && !swapBytes;
  3166.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT16:
  3167.       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
  3168.              type == GL_UNSIGNED_SHORT && !swapBytes;
  3169.    case MESA_FORMAT_LUMINANCE_ALPHA_UINT32:
  3170.       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT &&
  3171.              type == GL_UNSIGNED_INT && !swapBytes;
  3172.    case MESA_FORMAT_LUMINANCE_ALPHA_INT8:
  3173.       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_BYTE &&
  3174.              !swapBytes;
  3175.    case MESA_FORMAT_LUMINANCE_ALPHA_INT16:
  3176.       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_SHORT &&
  3177.              !swapBytes;
  3178.    case MESA_FORMAT_LUMINANCE_ALPHA_INT32:
  3179.       return format == GL_LUMINANCE_ALPHA_INTEGER_EXT && type == GL_INT &&
  3180.              !swapBytes;
  3181.  
  3182.    case MESA_FORMAT_R_INT8:
  3183.       return format == GL_RED_INTEGER && type == GL_BYTE;
  3184.    case MESA_FORMAT_RG_INT8:
  3185.       return format == GL_RG_INTEGER && type == GL_BYTE && !swapBytes;
  3186.    case MESA_FORMAT_RGB_INT8:
  3187.       return format == GL_RGB_INTEGER && type == GL_BYTE && !swapBytes;
  3188.    case MESA_FORMAT_RGBA_INT8:
  3189.       return format == GL_RGBA_INTEGER && type == GL_BYTE && !swapBytes;
  3190.    case MESA_FORMAT_R_INT16:
  3191.       return format == GL_RED_INTEGER && type == GL_SHORT && !swapBytes;
  3192.    case MESA_FORMAT_RG_INT16:
  3193.       return format == GL_RG_INTEGER && type == GL_SHORT && !swapBytes;
  3194.    case MESA_FORMAT_RGB_INT16:
  3195.       return format == GL_RGB_INTEGER && type == GL_SHORT && !swapBytes;
  3196.    case MESA_FORMAT_RGBA_INT16:
  3197.       return format == GL_RGBA_INTEGER && type == GL_SHORT && !swapBytes;
  3198.    case MESA_FORMAT_R_INT32:
  3199.       return format == GL_RED_INTEGER && type == GL_INT && !swapBytes;
  3200.    case MESA_FORMAT_RG_INT32:
  3201.       return format == GL_RG_INTEGER && type == GL_INT && !swapBytes;
  3202.    case MESA_FORMAT_RGB_INT32:
  3203.       return format == GL_RGB_INTEGER && type == GL_INT && !swapBytes;
  3204.    case MESA_FORMAT_RGBA_INT32:
  3205.       return format == GL_RGBA_INTEGER && type == GL_INT && !swapBytes;
  3206.  
  3207.    case MESA_FORMAT_R_UINT8:
  3208.       return format == GL_RED_INTEGER && type == GL_UNSIGNED_BYTE;
  3209.    case MESA_FORMAT_RG_UINT8:
  3210.       return format == GL_RG_INTEGER && type == GL_UNSIGNED_BYTE && !swapBytes;
  3211.    case MESA_FORMAT_RGB_UINT8:
  3212.       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_BYTE && !swapBytes;
  3213.    case MESA_FORMAT_RGBA_UINT8:
  3214.       return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_BYTE &&
  3215.              !swapBytes;
  3216.    case MESA_FORMAT_R_UINT16:
  3217.       return format == GL_RED_INTEGER && type == GL_UNSIGNED_SHORT &&
  3218.              !swapBytes;
  3219.    case MESA_FORMAT_RG_UINT16:
  3220.       return format == GL_RG_INTEGER && type == GL_UNSIGNED_SHORT && !swapBytes;
  3221.    case MESA_FORMAT_RGB_UINT16:
  3222.       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_SHORT &&
  3223.              !swapBytes;
  3224.    case MESA_FORMAT_RGBA_UINT16:
  3225.       return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_SHORT &&
  3226.              !swapBytes;
  3227.    case MESA_FORMAT_R_UINT32:
  3228.       return format == GL_RED_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
  3229.    case MESA_FORMAT_RG_UINT32:
  3230.       return format == GL_RG_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
  3231.    case MESA_FORMAT_RGB_UINT32:
  3232.       return format == GL_RGB_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
  3233.    case MESA_FORMAT_RGBA_UINT32:
  3234.       return format == GL_RGBA_INTEGER && type == GL_UNSIGNED_INT && !swapBytes;
  3235.  
  3236.    case MESA_FORMAT_DUDV8:
  3237.       return (format == GL_DU8DV8_ATI || format == GL_DUDV_ATI) &&
  3238.              type == GL_BYTE && littleEndian && !swapBytes;
  3239.  
  3240.    case MESA_FORMAT_SIGNED_R8:
  3241.       return format == GL_RED && type == GL_BYTE;
  3242.    case MESA_FORMAT_SIGNED_RG88_REV:
  3243.       return format == GL_RG && type == GL_BYTE && littleEndian &&
  3244.              !swapBytes;
  3245.    case MESA_FORMAT_SIGNED_RGBX8888:
  3246.       return GL_FALSE;
  3247.  
  3248.    case MESA_FORMAT_SIGNED_RGBA8888:
  3249.       if (format == GL_RGBA && type == GL_BYTE && !littleEndian)
  3250.          return GL_TRUE;
  3251.  
  3252.       if (format == GL_ABGR_EXT && type == GL_BYTE && littleEndian)
  3253.          return GL_TRUE;
  3254.  
  3255.       return GL_FALSE;
  3256.  
  3257.    case MESA_FORMAT_SIGNED_RGBA8888_REV:
  3258.       if (format == GL_RGBA && type == GL_BYTE && littleEndian)
  3259.          return GL_TRUE;
  3260.  
  3261.       if (format == GL_ABGR_EXT && type == GL_BYTE && !littleEndian)
  3262.          return GL_TRUE;
  3263.  
  3264.       return GL_FALSE;
  3265.  
  3266.    case MESA_FORMAT_SIGNED_R16:
  3267.       return format == GL_RED && type == GL_SHORT &&
  3268.              !swapBytes;
  3269.    case MESA_FORMAT_SIGNED_GR1616:
  3270.       return format == GL_RG && type == GL_SHORT && littleEndian && !swapBytes;
  3271.    case MESA_FORMAT_SIGNED_RGB_16:
  3272.       return format == GL_RGB && type == GL_SHORT && !swapBytes;
  3273.    case MESA_FORMAT_SIGNED_RGBA_16:
  3274.       return format == GL_RGBA && type == GL_SHORT && !swapBytes;
  3275.    case MESA_FORMAT_RGBA_16:
  3276.       return format == GL_RGBA && type == GL_UNSIGNED_SHORT &&
  3277.              !swapBytes;
  3278.  
  3279.    case MESA_FORMAT_RED_RGTC1:
  3280.    case MESA_FORMAT_SIGNED_RED_RGTC1:
  3281.    case MESA_FORMAT_RG_RGTC2:
  3282.    case MESA_FORMAT_SIGNED_RG_RGTC2:
  3283.       return GL_FALSE;
  3284.  
  3285.    case MESA_FORMAT_L_LATC1:
  3286.    case MESA_FORMAT_SIGNED_L_LATC1:
  3287.    case MESA_FORMAT_LA_LATC2:
  3288.    case MESA_FORMAT_SIGNED_LA_LATC2:
  3289.       return GL_FALSE;
  3290.  
  3291.    case MESA_FORMAT_ETC1_RGB8:
  3292.    case MESA_FORMAT_ETC2_RGB8:
  3293.    case MESA_FORMAT_ETC2_SRGB8:
  3294.    case MESA_FORMAT_ETC2_RGBA8_EAC:
  3295.    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
  3296.    case MESA_FORMAT_ETC2_R11_EAC:
  3297.    case MESA_FORMAT_ETC2_RG11_EAC:
  3298.    case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
  3299.    case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
  3300.    case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
  3301.    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
  3302.       return GL_FALSE;
  3303.  
  3304.    case MESA_FORMAT_SIGNED_A8:
  3305.       return format == GL_ALPHA && type == GL_BYTE;
  3306.    case MESA_FORMAT_SIGNED_L8:
  3307.       return format == GL_LUMINANCE && type == GL_BYTE;
  3308.    case MESA_FORMAT_SIGNED_AL88:
  3309.       return format == GL_LUMINANCE_ALPHA && type == GL_BYTE &&
  3310.              littleEndian && !swapBytes;
  3311.    case MESA_FORMAT_SIGNED_I8:
  3312.       return format == GL_INTENSITY && type == GL_BYTE;
  3313.    case MESA_FORMAT_SIGNED_A16:
  3314.       return format == GL_ALPHA && type == GL_SHORT && !swapBytes;
  3315.    case MESA_FORMAT_SIGNED_L16:
  3316.       return format == GL_LUMINANCE && type == GL_SHORT && !swapBytes;
  3317.    case MESA_FORMAT_SIGNED_AL1616:
  3318.       return format == GL_LUMINANCE_ALPHA && type == GL_SHORT &&
  3319.              littleEndian && !swapBytes;
  3320.    case MESA_FORMAT_SIGNED_I16:
  3321.       return format == GL_INTENSITY && type == GL_SHORT && littleEndian &&
  3322.              !swapBytes;
  3323.  
  3324.    case MESA_FORMAT_ARGB2101010_UINT:
  3325.       return (format == GL_BGRA_INTEGER_EXT &&
  3326.               type == GL_UNSIGNED_INT_2_10_10_10_REV &&
  3327.               !swapBytes);
  3328.  
  3329.    case MESA_FORMAT_ABGR2101010_UINT:
  3330.       return (format == GL_RGBA_INTEGER_EXT &&
  3331.               type == GL_UNSIGNED_INT_2_10_10_10_REV &&
  3332.               !swapBytes);
  3333.  
  3334.    case MESA_FORMAT_RGB9_E5_FLOAT:
  3335.       return format == GL_RGB && type == GL_UNSIGNED_INT_5_9_9_9_REV &&
  3336.          !swapBytes;
  3337.  
  3338.    case MESA_FORMAT_R11_G11_B10_FLOAT:
  3339.       return format == GL_RGB && type == GL_UNSIGNED_INT_10F_11F_11F_REV &&
  3340.          !swapBytes;
  3341.  
  3342.    case MESA_FORMAT_Z32_FLOAT:
  3343.       return format == GL_DEPTH_COMPONENT && type == GL_FLOAT && !swapBytes;
  3344.  
  3345.    case MESA_FORMAT_Z32_FLOAT_X24S8:
  3346.       return format == GL_DEPTH_STENCIL &&
  3347.              type == GL_FLOAT_32_UNSIGNED_INT_24_8_REV && !swapBytes;
  3348.  
  3349.    case MESA_FORMAT_XRGB4444_UNORM:
  3350.    case MESA_FORMAT_XRGB1555_UNORM:
  3351.    case MESA_FORMAT_XBGR8888_SNORM:
  3352.    case MESA_FORMAT_XBGR8888_SRGB:
  3353.    case MESA_FORMAT_XBGR8888_UINT:
  3354.    case MESA_FORMAT_XBGR8888_SINT:
  3355.    case MESA_FORMAT_XRGB2101010_UNORM:
  3356.    case MESA_FORMAT_XBGR16161616_UNORM:
  3357.    case MESA_FORMAT_XBGR16161616_SNORM:
  3358.    case MESA_FORMAT_XBGR16161616_FLOAT:
  3359.    case MESA_FORMAT_XBGR16161616_UINT:
  3360.    case MESA_FORMAT_XBGR16161616_SINT:
  3361.    case MESA_FORMAT_XBGR32323232_FLOAT:
  3362.    case MESA_FORMAT_XBGR32323232_UINT:
  3363.    case MESA_FORMAT_XBGR32323232_SINT:
  3364.       return GL_FALSE;
  3365.    }
  3366.  
  3367.    return GL_FALSE;
  3368. }
  3369.  
  3370.