Subversion Repositories Kolibri OS

Rev

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

  1. /*
  2.  * Mesa 3-D graphics library
  3.  * Version:  7.7
  4.  *
  5.  * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
  6.  * Copyright (c) 2008-2009  VMware, Inc.
  7.  *
  8.  * Permission is hereby granted, free of charge, to any person obtaining a
  9.  * copy of this software and associated documentation files (the "Software"),
  10.  * to deal in the Software without restriction, including without limitation
  11.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  12.  * and/or sell copies of the Software, and to permit persons to whom the
  13.  * Software is furnished to do so, subject to the following conditions:
  14.  *
  15.  * The above copyright notice and this permission notice shall be included
  16.  * in all copies or substantial portions of the Software.
  17.  *
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  19.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  21.  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
  22.  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  23.  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24.  */
  25.  
  26.  
  27. #include "imports.h"
  28. #include "formats.h"
  29. #include "mfeatures.h"
  30.  
  31.  
  32. /**
  33.  * Information about texture formats.
  34.  */
  35. struct gl_format_info
  36. {
  37.    gl_format Name;
  38.  
  39.    /** text name for debugging */
  40.    const char *StrName;
  41.  
  42.    /**
  43.     * Base format is one of GL_RGB, GL_RGBA, GL_ALPHA, GL_LUMINANCE,
  44.     * GL_LUMINANCE_ALPHA, GL_INTENSITY, GL_YCBCR_MESA, GL_COLOR_INDEX,
  45.     * GL_DEPTH_COMPONENT, GL_STENCIL_INDEX, GL_DEPTH_STENCIL.
  46.     */
  47.    GLenum BaseFormat;
  48.  
  49.    /**
  50.     * Logical data type: one of  GL_UNSIGNED_NORMALIZED, GL_SIGNED_NORMALED,
  51.     * GL_UNSIGNED_INT, GL_INT, GL_FLOAT.
  52.     */
  53.    GLenum DataType;
  54.  
  55.    GLubyte RedBits;
  56.    GLubyte GreenBits;
  57.    GLubyte BlueBits;
  58.    GLubyte AlphaBits;
  59.    GLubyte LuminanceBits;
  60.    GLubyte IntensityBits;
  61.    GLubyte IndexBits;
  62.    GLubyte DepthBits;
  63.    GLubyte StencilBits;
  64.  
  65.    /**
  66.     * To describe compressed formats.  If not compressed, Width=Height=1.
  67.     */
  68.    GLubyte BlockWidth, BlockHeight;
  69.    GLubyte BytesPerBlock;
  70. };
  71.  
  72.  
  73. /**
  74.  * Info about each format.
  75.  * These must be in the same order as the MESA_FORMAT_* enums so that
  76.  * we can do lookups without searching.
  77.  */
  78. static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
  79. {
  80.    {
  81.       MESA_FORMAT_NONE,            /* Name */
  82.       "MESA_FORMAT_NONE",          /* StrName */
  83.       GL_NONE,                     /* BaseFormat */
  84.       GL_NONE,                     /* DataType */
  85.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  86.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  87.       0, 0, 0                      /* BlockWidth/Height,Bytes */
  88.    },
  89.    {
  90.       MESA_FORMAT_RGBA8888,        /* Name */
  91.       "MESA_FORMAT_RGBA8888",      /* StrName */
  92.       GL_RGBA,                     /* BaseFormat */
  93.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  94.       8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
  95.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  96.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  97.    },
  98.    {
  99.       MESA_FORMAT_RGBA8888_REV,    /* Name */
  100.       "MESA_FORMAT_RGBA8888_REV",  /* StrName */
  101.       GL_RGBA,                     /* BaseFormat */
  102.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  103.       8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
  104.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  105.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  106.    },
  107.    {
  108.       MESA_FORMAT_ARGB8888,        /* Name */
  109.       "MESA_FORMAT_ARGB8888",      /* StrName */
  110.       GL_RGBA,                     /* BaseFormat */
  111.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  112.       8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
  113.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  114.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  115.    },
  116.    {
  117.       MESA_FORMAT_ARGB8888_REV,    /* Name */
  118.       "MESA_FORMAT_ARGB8888_REV",  /* StrName */
  119.       GL_RGBA,                     /* BaseFormat */
  120.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  121.       8, 8, 8, 8,                  /* Red/Green/Blue/AlphaBits */
  122.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  123.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  124.    },
  125.    {
  126.       MESA_FORMAT_XRGB8888,        /* Name */
  127.       "MESA_FORMAT_XRGB8888",      /* StrName */
  128.       GL_RGB,                      /* BaseFormat */
  129.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  130.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  131.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  132.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  133.    },
  134.    {
  135.       MESA_FORMAT_XRGB8888_REV,    /* Name */
  136.       "MESA_FORMAT_XRGB8888_REV",  /* StrName */
  137.       GL_RGB,                      /* BaseFormat */
  138.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  139.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  140.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  141.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  142.    },
  143.    {
  144.       MESA_FORMAT_RGB888,          /* Name */
  145.       "MESA_FORMAT_RGB888",        /* StrName */
  146.       GL_RGB,                      /* BaseFormat */
  147.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  148.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  149.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  150.       1, 1, 3                      /* BlockWidth/Height,Bytes */
  151.    },
  152.    {
  153.       MESA_FORMAT_BGR888,          /* Name */
  154.       "MESA_FORMAT_BGR888",        /* StrName */
  155.       GL_RGB,                      /* BaseFormat */
  156.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  157.       8, 8, 8, 0,                  /* Red/Green/Blue/AlphaBits */
  158.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  159.       1, 1, 3                      /* BlockWidth/Height,Bytes */
  160.    },
  161.    {
  162.       MESA_FORMAT_RGB565,          /* Name */
  163.       "MESA_FORMAT_RGB565",        /* StrName */
  164.       GL_RGB,                      /* BaseFormat */
  165.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  166.       5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */
  167.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  168.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  169.    },
  170.    {
  171.       MESA_FORMAT_RGB565_REV,      /* Name */
  172.       "MESA_FORMAT_RGB565_REV",    /* StrName */
  173.       GL_RGB,                      /* BaseFormat */
  174.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  175.       5, 6, 5, 0,                  /* Red/Green/Blue/AlphaBits */
  176.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  177.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  178.    },
  179.    {
  180.       MESA_FORMAT_ARGB4444,        /* Name */
  181.       "MESA_FORMAT_ARGB4444",      /* StrName */
  182.       GL_RGBA,                     /* BaseFormat */
  183.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  184.       4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
  185.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  186.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  187.    },
  188.    {
  189.       MESA_FORMAT_ARGB4444_REV,    /* Name */
  190.       "MESA_FORMAT_ARGB4444_REV",  /* StrName */
  191.       GL_RGBA,                     /* BaseFormat */
  192.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  193.       4, 4, 4, 4,                  /* Red/Green/Blue/AlphaBits */
  194.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  195.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  196.    },
  197.    {
  198.       MESA_FORMAT_RGBA5551,        /* Name */
  199.       "MESA_FORMAT_RGBA5551",      /* StrName */
  200.       GL_RGBA,                     /* BaseFormat */
  201.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  202.       5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
  203.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  204.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  205.    },
  206.    {
  207.       MESA_FORMAT_ARGB1555,        /* Name */
  208.       "MESA_FORMAT_ARGB1555",      /* StrName */
  209.       GL_RGBA,                     /* BaseFormat */
  210.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  211.       5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
  212.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  213.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  214.    },
  215.    {
  216.       MESA_FORMAT_ARGB1555_REV,    /* Name */
  217.       "MESA_FORMAT_ARGB1555_REV",  /* StrName */
  218.       GL_RGBA,                     /* BaseFormat */
  219.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  220.       5, 5, 5, 1,                  /* Red/Green/Blue/AlphaBits */
  221.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  222.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  223.    },
  224.    {
  225.       MESA_FORMAT_AL88,            /* Name */
  226.       "MESA_FORMAT_AL88",          /* StrName */
  227.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  228.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  229.       0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
  230.       8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  231.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  232.    },
  233.    {
  234.       MESA_FORMAT_AL88_REV,        /* Name */
  235.       "MESA_FORMAT_AL88_REV",      /* StrName */
  236.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  237.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  238.       0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
  239.       8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  240.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  241.    },
  242.    {
  243.       MESA_FORMAT_AL1616,          /* Name */
  244.       "MESA_FORMAT_AL1616",        /* StrName */
  245.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  246.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  247.       0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */
  248.       16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
  249.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  250.    },
  251.    {
  252.       MESA_FORMAT_AL1616_REV,      /* Name */
  253.       "MESA_FORMAT_AL1616_REV",    /* StrName */
  254.       GL_LUMINANCE_ALPHA,          /* BaseFormat */
  255.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  256.       0, 0, 0, 16,                 /* Red/Green/Blue/AlphaBits */
  257.       16, 0, 0, 0, 0,              /* Lum/Int/Index/Depth/StencilBits */
  258.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  259.    },
  260.    {
  261.       MESA_FORMAT_RGB332,          /* Name */
  262.       "MESA_FORMAT_RGB332",        /* StrName */
  263.       GL_RGB,                      /* BaseFormat */
  264.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  265.       3, 3, 2, 0,                  /* Red/Green/Blue/AlphaBits */
  266.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  267.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  268.    },
  269.    {
  270.       MESA_FORMAT_A8,              /* Name */
  271.       "MESA_FORMAT_A8",            /* StrName */
  272.       GL_ALPHA,                    /* BaseFormat */
  273.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  274.       0, 0, 0, 8,                  /* Red/Green/Blue/AlphaBits */
  275.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  276.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  277.    },
  278.    {
  279.       MESA_FORMAT_L8,              /* Name */
  280.       "MESA_FORMAT_L8",            /* StrName */
  281.       GL_LUMINANCE,                /* BaseFormat */
  282.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  283.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  284.       8, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  285.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  286.    },
  287.    {
  288.       MESA_FORMAT_I8,              /* Name */
  289.       "MESA_FORMAT_I8",            /* StrName */
  290.       GL_INTENSITY,                /* BaseFormat */
  291.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  292.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  293.       0, 8, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  294.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  295.    },
  296.    {
  297.       MESA_FORMAT_CI8,             /* Name */
  298.       "MESA_FORMAT_CI8",           /* StrName */
  299.       GL_COLOR_INDEX,              /* BaseFormat */
  300.       GL_UNSIGNED_INT,             /* DataType */
  301.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  302.       0, 0, 8, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  303.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  304.    },
  305.    {
  306.       MESA_FORMAT_YCBCR,           /* Name */
  307.       "MESA_FORMAT_YCBCR",         /* StrName */
  308.       GL_YCBCR_MESA,               /* BaseFormat */
  309.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  310.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  311.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  312.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  313.    },
  314.    {
  315.       MESA_FORMAT_YCBCR_REV,       /* Name */
  316.       "MESA_FORMAT_YCBCR_REV",     /* StrName */
  317.       GL_YCBCR_MESA,               /* BaseFormat */
  318.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  319.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  320.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  321.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  322.    },
  323.    {
  324.       MESA_FORMAT_R8,
  325.       "MESA_FORMAT_R8",
  326.       GL_RED,
  327.       GL_UNSIGNED_NORMALIZED,
  328.       8, 0, 0, 0,
  329.       0, 0, 0, 0, 0,
  330.       1, 1, 1
  331.    },
  332.    {
  333.       MESA_FORMAT_RG88,
  334.       "MESA_FORMAT_RG88",
  335.       GL_RG,
  336.       GL_UNSIGNED_NORMALIZED,
  337.       8, 8, 0, 0,
  338.       0, 0, 0, 0, 0,
  339.       1, 1, 2
  340.    },
  341.    {
  342.       MESA_FORMAT_RG88_REV,
  343.       "MESA_FORMAT_RG88_REV",
  344.       GL_RG,
  345.       GL_UNSIGNED_NORMALIZED,
  346.       8, 8, 0, 0,
  347.       0, 0, 0, 0, 0,
  348.       1, 1, 2
  349.    },
  350.    {
  351.       MESA_FORMAT_R16,
  352.       "MESA_FORMAT_R16",
  353.       GL_RED,
  354.       GL_UNSIGNED_NORMALIZED,
  355.       16, 0, 0, 0,
  356.       0, 0, 0, 0, 0,
  357.       1, 1, 2
  358.    },
  359.    {
  360.       MESA_FORMAT_RG1616,
  361.       "MESA_FORMAT_RG1616",
  362.       GL_RG,
  363.       GL_UNSIGNED_NORMALIZED,
  364.       16, 16, 0, 0,
  365.       0, 0, 0, 0, 0,
  366.       1, 1, 4
  367.    },
  368.    {
  369.       MESA_FORMAT_RG1616_REV,
  370.       "MESA_FORMAT_RG1616_REV",
  371.       GL_RG,
  372.       GL_UNSIGNED_NORMALIZED,
  373.       16, 16, 0, 0,
  374.       0, 0, 0, 0, 0,
  375.       1, 1, 4
  376.    },
  377.    {
  378.       MESA_FORMAT_Z24_S8,          /* Name */
  379.       "MESA_FORMAT_Z24_S8",        /* StrName */
  380.       GL_DEPTH_STENCIL,            /* BaseFormat */
  381.       GL_UNSIGNED_INT,             /* DataType */
  382.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  383.       0, 0, 0, 24, 8,              /* Lum/Int/Index/Depth/StencilBits */
  384.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  385.    },
  386.    {
  387.       MESA_FORMAT_S8_Z24,          /* Name */
  388.       "MESA_FORMAT_S8_Z24",        /* StrName */
  389.       GL_DEPTH_STENCIL,            /* BaseFormat */
  390.       GL_UNSIGNED_INT,             /* DataType */
  391.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  392.       0, 0, 0, 24, 8,              /* Lum/Int/Index/Depth/StencilBits */
  393.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  394.    },
  395.    {
  396.       MESA_FORMAT_Z16,             /* Name */
  397.       "MESA_FORMAT_Z16",           /* StrName */
  398.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  399.       GL_UNSIGNED_INT,             /* DataType */
  400.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  401.       0, 0, 0, 16, 0,              /* Lum/Int/Index/Depth/StencilBits */
  402.       1, 1, 2                      /* BlockWidth/Height,Bytes */
  403.    },
  404.    {
  405.       MESA_FORMAT_X8_Z24,          /* Name */
  406.       "MESA_FORMAT_X8_Z24",        /* StrName */
  407.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  408.       GL_UNSIGNED_INT,             /* DataType */
  409.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  410.       0, 0, 0, 24, 0,              /* Lum/Int/Index/Depth/StencilBits */
  411.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  412.    },
  413.    {
  414.       MESA_FORMAT_Z24_X8,          /* Name */
  415.       "MESA_FORMAT_Z24_X8",        /* StrName */
  416.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  417.       GL_UNSIGNED_INT,             /* DataType */
  418.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  419.       0, 0, 0, 24, 0,              /* Lum/Int/Index/Depth/StencilBits */
  420.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  421.    },
  422.    {
  423.       MESA_FORMAT_Z32,             /* Name */
  424.       "MESA_FORMAT_Z32",           /* StrName */
  425.       GL_DEPTH_COMPONENT,          /* BaseFormat */
  426.       GL_UNSIGNED_INT,             /* DataType */
  427.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  428.       0, 0, 0, 32, 0,              /* Lum/Int/Index/Depth/StencilBits */
  429.       1, 1, 4                      /* BlockWidth/Height,Bytes */
  430.    },
  431.    {
  432.       MESA_FORMAT_S8,              /* Name */
  433.       "MESA_FORMAT_S8",            /* StrName */
  434.       GL_STENCIL_INDEX,            /* BaseFormat */
  435.       GL_UNSIGNED_INT,             /* DataType */
  436.       0, 0, 0, 0,                  /* Red/Green/Blue/AlphaBits */
  437.       0, 0, 0, 0, 8,               /* Lum/Int/Index/Depth/StencilBits */
  438.       1, 1, 1                      /* BlockWidth/Height,Bytes */
  439.    },
  440.    {
  441.       MESA_FORMAT_SRGB8,
  442.       "MESA_FORMAT_SRGB8",
  443.       GL_RGB,
  444.       GL_UNSIGNED_NORMALIZED,
  445.       8, 8, 8, 0,
  446.       0, 0, 0, 0, 0,
  447.       1, 1, 3
  448.    },
  449.    {
  450.       MESA_FORMAT_SRGBA8,
  451.       "MESA_FORMAT_SRGBA8",
  452.       GL_RGBA,
  453.       GL_UNSIGNED_NORMALIZED,    
  454.       8, 8, 8, 8,
  455.       0, 0, 0, 0, 0,
  456.       1, 1, 4
  457.    },
  458.    {
  459.       MESA_FORMAT_SARGB8,
  460.       "MESA_FORMAT_SARGB8",
  461.       GL_RGBA,
  462.       GL_UNSIGNED_NORMALIZED,    
  463.       8, 8, 8, 8,
  464.       0, 0, 0, 0, 0,
  465.       1, 1, 4
  466.    },
  467.    {
  468.       MESA_FORMAT_SL8,
  469.       "MESA_FORMAT_SL8",
  470.       GL_LUMINANCE,
  471.       GL_UNSIGNED_NORMALIZED,    
  472.       0, 0, 0, 0,
  473.       8, 0, 0, 0, 0,
  474.       1, 1, 1
  475.    },
  476.    {
  477.       MESA_FORMAT_SLA8,
  478.       "MESA_FORMAT_SLA8",
  479.       GL_LUMINANCE_ALPHA,
  480.       GL_UNSIGNED_NORMALIZED,    
  481.       0, 0, 0, 8,
  482.       8, 0, 0, 0, 0,
  483.       1, 1, 2
  484.    },
  485.    {
  486.       MESA_FORMAT_SRGB_DXT1,       /* Name */
  487.       "MESA_FORMAT_SRGB_DXT1",     /* StrName */
  488.       GL_RGB,                      /* BaseFormat */
  489.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  490.       4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */
  491.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  492.       4, 4, 8                      /* 8 bytes per 4x4 block */
  493.    },
  494.    {
  495.       MESA_FORMAT_SRGBA_DXT1,
  496.       "MESA_FORMAT_SRGBA_DXT1",
  497.       GL_RGBA,
  498.       GL_UNSIGNED_NORMALIZED,
  499.       4, 4, 4, 4,
  500.       0, 0, 0, 0, 0,
  501.       4, 4, 8                      /* 8 bytes per 4x4 block */
  502.    },
  503.    {
  504.       MESA_FORMAT_SRGBA_DXT3,
  505.       "MESA_FORMAT_SRGBA_DXT3",
  506.       GL_RGBA,
  507.       GL_UNSIGNED_NORMALIZED,
  508.       4, 4, 4, 4,
  509.       0, 0, 0, 0, 0,
  510.       4, 4, 16                     /* 16 bytes per 4x4 block */
  511.    },
  512.    {
  513.       MESA_FORMAT_SRGBA_DXT5,
  514.       "MESA_FORMAT_SRGBA_DXT5",
  515.       GL_RGBA,
  516.       GL_UNSIGNED_NORMALIZED,
  517.       4, 4, 4, 4,
  518.       0, 0, 0, 0, 0,
  519.       4, 4, 16                     /* 16 bytes per 4x4 block */
  520.    },
  521.  
  522.    {
  523.       MESA_FORMAT_RGB_FXT1,
  524.       "MESA_FORMAT_RGB_FXT1",
  525.       GL_RGB,
  526.       GL_UNSIGNED_NORMALIZED,
  527.       4, 4, 4, 0,                  /* approx Red/Green/BlueBits */
  528.       0, 0, 0, 0, 0,
  529.       8, 4, 16                     /* 16 bytes per 8x4 block */
  530.    },
  531.    {
  532.       MESA_FORMAT_RGBA_FXT1,
  533.       "MESA_FORMAT_RGBA_FXT1",
  534.       GL_RGBA,
  535.       GL_UNSIGNED_NORMALIZED,
  536.       4, 4, 4, 1,                  /* approx Red/Green/Blue/AlphaBits */
  537.       0, 0, 0, 0, 0,
  538.       8, 4, 16                     /* 16 bytes per 8x4 block */
  539.    },
  540.  
  541.    {
  542.       MESA_FORMAT_RGB_DXT1,        /* Name */
  543.       "MESA_FORMAT_RGB_DXT1",      /* StrName */
  544.       GL_RGB,                      /* BaseFormat */
  545.       GL_UNSIGNED_NORMALIZED,      /* DataType */
  546.       4, 4, 4, 0,                  /* approx Red/Green/Blue/AlphaBits */
  547.       0, 0, 0, 0, 0,               /* Lum/Int/Index/Depth/StencilBits */
  548.       4, 4, 8                      /* 8 bytes per 4x4 block */
  549.    },
  550.    {
  551.       MESA_FORMAT_RGBA_DXT1,
  552.       "MESA_FORMAT_RGBA_DXT1",
  553.       GL_RGBA,
  554.       GL_UNSIGNED_NORMALIZED,    
  555.       4, 4, 4, 4,
  556.       0, 0, 0, 0, 0,
  557.       4, 4, 8                      /* 8 bytes per 4x4 block */
  558.    },
  559.    {
  560.       MESA_FORMAT_RGBA_DXT3,
  561.       "MESA_FORMAT_RGBA_DXT3",
  562.       GL_RGBA,
  563.       GL_UNSIGNED_NORMALIZED,    
  564.       4, 4, 4, 4,
  565.       0, 0, 0, 0, 0,
  566.       4, 4, 16                     /* 16 bytes per 4x4 block */
  567.    },
  568.    {
  569.       MESA_FORMAT_RGBA_DXT5,
  570.       "MESA_FORMAT_RGBA_DXT5",
  571.       GL_RGBA,
  572.       GL_UNSIGNED_NORMALIZED,    
  573.       4, 4, 4, 4,
  574.       0, 0, 0, 0, 0,
  575.       4, 4, 16                     /* 16 bytes per 4x4 block */
  576.    },
  577.    {
  578.       MESA_FORMAT_RGBA_FLOAT32,
  579.       "MESA_FORMAT_RGBA_FLOAT32",
  580.       GL_RGBA,
  581.       GL_FLOAT,
  582.       32, 32, 32, 32,
  583.       0, 0, 0, 0, 0,
  584.       1, 1, 16
  585.    },
  586.    {
  587.       MESA_FORMAT_RGBA_FLOAT16,
  588.       "MESA_FORMAT_RGBA_FLOAT16",
  589.       GL_RGBA,
  590.       GL_FLOAT,
  591.       16, 16, 16, 16,
  592.       0, 0, 0, 0, 0,
  593.       1, 1, 8
  594.    },
  595.    {
  596.       MESA_FORMAT_RGB_FLOAT32,
  597.       "MESA_FORMAT_RGB_FLOAT32",
  598.       GL_RGB,
  599.       GL_FLOAT,
  600.       32, 32, 32, 0,
  601.       0, 0, 0, 0, 0,
  602.       1, 1, 12
  603.    },
  604.    {
  605.       MESA_FORMAT_RGB_FLOAT16,
  606.       "MESA_FORMAT_RGB_FLOAT16",
  607.       GL_RGB,
  608.       GL_FLOAT,
  609.       16, 16, 16, 0,
  610.       0, 0, 0, 0, 0,
  611.       1, 1, 6
  612.    },
  613.    {
  614.       MESA_FORMAT_ALPHA_FLOAT32,
  615.       "MESA_FORMAT_ALPHA_FLOAT32",
  616.       GL_ALPHA,
  617.       GL_FLOAT,
  618.       0, 0, 0, 32,
  619.       0, 0, 0, 0, 0,
  620.       1, 1, 4
  621.    },
  622.    {
  623.       MESA_FORMAT_ALPHA_FLOAT16,
  624.       "MESA_FORMAT_ALPHA_FLOAT16",
  625.       GL_ALPHA,
  626.       GL_FLOAT,
  627.       0, 0, 0, 16,
  628.       0, 0, 0, 0, 0,
  629.       1, 1, 2
  630.    },
  631.    {
  632.       MESA_FORMAT_LUMINANCE_FLOAT32,
  633.       "MESA_FORMAT_LUMINANCE_FLOAT32",
  634.       GL_ALPHA,
  635.       GL_FLOAT,
  636.       0, 0, 0, 0,
  637.       32, 0, 0, 0, 0,
  638.       1, 1, 4
  639.    },
  640.    {
  641.       MESA_FORMAT_LUMINANCE_FLOAT16,
  642.       "MESA_FORMAT_LUMINANCE_FLOAT16",
  643.       GL_ALPHA,
  644.       GL_FLOAT,
  645.       0, 0, 0, 0,
  646.       16, 0, 0, 0, 0,
  647.       1, 1, 2
  648.    },
  649.    {
  650.       MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32,
  651.       "MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32",
  652.       GL_LUMINANCE_ALPHA,
  653.       GL_FLOAT,
  654.       0, 0, 0, 32,
  655.       32, 0, 0, 0, 0,
  656.       1, 1, 8
  657.    },
  658.    {
  659.       MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16,
  660.       "MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16",
  661.       GL_LUMINANCE_ALPHA,
  662.       GL_FLOAT,
  663.       0, 0, 0, 16,
  664.       16, 0, 0, 0, 0,
  665.       1, 1, 4
  666.    },
  667.    {
  668.       MESA_FORMAT_INTENSITY_FLOAT32,
  669.       "MESA_FORMAT_INTENSITY_FLOAT32",
  670.       GL_INTENSITY,
  671.       GL_FLOAT,
  672.       0, 0, 0, 0,
  673.       0, 32, 0, 0, 0,
  674.       1, 1, 4
  675.    },
  676.    {
  677.       MESA_FORMAT_INTENSITY_FLOAT16,
  678.       "MESA_FORMAT_INTENSITY_FLOAT16",
  679.       GL_INTENSITY,
  680.       GL_FLOAT,
  681.       0, 0, 0, 0,
  682.       0, 16, 0, 0, 0,
  683.       1, 1, 2
  684.    },
  685.  
  686.    /* unnormalized signed int formats */
  687.    {
  688.       MESA_FORMAT_RGBA_INT8,
  689.       "MESA_FORMAT_RGBA_INT8",
  690.       GL_RGBA,
  691.       GL_INT,
  692.       8, 8, 8, 8,
  693.       0, 0, 0, 0, 0,
  694.       1, 1, 4
  695.    },
  696.    {
  697.       MESA_FORMAT_RGBA_INT16,
  698.       "MESA_FORMAT_RGBA_INT16",
  699.       GL_RGBA,
  700.       GL_INT,
  701.       16, 16, 16, 16,
  702.       0, 0, 0, 0, 0,
  703.       1, 1, 8
  704.    },
  705.    {
  706.       MESA_FORMAT_RGBA_INT32,
  707.       "MESA_FORMAT_RGBA_INT32",
  708.       GL_RGBA,
  709.       GL_INT,
  710.       32, 32, 32, 32,
  711.       0, 0, 0, 0, 0,
  712.       1, 1, 16
  713.    },
  714.  
  715.    /* unnormalized unsigned int formats */
  716.    {
  717.       MESA_FORMAT_RGBA_UINT8,
  718.       "MESA_FORMAT_RGBA_UINT8",
  719.       GL_RGBA,
  720.       GL_UNSIGNED_INT,
  721.       8, 8, 8, 8,
  722.       0, 0, 0, 0, 0,
  723.       1, 1, 4
  724.    },
  725.    {
  726.       MESA_FORMAT_RGBA_UINT16,
  727.       "MESA_FORMAT_RGBA_UINT16",
  728.       GL_RGBA,
  729.       GL_UNSIGNED_INT,
  730.       16, 16, 16, 16,
  731.       0, 0, 0, 0, 0,
  732.       1, 1, 8
  733.    },
  734.    {
  735.       MESA_FORMAT_RGBA_UINT32,
  736.       "MESA_FORMAT_RGBA_UINT32",
  737.       GL_RGBA,
  738.       GL_UNSIGNED_INT,
  739.       32, 32, 32, 32,
  740.       0, 0, 0, 0, 0,
  741.       1, 1, 16
  742.    },
  743.  
  744.  
  745.    {
  746.       MESA_FORMAT_DUDV8,
  747.       "MESA_FORMAT_DUDV8",
  748.       GL_DUDV_ATI,
  749.       GL_SIGNED_NORMALIZED,
  750.       0, 0, 0, 0,
  751.       0, 0, 0, 0, 0,
  752.       1, 1, 2
  753.    },
  754.  
  755.    /* Signed 8 bits / channel */
  756.    {
  757.       MESA_FORMAT_SIGNED_R8,        /* Name */
  758.       "MESA_FORMAT_SIGNED_R8",      /* StrName */
  759.       GL_RED,                       /* BaseFormat */
  760.       GL_SIGNED_NORMALIZED,         /* DataType */
  761.       8, 0, 0, 0,                   /* Red/Green/Blue/AlphaBits */
  762.       0, 0, 0, 0, 0,                /* Lum/Int/Index/Depth/StencilBits */
  763.       1, 1, 1                       /* BlockWidth/Height,Bytes */
  764.    },
  765.    {
  766.       MESA_FORMAT_SIGNED_RG88,
  767.       "MESA_FORMAT_SIGNED_RG88",
  768.       GL_RG,
  769.       GL_SIGNED_NORMALIZED,
  770.       8, 8, 0, 0,
  771.       0, 0, 0, 0, 0,
  772.       1, 1, 2
  773.    },
  774.    {
  775.       MESA_FORMAT_SIGNED_RGBX8888,
  776.       "MESA_FORMAT_SIGNED_RGBX8888",
  777.       GL_RGB,
  778.       GL_SIGNED_NORMALIZED,
  779.       8, 8, 8, 0,
  780.       0, 0, 0, 0, 0,
  781.       1, 1, 4                       /* 4 bpp, but no alpha */
  782.    },
  783.    {
  784.       MESA_FORMAT_SIGNED_RGBA8888,
  785.       "MESA_FORMAT_SIGNED_RGBA8888",
  786.       GL_RGBA,
  787.       GL_SIGNED_NORMALIZED,
  788.       8, 8, 8, 8,
  789.       0, 0, 0, 0, 0,
  790.       1, 1, 4
  791.    },
  792.    {
  793.       MESA_FORMAT_SIGNED_RGBA8888_REV,
  794.       "MESA_FORMAT_SIGNED_RGBA8888_REV",
  795.       GL_RGBA,
  796.       GL_SIGNED_NORMALIZED,
  797.       8, 8, 8, 8,
  798.       0, 0, 0, 0, 0,
  799.       1, 1, 4
  800.    },
  801.  
  802.    /* Signed 16 bits / channel */
  803.    {
  804.       MESA_FORMAT_SIGNED_R_16,
  805.       "MESA_FORMAT_SIGNED_R_16",
  806.       GL_RED,
  807.       GL_SIGNED_NORMALIZED,
  808.       16, 0, 0, 0,
  809.       0, 0, 0, 0, 0,
  810.       1, 1, 2
  811.    },
  812.    {
  813.       MESA_FORMAT_SIGNED_RG_16,
  814.       "MESA_FORMAT_SIGNED_RG_16",
  815.       GL_RG,
  816.       GL_SIGNED_NORMALIZED,
  817.       16, 16, 0, 0,
  818.       0, 0, 0, 0, 0,
  819.       1, 1, 4
  820.    },
  821.    {
  822.       MESA_FORMAT_SIGNED_RGB_16,
  823.       "MESA_FORMAT_SIGNED_RGB_16",
  824.       GL_RGB,
  825.       GL_SIGNED_NORMALIZED,
  826.       16, 16, 16, 0,
  827.       0, 0, 0, 0, 0,
  828.       1, 1, 6
  829.    },
  830.    {
  831.       MESA_FORMAT_SIGNED_RGBA_16,
  832.       "MESA_FORMAT_SIGNED_RGBA_16",
  833.       GL_RGBA,
  834.       GL_SIGNED_NORMALIZED,
  835.       16, 16, 16, 16,
  836.       0, 0, 0, 0, 0,
  837.       1, 1, 8
  838.    },
  839.    {
  840.       MESA_FORMAT_RGBA_16,
  841.       "MESA_FORMAT_RGBA_16",
  842.       GL_RGBA,
  843.       GL_UNSIGNED_NORMALIZED,
  844.       16, 16, 16, 16,
  845.       0, 0, 0, 0, 0,
  846.       1, 1, 8
  847.    }
  848. };
  849.  
  850.  
  851.  
  852. static const struct gl_format_info *
  853. _mesa_get_format_info(gl_format format)
  854. {
  855.    const struct gl_format_info *info = &format_info[format];
  856.    assert(info->Name == format);
  857.    return info;
  858. }
  859.  
  860.  
  861. /** Return string name of format (for debugging) */
  862. const char *
  863. _mesa_get_format_name(gl_format format)
  864. {
  865.    const struct gl_format_info *info = _mesa_get_format_info(format);
  866.    ASSERT(info->BytesPerBlock);
  867.    return info->StrName;
  868. }
  869.  
  870.  
  871.  
  872. /**
  873.  * Return bytes needed to store a block of pixels in the given format.
  874.  * Normally, a block is 1x1 (a single pixel).  But for compressed formats
  875.  * a block may be 4x4 or 8x4, etc.
  876.  */
  877. GLuint
  878. _mesa_get_format_bytes(gl_format format)
  879. {
  880.    const struct gl_format_info *info = _mesa_get_format_info(format);
  881.    ASSERT(info->BytesPerBlock);
  882.    return info->BytesPerBlock;
  883. }
  884.  
  885.  
  886. /**
  887.  * Return bits per component for the given format.
  888.  * \param format  one of MESA_FORMAT_x
  889.  * \param pname  the component, such as GL_RED_BITS, GL_TEXTURE_BLUE_BITS, etc.
  890.  */
  891. GLint
  892. _mesa_get_format_bits(gl_format format, GLenum pname)
  893. {
  894.    const struct gl_format_info *info = _mesa_get_format_info(format);
  895.  
  896.    switch (pname) {
  897.    case GL_RED_BITS:
  898.    case GL_TEXTURE_RED_SIZE:
  899.    case GL_RENDERBUFFER_RED_SIZE_EXT:
  900.    case GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE:
  901.       return info->RedBits;
  902.    case GL_GREEN_BITS:
  903.    case GL_TEXTURE_GREEN_SIZE:
  904.    case GL_RENDERBUFFER_GREEN_SIZE_EXT:
  905.    case GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE:
  906.       return info->GreenBits;
  907.    case GL_BLUE_BITS:
  908.    case GL_TEXTURE_BLUE_SIZE:
  909.    case GL_RENDERBUFFER_BLUE_SIZE_EXT:
  910.    case GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE:
  911.       return info->BlueBits;
  912.    case GL_ALPHA_BITS:
  913.    case GL_TEXTURE_ALPHA_SIZE:
  914.    case GL_RENDERBUFFER_ALPHA_SIZE_EXT:
  915.    case GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE:
  916.       return info->AlphaBits;
  917.    case GL_TEXTURE_INTENSITY_SIZE:
  918.       return info->IntensityBits;
  919.    case GL_TEXTURE_LUMINANCE_SIZE:
  920.       return info->LuminanceBits;
  921.    case GL_INDEX_BITS:
  922.    case GL_TEXTURE_INDEX_SIZE_EXT:
  923.       return info->IndexBits;
  924.    case GL_DEPTH_BITS:
  925.    case GL_TEXTURE_DEPTH_SIZE_ARB:
  926.    case GL_RENDERBUFFER_DEPTH_SIZE_EXT:
  927.    case GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE:
  928.       return info->DepthBits;
  929.    case GL_STENCIL_BITS:
  930.    case GL_TEXTURE_STENCIL_SIZE_EXT:
  931.    case GL_RENDERBUFFER_STENCIL_SIZE_EXT:
  932.    case GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE:
  933.       return info->StencilBits;
  934.    default:
  935.       _mesa_problem(NULL, "bad pname in _mesa_get_format_bits()");
  936.       return 0;
  937.    }
  938. }
  939.  
  940.  
  941. /**
  942.  * Return the data type (or more specifically, the data representation)
  943.  * for the given format.
  944.  * The return value will be one of:
  945.  *    GL_UNSIGNED_NORMALIZED = unsigned int representing [0,1]
  946.  *    GL_SIGNED_NORMALIZED = signed int representing [-1, 1]
  947.  *    GL_UNSIGNED_INT = an ordinary unsigned integer
  948.  *    GL_INT = an ordinary signed integer
  949.  *    GL_FLOAT = an ordinary float
  950.  */
  951. GLenum
  952. _mesa_get_format_datatype(gl_format format)
  953. {
  954.    const struct gl_format_info *info = _mesa_get_format_info(format);
  955.    return info->DataType;
  956. }
  957.  
  958.  
  959. /**
  960.  * Return the basic format for the given type.  The result will be
  961.  * one of GL_RGB, GL_RGBA, GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA,
  962.  * GL_INTENSITY, GL_YCBCR_MESA, GL_COLOR_INDEX, GL_DEPTH_COMPONENT,
  963.  * GL_STENCIL_INDEX, GL_DEPTH_STENCIL.
  964.  */
  965. GLenum
  966. _mesa_get_format_base_format(gl_format format)
  967. {
  968.    const struct gl_format_info *info = _mesa_get_format_info(format);
  969.    return info->BaseFormat;
  970. }
  971.  
  972.  
  973. /**
  974.  * Return the block size (in pixels) for the given format.  Normally
  975.  * the block size is 1x1.  But compressed formats will have block sizes
  976.  * of 4x4 or 8x4 pixels, etc.
  977.  * \param bw  returns block width in pixels
  978.  * \param bh  returns block height in pixels
  979.  */
  980. void
  981. _mesa_get_format_block_size(gl_format format, GLuint *bw, GLuint *bh)
  982. {
  983.    const struct gl_format_info *info = _mesa_get_format_info(format);
  984.    *bw = info->BlockWidth;
  985.    *bh = info->BlockHeight;
  986. }
  987.  
  988.  
  989. /** Is the given format a compressed format? */
  990. GLboolean
  991. _mesa_is_format_compressed(gl_format format)
  992. {
  993.    const struct gl_format_info *info = _mesa_get_format_info(format);
  994.    return info->BlockWidth > 1 || info->BlockHeight > 1;
  995. }
  996.  
  997.  
  998. /**
  999.  * Determine if the given format represents a packed depth/stencil buffer.
  1000.  */
  1001. GLboolean
  1002. _mesa_is_format_packed_depth_stencil(gl_format format)
  1003. {
  1004.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1005.  
  1006.    return info->BaseFormat == GL_DEPTH_STENCIL;
  1007. }
  1008.  
  1009.  
  1010. /**
  1011.  * Is the given format a signed/unsigned integer color format?
  1012.  */
  1013. GLboolean
  1014. _mesa_is_format_integer_color(gl_format format)
  1015. {
  1016.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1017.    return (info->DataType == GL_INT || info->DataType == GL_UNSIGNED_INT) &&
  1018.       info->BaseFormat != GL_DEPTH_COMPONENT &&
  1019.       info->BaseFormat != GL_DEPTH_STENCIL &&
  1020.       info->BaseFormat != GL_STENCIL_INDEX;
  1021. }
  1022.  
  1023.  
  1024. /**
  1025.  * Return color encoding for given format.
  1026.  * \return GL_LINEAR or GL_SRGB
  1027.  */
  1028. GLenum
  1029. _mesa_get_format_color_encoding(gl_format format)
  1030. {
  1031.    /* XXX this info should be encoded in gl_format_info */
  1032.    switch (format) {
  1033.    case MESA_FORMAT_SRGB8:
  1034.    case MESA_FORMAT_SRGBA8:
  1035.    case MESA_FORMAT_SARGB8:
  1036.    case MESA_FORMAT_SL8:
  1037.    case MESA_FORMAT_SLA8:
  1038.    case MESA_FORMAT_SRGB_DXT1:
  1039.    case MESA_FORMAT_SRGBA_DXT1:
  1040.    case MESA_FORMAT_SRGBA_DXT3:
  1041.    case MESA_FORMAT_SRGBA_DXT5:
  1042.       return GL_SRGB;
  1043.    default:
  1044.       return GL_LINEAR;
  1045.    }
  1046. }
  1047.  
  1048.  
  1049. /**
  1050.  * Return number of bytes needed to store an image of the given size
  1051.  * in the given format.
  1052.  */
  1053. GLuint
  1054. _mesa_format_image_size(gl_format format, GLsizei width,
  1055.                         GLsizei height, GLsizei depth)
  1056. {
  1057.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1058.    /* Strictly speaking, a conditional isn't needed here */
  1059.    if (info->BlockWidth > 1 || info->BlockHeight > 1) {
  1060.       /* compressed format (2D only for now) */
  1061.       const GLuint bw = info->BlockWidth, bh = info->BlockHeight;
  1062.       const GLuint wblocks = (width + bw - 1) / bw;
  1063.       const GLuint hblocks = (height + bh - 1) / bh;
  1064.       const GLuint sz = wblocks * hblocks * info->BytesPerBlock;
  1065.       assert(depth == 1);
  1066.       return sz;
  1067.    }
  1068.    else {
  1069.       /* non-compressed */
  1070.       const GLuint sz = width * height * depth * info->BytesPerBlock;
  1071.       return sz;
  1072.    }
  1073. }
  1074.  
  1075.  
  1076. /**
  1077.  * Same as _mesa_format_image_size() but returns a 64-bit value to
  1078.  * accomodate very large textures.
  1079.  */
  1080. uint64_t
  1081. _mesa_format_image_size64(gl_format format, GLsizei width,
  1082.                           GLsizei height, GLsizei depth)
  1083. {
  1084.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1085.    /* Strictly speaking, a conditional isn't needed here */
  1086.    if (info->BlockWidth > 1 || info->BlockHeight > 1) {
  1087.       /* compressed format (2D only for now) */
  1088.       const uint64_t bw = info->BlockWidth, bh = info->BlockHeight;
  1089.       const uint64_t wblocks = (width + bw - 1) / bw;
  1090.       const uint64_t hblocks = (height + bh - 1) / bh;
  1091.       const uint64_t sz = wblocks * hblocks * info->BytesPerBlock;
  1092.       assert(depth == 1);
  1093.       return sz;
  1094.    }
  1095.    else {
  1096.       /* non-compressed */
  1097.       const uint64_t sz = ((uint64_t) width *
  1098.                            (uint64_t) height *
  1099.                            (uint64_t) depth *
  1100.                            info->BytesPerBlock);
  1101.       return sz;
  1102.    }
  1103. }
  1104.  
  1105.  
  1106.  
  1107. GLint
  1108. _mesa_format_row_stride(gl_format format, GLsizei width)
  1109. {
  1110.    const struct gl_format_info *info = _mesa_get_format_info(format);
  1111.    /* Strictly speaking, a conditional isn't needed here */
  1112.    if (info->BlockWidth > 1 || info->BlockHeight > 1) {
  1113.       /* compressed format */
  1114.       const GLuint bw = info->BlockWidth;
  1115.       const GLuint wblocks = (width + bw - 1) / bw;
  1116.       const GLint stride = wblocks * info->BytesPerBlock;
  1117.       return stride;
  1118.    }
  1119.    else {
  1120.       const GLint stride = width * info->BytesPerBlock;
  1121.       return stride;
  1122.    }
  1123. }
  1124.  
  1125.  
  1126.  
  1127. /**
  1128.  * Do sanity checking of the format info table.
  1129.  */
  1130. void
  1131. _mesa_test_formats(void)
  1132. {
  1133.    GLuint i;
  1134.  
  1135.    assert(Elements(format_info) == MESA_FORMAT_COUNT);
  1136.  
  1137.    for (i = 0; i < MESA_FORMAT_COUNT; i++) {
  1138.       const struct gl_format_info *info = _mesa_get_format_info(i);
  1139.       assert(info);
  1140.  
  1141.       assert(info->Name == i);
  1142.  
  1143.       if (info->Name == MESA_FORMAT_NONE)
  1144.          continue;
  1145.  
  1146.       if (info->BlockWidth == 1 && info->BlockHeight == 1) {
  1147.          if (info->RedBits > 0) {
  1148.             GLuint t = info->RedBits + info->GreenBits
  1149.                + info->BlueBits + info->AlphaBits;
  1150.             assert(t / 8 <= info->BytesPerBlock);
  1151.             (void) t;
  1152.          }
  1153.       }
  1154.  
  1155.       assert(info->DataType == GL_UNSIGNED_NORMALIZED ||
  1156.              info->DataType == GL_SIGNED_NORMALIZED ||
  1157.              info->DataType == GL_UNSIGNED_INT ||
  1158.              info->DataType == GL_INT ||
  1159.              info->DataType == GL_FLOAT);
  1160.  
  1161.       if (info->BaseFormat == GL_RGB) {
  1162.          assert(info->RedBits > 0);
  1163.          assert(info->GreenBits > 0);
  1164.          assert(info->BlueBits > 0);
  1165.          assert(info->AlphaBits == 0);
  1166.          assert(info->LuminanceBits == 0);
  1167.          assert(info->IntensityBits == 0);
  1168.       }
  1169.       else if (info->BaseFormat == GL_RGBA) {
  1170.          assert(info->RedBits > 0);
  1171.          assert(info->GreenBits > 0);
  1172.          assert(info->BlueBits > 0);
  1173.          assert(info->AlphaBits > 0);
  1174.          assert(info->LuminanceBits == 0);
  1175.          assert(info->IntensityBits == 0);
  1176.       }
  1177.       else if (info->BaseFormat == GL_RG) {
  1178.          assert(info->RedBits > 0);
  1179.          assert(info->GreenBits > 0);
  1180.          assert(info->BlueBits == 0);
  1181.          assert(info->AlphaBits == 0);
  1182.          assert(info->LuminanceBits == 0);
  1183.          assert(info->IntensityBits == 0);
  1184.       }
  1185.       else if (info->BaseFormat == GL_RED) {
  1186.          assert(info->RedBits > 0);
  1187.          assert(info->GreenBits == 0);
  1188.          assert(info->BlueBits == 0);
  1189.          assert(info->AlphaBits == 0);
  1190.          assert(info->LuminanceBits == 0);
  1191.          assert(info->IntensityBits == 0);
  1192.       }
  1193.       else if (info->BaseFormat == GL_LUMINANCE) {
  1194.          assert(info->RedBits == 0);
  1195.          assert(info->GreenBits == 0);
  1196.          assert(info->BlueBits == 0);
  1197.          assert(info->AlphaBits == 0);
  1198.          assert(info->LuminanceBits > 0);
  1199.          assert(info->IntensityBits == 0);
  1200.       }
  1201.       else if (info->BaseFormat == GL_INTENSITY) {
  1202.          assert(info->RedBits == 0);
  1203.          assert(info->GreenBits == 0);
  1204.          assert(info->BlueBits == 0);
  1205.          assert(info->AlphaBits == 0);
  1206.          assert(info->LuminanceBits == 0);
  1207.          assert(info->IntensityBits > 0);
  1208.       }
  1209.  
  1210.    }
  1211. }
  1212.  
  1213.  
  1214.  
  1215. /**
  1216.  * Return datatype and number of components per texel for the given gl_format.
  1217.  * Only used for mipmap generation code.
  1218.  */
  1219. void
  1220. _mesa_format_to_type_and_comps(gl_format format,
  1221.                                GLenum *datatype, GLuint *comps)
  1222. {
  1223.    switch (format) {
  1224.    case MESA_FORMAT_RGBA8888:
  1225.    case MESA_FORMAT_RGBA8888_REV:
  1226.    case MESA_FORMAT_ARGB8888:
  1227.    case MESA_FORMAT_ARGB8888_REV:
  1228.    case MESA_FORMAT_XRGB8888:
  1229.    case MESA_FORMAT_XRGB8888_REV:
  1230.       *datatype = GL_UNSIGNED_BYTE;
  1231.       *comps = 4;
  1232.       return;
  1233.    case MESA_FORMAT_RGB888:
  1234.    case MESA_FORMAT_BGR888:
  1235.       *datatype = GL_UNSIGNED_BYTE;
  1236.       *comps = 3;
  1237.       return;
  1238.    case MESA_FORMAT_RGB565:
  1239.    case MESA_FORMAT_RGB565_REV:
  1240.       *datatype = GL_UNSIGNED_SHORT_5_6_5;
  1241.       *comps = 3;
  1242.       return;
  1243.  
  1244.    case MESA_FORMAT_ARGB4444:
  1245.    case MESA_FORMAT_ARGB4444_REV:
  1246.       *datatype = GL_UNSIGNED_SHORT_4_4_4_4;
  1247.       *comps = 4;
  1248.       return;
  1249.  
  1250.    case MESA_FORMAT_ARGB1555:
  1251.    case MESA_FORMAT_ARGB1555_REV:
  1252.       *datatype = GL_UNSIGNED_SHORT_1_5_5_5_REV;
  1253.       *comps = 4;
  1254.       return;
  1255.  
  1256.    case MESA_FORMAT_RGBA5551:
  1257.       *datatype = GL_UNSIGNED_SHORT_5_5_5_1;
  1258.       *comps = 4;
  1259.       return;
  1260.  
  1261.    case MESA_FORMAT_AL88:
  1262.    case MESA_FORMAT_AL88_REV:
  1263.    case MESA_FORMAT_RG88:
  1264.    case MESA_FORMAT_RG88_REV:
  1265.       *datatype = GL_UNSIGNED_BYTE;
  1266.       *comps = 2;
  1267.       return;
  1268.  
  1269.    case MESA_FORMAT_AL1616:
  1270.    case MESA_FORMAT_AL1616_REV:
  1271.    case MESA_FORMAT_RG1616:
  1272.    case MESA_FORMAT_RG1616_REV:
  1273.       *datatype = GL_UNSIGNED_SHORT;
  1274.       *comps = 2;
  1275.       return;
  1276.  
  1277.    case MESA_FORMAT_R16:
  1278.       *datatype = GL_UNSIGNED_SHORT;
  1279.       *comps = 1;
  1280.       return;
  1281.  
  1282.    case MESA_FORMAT_RGB332:
  1283.       *datatype = GL_UNSIGNED_BYTE_3_3_2;
  1284.       *comps = 3;
  1285.       return;
  1286.  
  1287.    case MESA_FORMAT_A8:
  1288.    case MESA_FORMAT_L8:
  1289.    case MESA_FORMAT_I8:
  1290.    case MESA_FORMAT_CI8:
  1291.    case MESA_FORMAT_R8:
  1292.    case MESA_FORMAT_S8:
  1293.       *datatype = GL_UNSIGNED_BYTE;
  1294.       *comps = 1;
  1295.       return;
  1296.  
  1297.    case MESA_FORMAT_YCBCR:
  1298.    case MESA_FORMAT_YCBCR_REV:
  1299.       *datatype = GL_UNSIGNED_SHORT;
  1300.       *comps = 2;
  1301.       return;
  1302.  
  1303.    case MESA_FORMAT_Z24_S8:
  1304.       *datatype = GL_UNSIGNED_INT;
  1305.       *comps = 1; /* XXX OK? */
  1306.       return;
  1307.  
  1308.    case MESA_FORMAT_S8_Z24:
  1309.       *datatype = GL_UNSIGNED_INT;
  1310.       *comps = 1; /* XXX OK? */
  1311.       return;
  1312.  
  1313.    case MESA_FORMAT_Z16:
  1314.       *datatype = GL_UNSIGNED_SHORT;
  1315.       *comps = 1;
  1316.       return;
  1317.  
  1318.    case MESA_FORMAT_X8_Z24:
  1319.       *datatype = GL_UNSIGNED_INT;
  1320.       *comps = 1;
  1321.       return;
  1322.  
  1323.    case MESA_FORMAT_Z24_X8:
  1324.       *datatype = GL_UNSIGNED_INT;
  1325.       *comps = 1;
  1326.       return;
  1327.  
  1328.    case MESA_FORMAT_Z32:
  1329.       *datatype = GL_UNSIGNED_INT;
  1330.       *comps = 1;
  1331.       return;
  1332.  
  1333.    case MESA_FORMAT_DUDV8:
  1334.       *datatype = GL_BYTE;
  1335.       *comps = 2;
  1336.       return;
  1337.  
  1338.    case MESA_FORMAT_SIGNED_R8:
  1339.       *datatype = GL_BYTE;
  1340.       *comps = 1;
  1341.       return;
  1342.    case MESA_FORMAT_SIGNED_RG88:
  1343.       *datatype = GL_BYTE;
  1344.       *comps = 2;
  1345.       return;
  1346.    case MESA_FORMAT_SIGNED_RGBA8888:
  1347.    case MESA_FORMAT_SIGNED_RGBA8888_REV:
  1348.    case MESA_FORMAT_SIGNED_RGBX8888:
  1349.       *datatype = GL_BYTE;
  1350.       *comps = 4;
  1351.       return;
  1352.  
  1353.    case MESA_FORMAT_RGBA_16:
  1354.       *datatype = GL_UNSIGNED_SHORT;
  1355.       *comps = 4;
  1356.       return;
  1357.  
  1358.    case MESA_FORMAT_SIGNED_R_16:
  1359.       *datatype = GL_SHORT;
  1360.       *comps = 1;
  1361.       return;
  1362.    case MESA_FORMAT_SIGNED_RG_16:
  1363.       *datatype = GL_SHORT;
  1364.       *comps = 2;
  1365.       return;
  1366.    case MESA_FORMAT_SIGNED_RGB_16:
  1367.       *datatype = GL_SHORT;
  1368.       *comps = 3;
  1369.       return;
  1370.    case MESA_FORMAT_SIGNED_RGBA_16:
  1371.       *datatype = GL_SHORT;
  1372.       *comps = 4;
  1373.       return;
  1374.  
  1375. #if FEATURE_EXT_texture_sRGB
  1376.    case MESA_FORMAT_SRGB8:
  1377.       *datatype = GL_UNSIGNED_BYTE;
  1378.       *comps = 3;
  1379.       return;
  1380.    case MESA_FORMAT_SRGBA8:
  1381.    case MESA_FORMAT_SARGB8:
  1382.       *datatype = GL_UNSIGNED_BYTE;
  1383.       *comps = 4;
  1384.       return;
  1385.    case MESA_FORMAT_SL8:
  1386.       *datatype = GL_UNSIGNED_BYTE;
  1387.       *comps = 1;
  1388.       return;
  1389.    case MESA_FORMAT_SLA8:
  1390.       *datatype = GL_UNSIGNED_BYTE;
  1391.       *comps = 2;
  1392.       return;
  1393. #endif
  1394.  
  1395. #if FEATURE_texture_fxt1
  1396.    case MESA_FORMAT_RGB_FXT1:
  1397.    case MESA_FORMAT_RGBA_FXT1:
  1398. #endif
  1399. #if FEATURE_texture_s3tc
  1400.    case MESA_FORMAT_RGB_DXT1:
  1401.    case MESA_FORMAT_RGBA_DXT1:
  1402.    case MESA_FORMAT_RGBA_DXT3:
  1403.    case MESA_FORMAT_RGBA_DXT5:
  1404. #if FEATURE_EXT_texture_sRGB
  1405.    case MESA_FORMAT_SRGB_DXT1:
  1406.    case MESA_FORMAT_SRGBA_DXT1:
  1407.    case MESA_FORMAT_SRGBA_DXT3:
  1408.    case MESA_FORMAT_SRGBA_DXT5:
  1409. #endif
  1410. #endif
  1411.       /* XXX generate error instead? */
  1412.       *datatype = GL_UNSIGNED_BYTE;
  1413.       *comps = 0;
  1414.       return;
  1415.  
  1416.    case MESA_FORMAT_RGBA_FLOAT32:
  1417.       *datatype = GL_FLOAT;
  1418.       *comps = 4;
  1419.       return;
  1420.    case MESA_FORMAT_RGBA_FLOAT16:
  1421.       *datatype = GL_HALF_FLOAT_ARB;
  1422.       *comps = 4;
  1423.       return;
  1424.    case MESA_FORMAT_RGB_FLOAT32:
  1425.       *datatype = GL_FLOAT;
  1426.       *comps = 3;
  1427.       return;
  1428.    case MESA_FORMAT_RGB_FLOAT16:
  1429.       *datatype = GL_HALF_FLOAT_ARB;
  1430.       *comps = 3;
  1431.       return;
  1432.    case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32:
  1433.       *datatype = GL_FLOAT;
  1434.       *comps = 2;
  1435.       return;
  1436.    case MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16:
  1437.       *datatype = GL_HALF_FLOAT_ARB;
  1438.       *comps = 2;
  1439.       return;
  1440.    case MESA_FORMAT_ALPHA_FLOAT32:
  1441.    case MESA_FORMAT_LUMINANCE_FLOAT32:
  1442.    case MESA_FORMAT_INTENSITY_FLOAT32:
  1443.       *datatype = GL_FLOAT;
  1444.       *comps = 1;
  1445.       return;
  1446.    case MESA_FORMAT_ALPHA_FLOAT16:
  1447.    case MESA_FORMAT_LUMINANCE_FLOAT16:
  1448.    case MESA_FORMAT_INTENSITY_FLOAT16:
  1449.       *datatype = GL_HALF_FLOAT_ARB;
  1450.       *comps = 1;
  1451.       return;
  1452.  
  1453.    case MESA_FORMAT_RGBA_INT8:
  1454.       *datatype = GL_BYTE;
  1455.       *comps = 4;
  1456.       return;
  1457.    case MESA_FORMAT_RGBA_INT16:
  1458.       *datatype = GL_SHORT;
  1459.       *comps = 4;
  1460.       return;
  1461.    case MESA_FORMAT_RGBA_INT32:
  1462.       *datatype = GL_INT;
  1463.       *comps = 4;
  1464.       return;
  1465.  
  1466.    /**
  1467.     * \name Non-normalized unsigned integer formats.
  1468.     */
  1469.    case MESA_FORMAT_RGBA_UINT8:
  1470.       *datatype = GL_UNSIGNED_BYTE;
  1471.       *comps = 4;
  1472.       return;
  1473.    case MESA_FORMAT_RGBA_UINT16:
  1474.       *datatype = GL_UNSIGNED_SHORT;
  1475.       *comps = 4;
  1476.       return;
  1477.    case MESA_FORMAT_RGBA_UINT32:
  1478.       *datatype = GL_UNSIGNED_INT;
  1479.       *comps = 4;
  1480.       return;
  1481.  
  1482.    case MESA_FORMAT_NONE:
  1483.    case MESA_FORMAT_COUNT:
  1484.    /* For debug builds, warn if any formats are not handled */
  1485. #ifndef DEBUG
  1486.    default:
  1487. #endif
  1488.       _mesa_problem(NULL, "bad format %s in _mesa_format_to_type_and_comps",
  1489.                     _mesa_get_format_name(format));
  1490.       *datatype = 0;
  1491.       *comps = 1;
  1492.    }
  1493. }
  1494.