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-2006  Brian Paul   All Rights Reserved.
  5.  * Copyright (c) 2008 VMware, Inc.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  *
  14.  * The above copyright notice and this permission notice shall be included
  15.  * in all copies or substantial portions of the Software.
  16.  *
  17.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  20.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  21.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  22.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  23.  * OTHER DEALINGS IN THE SOFTWARE.
  24.  */
  25.  
  26.  
  27. /**
  28.  * \file texcompress.c
  29.  * Helper functions for texture compression.
  30.  */
  31.  
  32.  
  33. #include "glheader.h"
  34. #include "imports.h"
  35. #include "colormac.h"
  36. #include "context.h"
  37. #include "formats.h"
  38. #include "mtypes.h"
  39. #include "context.h"
  40. #include "texcompress.h"
  41. #include "texcompress_fxt1.h"
  42. #include "texcompress_rgtc.h"
  43. #include "texcompress_s3tc.h"
  44. #include "texcompress_etc.h"
  45.  
  46.  
  47. /**
  48.  * Get the GL base format of a specified GL compressed texture format
  49.  *
  50.  * From page 232 of the OpenGL 3.3 (Compatiblity Profile) spec:
  51.  *
  52.  *     "Compressed Internal Format      Base Internal Format    Type
  53.  *     ---------------------------     --------------------    ---------
  54.  *     COMPRESSED_ALPHA                ALPHA                   Generic
  55.  *     COMPRESSED_LUMINANCE            LUMINANCE               Generic
  56.  *     COMPRESSED_LUMINANCE_ALPHA      LUMINANCE_ALPHA         Generic
  57.  *     COMPRESSED_INTENSITY            INTENSITY               Generic
  58.  *     COMPRESSED_RED                  RED                     Generic
  59.  *     COMPRESSED_RG                   RG                      Generic
  60.  *     COMPRESSED_RGB                  RGB                     Generic
  61.  *     COMPRESSED_RGBA                 RGBA                    Generic
  62.  *     COMPRESSED_SRGB                 RGB                     Generic
  63.  *     COMPRESSED_SRGB_ALPHA           RGBA                    Generic
  64.  *     COMPRESSED_SLUMINANCE           LUMINANCE               Generic
  65.  *     COMPRESSED_SLUMINANCE_ALPHA     LUMINANCE_ALPHA         Generic
  66.  *     COMPRESSED_RED_RGTC1            RED                     Specific
  67.  *     COMPRESSED_SIGNED_RED_RGTC1     RED                     Specific
  68.  *     COMPRESSED_RG_RGTC2             RG                      Specific
  69.  *     COMPRESSED_SIGNED_RG_RGTC2      RG                      Specific"
  70.  *
  71.  * \return
  72.  * The base format of \c format if \c format is a compressed format (either
  73.  * generic or specific.  Otherwise 0 is returned.
  74.  */
  75. GLenum
  76. _mesa_gl_compressed_format_base_format(GLenum format)
  77. {
  78.    switch (format) {
  79.    case GL_COMPRESSED_RED:
  80.    case GL_COMPRESSED_R11_EAC:
  81.    case GL_COMPRESSED_RED_RGTC1:
  82.    case GL_COMPRESSED_SIGNED_R11_EAC:
  83.    case GL_COMPRESSED_SIGNED_RED_RGTC1:
  84.       return GL_RED;
  85.  
  86.    case GL_COMPRESSED_RG:
  87.    case GL_COMPRESSED_RG11_EAC:
  88.    case GL_COMPRESSED_RG_RGTC2:
  89.    case GL_COMPRESSED_SIGNED_RG11_EAC:
  90.    case GL_COMPRESSED_SIGNED_RG_RGTC2:
  91.       return GL_RG;
  92.  
  93.    case GL_COMPRESSED_RGB:
  94.    case GL_COMPRESSED_SRGB:
  95.    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  96.    case GL_COMPRESSED_RGB_FXT1_3DFX:
  97.    case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  98.    case GL_ETC1_RGB8_OES:
  99.    case GL_COMPRESSED_RGB8_ETC2:
  100.    case GL_COMPRESSED_SRGB8_ETC2:
  101.       return GL_RGB;
  102.  
  103.    case GL_COMPRESSED_RGBA:
  104.    case GL_COMPRESSED_SRGB_ALPHA:
  105.    case GL_COMPRESSED_RGBA_BPTC_UNORM_ARB:
  106.    case GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB:
  107.    case GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB:
  108.    case GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB:
  109.    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  110.    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  111.    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  112.    case GL_COMPRESSED_RGBA_FXT1_3DFX:
  113.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  114.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  115.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  116.    case GL_COMPRESSED_RGBA8_ETC2_EAC:
  117.    case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
  118.    case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
  119.    case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
  120.       return GL_RGBA;
  121.  
  122.    case GL_COMPRESSED_ALPHA:
  123.       return GL_ALPHA;
  124.  
  125.    case GL_COMPRESSED_LUMINANCE:
  126.    case GL_COMPRESSED_SLUMINANCE:
  127.    case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
  128.    case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
  129.       return GL_LUMINANCE;
  130.  
  131.    case GL_COMPRESSED_LUMINANCE_ALPHA:
  132.    case GL_COMPRESSED_SLUMINANCE_ALPHA:
  133.    case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
  134.    case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
  135.    case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
  136.       return GL_LUMINANCE_ALPHA;
  137.  
  138.    case GL_COMPRESSED_INTENSITY:
  139.       return GL_INTENSITY;
  140.  
  141.    default:
  142.       return 0;
  143.    }
  144. }
  145.  
  146. /**
  147.  * Return list of (and count of) all specific texture compression
  148.  * formats that are supported.
  149.  *
  150.  * Some formats are \b not returned by this function.  The
  151.  * \c GL_COMPRESSED_TEXTURE_FORMATS query only returns formats that are
  152.  * "suitable for general-purpose usage."  All texture compression extensions
  153.  * have taken this to mean either linear RGB or linear RGBA.
  154.  *
  155.  * The GL_ARB_texture_compress_rgtc spec says:
  156.  *
  157.  *    "19) Should the GL_NUM_COMPRESSED_TEXTURE_FORMATS and
  158.  *        GL_COMPRESSED_TEXTURE_FORMATS queries return the RGTC formats?
  159.  *
  160.  *        RESOLVED:  No.
  161.  *
  162.  *        The OpenGL 2.1 specification says "The only values returned
  163.  *        by this query [GL_COMPRESSED_TEXTURE_FORMATS"] are those
  164.  *        corresponding to formats suitable for general-purpose usage.
  165.  *        The renderer will not enumerate formats with restrictions that
  166.  *        need to be specifically understood prior to use."
  167.  *
  168.  *        Compressed textures with just red or red-green components are
  169.  *        not general-purpose so should not be returned by these queries
  170.  *        because they have restrictions.
  171.  *
  172.  *        Applications that seek to use the RGTC formats should do so
  173.  *        by looking for this extension's name in the string returned by
  174.  *        glGetString(GL_EXTENSIONS) rather than
  175.  *        what GL_NUM_COMPRESSED_TEXTURE_FORMATS and
  176.  *        GL_COMPRESSED_TEXTURE_FORMATS return."
  177.  *
  178.  * There is nearly identical wording in the GL_EXT_texture_compression_rgtc
  179.  * spec.
  180.  *
  181.  * The GL_EXT_texture_rRGB spec says:
  182.  *
  183.  *    "22) Should the new COMPRESSED_SRGB_* formats be listed in an
  184.  *        implementation's GL_COMPRESSED_TEXTURE_FORMATS list?
  185.  *
  186.  *        RESOLVED:  No.  Section 3.8.1 says formats listed by
  187.  *        GL_COMPRESSED_TEXTURE_FORMATS are "suitable for general-purpose
  188.  *        usage."  The non-linear distribution of red, green, and
  189.  *        blue for these sRGB compressed formats makes them not really
  190.  *        general-purpose."
  191.  *
  192.  * The GL_EXT_texture_compression_latc spec says:
  193.  *
  194.  *    "16) Should the GL_NUM_COMPRESSED_TEXTURE_FORMATS and
  195.  *        GL_COMPRESSED_TEXTURE_FORMATS queries return the LATC formats?
  196.  *
  197.  *        RESOLVED:  No.
  198.  *
  199.  *        The OpenGL 2.1 specification says "The only values returned
  200.  *        by this query [GL_COMPRESSED_TEXTURE_FORMATS"] are those
  201.  *        corresponding to formats suitable for general-purpose usage.
  202.  *        The renderer will not enumerate formats with restrictions that
  203.  *        need to be specifically understood prior to use."
  204.  *
  205.  *        Historically, OpenGL implementation have advertised the RGB and
  206.  *        RGBA versions of the S3TC extensions compressed format tokens
  207.  *        through this mechanism.
  208.  *
  209.  *        The specification is not sufficiently clear about what "suitable
  210.  *        for general-purpose usage" means.  Historically that seems to mean
  211.  *        unsigned RGB or unsigned RGBA.  The DXT1 format supporting alpha
  212.  *        (GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) is not exposed in the list (at
  213.  *        least for NVIDIA drivers) because the alpha is always 1.0 expect
  214.  *        when it is 0.0 when RGB is required to be black.  NVIDIA's even
  215.  *        limits itself to true linear RGB or RGBA formats, specifically
  216.  *        not including EXT_texture_sRGB's sRGB S3TC compressed formats.
  217.  *
  218.  *        Adding luminance and luminance-alpha texture formats (and
  219.  *        certainly signed versions of luminance and luminance-alpha
  220.  *        formats!) invites potential comptaibility problems with old
  221.  *        applications using this mechanism since old applications are
  222.  *        unlikely to expect non-RGB or non-RGBA formats to be advertised
  223.  *        through this mechanism.  However no specific misinteractions
  224.  *        with old applications is known.
  225.  *
  226.  *        Applications that seek to use the LATC formats should do so
  227.  *        by looking for this extension's name in the string returned by
  228.  *        glGetString(GL_EXTENSIONS) rather than
  229.  *        what GL_NUM_COMPRESSED_TEXTURE_FORMATS and
  230.  *        GL_COMPRESSED_TEXTURE_FORMATS return."
  231.  *
  232.  * There is no formal spec for GL_ATI_texture_compression_3dc.  Since the
  233.  * formats added by this extension are luminance-alpha formats, it is
  234.  * reasonable to expect them to follow the same rules as
  235.  * GL_EXT_texture_compression_latc.  At the very least, Catalyst 11.6 does not
  236.  * expose the 3dc formats through this mechanism.
  237.  *
  238.  * \param ctx  the GL context
  239.  * \param formats  the resulting format list (may be NULL).
  240.  *
  241.  * \return number of formats.
  242.  */
  243. GLuint
  244. _mesa_get_compressed_formats(struct gl_context *ctx, GLint *formats)
  245. {
  246.    GLuint n = 0;
  247.    if (ctx->Extensions.TDFX_texture_compression_FXT1) {
  248.       if (formats) {
  249.          formats[n++] = GL_COMPRESSED_RGB_FXT1_3DFX;
  250.          formats[n++] = GL_COMPRESSED_RGBA_FXT1_3DFX;
  251.       }
  252.       else {
  253.          n += 2;
  254.       }
  255.    }
  256.  
  257.    if (ctx->Extensions.EXT_texture_compression_s3tc) {
  258.       if (formats) {
  259.          formats[n++] = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
  260.          formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  261.          formats[n++] = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  262.       }
  263.       else {
  264.          n += 3;
  265.       }
  266.    }
  267.  
  268.    /* The GL_OES_compressed_ETC1_RGB8_texture spec says:
  269.     *
  270.     *     "New State
  271.     *
  272.     *         The queries for NUM_COMPRESSED_TEXTURE_FORMATS and
  273.     *         COMPRESSED_TEXTURE_FORMATS include ETC1_RGB8_OES."
  274.     */
  275.    if (_mesa_is_gles(ctx)
  276.        && ctx->Extensions.OES_compressed_ETC1_RGB8_texture) {
  277.       if (formats) {
  278.          formats[n++] = GL_ETC1_RGB8_OES;
  279.       }
  280.       else {
  281.          n += 1;
  282.       }
  283.    }
  284.  
  285.    if (ctx->API == API_OPENGLES) {
  286.       if (formats) {
  287.          formats[n++] = GL_PALETTE4_RGB8_OES;
  288.          formats[n++] = GL_PALETTE4_RGBA8_OES;
  289.          formats[n++] = GL_PALETTE4_R5_G6_B5_OES;
  290.          formats[n++] = GL_PALETTE4_RGBA4_OES;
  291.          formats[n++] = GL_PALETTE4_RGB5_A1_OES;
  292.          formats[n++] = GL_PALETTE8_RGB8_OES;
  293.          formats[n++] = GL_PALETTE8_RGBA8_OES;
  294.          formats[n++] = GL_PALETTE8_R5_G6_B5_OES;
  295.          formats[n++] = GL_PALETTE8_RGBA4_OES;
  296.          formats[n++] = GL_PALETTE8_RGB5_A1_OES;
  297.       }
  298.       else {
  299.          n += 10;
  300.       }
  301.    }
  302.  
  303.    if (_mesa_is_gles3(ctx)) {
  304.       if (formats) {
  305.          formats[n++] = GL_COMPRESSED_RGB8_ETC2;
  306.          formats[n++] = GL_COMPRESSED_SRGB8_ETC2;
  307.          formats[n++] = GL_COMPRESSED_RGBA8_ETC2_EAC;
  308.          formats[n++] = GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
  309.          formats[n++] = GL_COMPRESSED_R11_EAC;
  310.          formats[n++] = GL_COMPRESSED_RG11_EAC;
  311.          formats[n++] = GL_COMPRESSED_SIGNED_R11_EAC;
  312.          formats[n++] = GL_COMPRESSED_SIGNED_RG11_EAC;
  313.          formats[n++] = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
  314.          formats[n++] = GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
  315.       }
  316.       else {
  317.          n += 10;
  318.       }
  319.    }
  320.    return n;
  321. }
  322.  
  323.  
  324. /**
  325.  * Convert a compressed MESA_FORMAT_x to a GLenum.
  326.  */
  327. gl_format
  328. _mesa_glenum_to_compressed_format(GLenum format)
  329. {
  330.    switch (format) {
  331.    case GL_COMPRESSED_RGB_FXT1_3DFX:
  332.       return MESA_FORMAT_RGB_FXT1;
  333.    case GL_COMPRESSED_RGBA_FXT1_3DFX:
  334.       return MESA_FORMAT_RGBA_FXT1;
  335.  
  336.    case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
  337.    case GL_RGB_S3TC:
  338.       return MESA_FORMAT_RGB_DXT1;
  339.    case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
  340.    case GL_RGB4_S3TC:
  341.       return MESA_FORMAT_RGBA_DXT1;
  342.    case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
  343.    case GL_RGBA_S3TC:
  344.       return MESA_FORMAT_RGBA_DXT3;
  345.    case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
  346.    case GL_RGBA4_S3TC:
  347.       return MESA_FORMAT_RGBA_DXT5;
  348.  
  349.    case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
  350.       return MESA_FORMAT_SRGB_DXT1;
  351.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
  352.       return MESA_FORMAT_SRGBA_DXT1;
  353.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
  354.       return MESA_FORMAT_SRGBA_DXT3;
  355.    case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
  356.       return MESA_FORMAT_SRGBA_DXT5;
  357.  
  358.    case GL_COMPRESSED_RED_RGTC1:
  359.       return MESA_FORMAT_RED_RGTC1;
  360.    case GL_COMPRESSED_SIGNED_RED_RGTC1:
  361.       return MESA_FORMAT_SIGNED_RED_RGTC1;
  362.    case GL_COMPRESSED_RG_RGTC2:
  363.       return MESA_FORMAT_RG_RGTC2;
  364.    case GL_COMPRESSED_SIGNED_RG_RGTC2:
  365.       return MESA_FORMAT_SIGNED_RG_RGTC2;
  366.  
  367.    case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
  368.       return MESA_FORMAT_L_LATC1;
  369.    case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
  370.       return MESA_FORMAT_SIGNED_L_LATC1;
  371.    case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
  372.    case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
  373.       return MESA_FORMAT_LA_LATC2;
  374.    case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
  375.       return MESA_FORMAT_SIGNED_LA_LATC2;
  376.  
  377.    case GL_ETC1_RGB8_OES:
  378.       return MESA_FORMAT_ETC1_RGB8;
  379.    case GL_COMPRESSED_RGB8_ETC2:
  380.       return MESA_FORMAT_ETC2_RGB8;
  381.    case GL_COMPRESSED_SRGB8_ETC2:
  382.       return MESA_FORMAT_ETC2_SRGB8;
  383.    case GL_COMPRESSED_RGBA8_ETC2_EAC:
  384.       return MESA_FORMAT_ETC2_RGBA8_EAC;
  385.    case GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC:
  386.       return MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC;
  387.    case GL_COMPRESSED_R11_EAC:
  388.       return MESA_FORMAT_ETC2_R11_EAC;
  389.    case GL_COMPRESSED_RG11_EAC:
  390.       return MESA_FORMAT_ETC2_RG11_EAC;
  391.    case GL_COMPRESSED_SIGNED_R11_EAC:
  392.       return MESA_FORMAT_ETC2_SIGNED_R11_EAC;
  393.    case GL_COMPRESSED_SIGNED_RG11_EAC:
  394.       return MESA_FORMAT_ETC2_SIGNED_RG11_EAC;
  395.    case GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2:
  396.       return MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1;
  397.    case GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2:
  398.       return MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1;
  399.  
  400.    default:
  401.       return MESA_FORMAT_NONE;
  402.    }
  403. }
  404.  
  405.  
  406. /**
  407.  * Given a compressed MESA_FORMAT_x value, return the corresponding
  408.  * GLenum for that format.
  409.  * This is needed for glGetTexLevelParameter(GL_TEXTURE_INTERNAL_FORMAT)
  410.  * which must return the specific texture format used when the user might
  411.  * have originally specified a generic compressed format in their
  412.  * glTexImage2D() call.
  413.  * For non-compressed textures, we always return the user-specified
  414.  * internal format unchanged.
  415.  */
  416. GLenum
  417. _mesa_compressed_format_to_glenum(struct gl_context *ctx, gl_format mesaFormat)
  418. {
  419.    switch (mesaFormat) {
  420.    case MESA_FORMAT_RGB_FXT1:
  421.       return GL_COMPRESSED_RGB_FXT1_3DFX;
  422.    case MESA_FORMAT_RGBA_FXT1:
  423.       return GL_COMPRESSED_RGBA_FXT1_3DFX;
  424.    case MESA_FORMAT_RGB_DXT1:
  425.       return GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
  426.    case MESA_FORMAT_RGBA_DXT1:
  427.       return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
  428.    case MESA_FORMAT_RGBA_DXT3:
  429.       return GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
  430.    case MESA_FORMAT_RGBA_DXT5:
  431.       return GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
  432.    case MESA_FORMAT_SRGB_DXT1:
  433.       return GL_COMPRESSED_SRGB_S3TC_DXT1_EXT;
  434.    case MESA_FORMAT_SRGBA_DXT1:
  435.       return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;
  436.    case MESA_FORMAT_SRGBA_DXT3:
  437.       return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;
  438.    case MESA_FORMAT_SRGBA_DXT5:
  439.       return GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;
  440.    case MESA_FORMAT_RED_RGTC1:
  441.       return GL_COMPRESSED_RED_RGTC1;
  442.    case MESA_FORMAT_SIGNED_RED_RGTC1:
  443.       return GL_COMPRESSED_SIGNED_RED_RGTC1;
  444.    case MESA_FORMAT_RG_RGTC2:
  445.       return GL_COMPRESSED_RG_RGTC2;
  446.    case MESA_FORMAT_SIGNED_RG_RGTC2:
  447.       return GL_COMPRESSED_SIGNED_RG_RGTC2;
  448.  
  449.    case MESA_FORMAT_L_LATC1:
  450.       return GL_COMPRESSED_LUMINANCE_LATC1_EXT;
  451.    case MESA_FORMAT_SIGNED_L_LATC1:
  452.       return GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT;
  453.    case MESA_FORMAT_LA_LATC2:
  454.       return GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT;
  455.    case MESA_FORMAT_SIGNED_LA_LATC2:
  456.       return GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT;
  457.  
  458.    case MESA_FORMAT_ETC1_RGB8:
  459.       return GL_ETC1_RGB8_OES;
  460.    case MESA_FORMAT_ETC2_RGB8:
  461.       return GL_COMPRESSED_RGB8_ETC2;
  462.    case MESA_FORMAT_ETC2_SRGB8:
  463.       return GL_COMPRESSED_SRGB8_ETC2;
  464.    case MESA_FORMAT_ETC2_RGBA8_EAC:
  465.       return GL_COMPRESSED_RGBA8_ETC2_EAC;
  466.    case MESA_FORMAT_ETC2_SRGB8_ALPHA8_EAC:
  467.       return GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC;
  468.    case MESA_FORMAT_ETC2_R11_EAC:
  469.       return GL_COMPRESSED_R11_EAC;
  470.    case MESA_FORMAT_ETC2_RG11_EAC:
  471.       return GL_COMPRESSED_RG11_EAC;
  472.    case MESA_FORMAT_ETC2_SIGNED_R11_EAC:
  473.       return GL_COMPRESSED_SIGNED_R11_EAC;
  474.    case MESA_FORMAT_ETC2_SIGNED_RG11_EAC:
  475.       return GL_COMPRESSED_SIGNED_RG11_EAC;
  476.    case MESA_FORMAT_ETC2_RGB8_PUNCHTHROUGH_ALPHA1:
  477.       return GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
  478.    case MESA_FORMAT_ETC2_SRGB8_PUNCHTHROUGH_ALPHA1:
  479.       return GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2;
  480.  
  481.    default:
  482.       _mesa_problem(ctx, "Unexpected mesa texture format in"
  483.                     " _mesa_compressed_format_to_glenum()");
  484.       return 0;
  485.    }
  486. }
  487.  
  488.  
  489. /*
  490.  * Return the address of the pixel at (col, row, img) in a
  491.  * compressed texture image.
  492.  * \param col, row, img - image position (3D), should be a multiple of the
  493.  *                        format's block size.
  494.  * \param format - compressed image format
  495.  * \param width - image width (stride) in pixels
  496.  * \param image - the image address
  497.  * \return address of pixel at (row, col, img)
  498.  */
  499. GLubyte *
  500. _mesa_compressed_image_address(GLint col, GLint row, GLint img,
  501.                                gl_format mesaFormat,
  502.                                GLsizei width, const GLubyte *image)
  503. {
  504.    /* XXX only 2D images implemented, not 3D */
  505.    const GLuint blockSize = _mesa_get_format_bytes(mesaFormat);
  506.    GLuint bw, bh;
  507.    GLint offset;
  508.  
  509.    _mesa_get_format_block_size(mesaFormat, &bw, &bh);
  510.  
  511.    ASSERT(col % bw == 0);
  512.    ASSERT(row % bh == 0);
  513.  
  514.    offset = ((width + bw - 1) / bw) * (row / bh) + col / bw;
  515.    offset *= blockSize;
  516.  
  517.    return (GLubyte *) image + offset;
  518. }
  519.  
  520.  
  521. /**
  522.  * Return a texel-fetch function for the given format, or NULL if
  523.  * invalid format.
  524.  */
  525. compressed_fetch_func
  526. _mesa_get_compressed_fetch_func(gl_format format)
  527. {
  528.    switch (format) {
  529.    case MESA_FORMAT_RGB_DXT1:
  530.    case MESA_FORMAT_RGBA_DXT1:
  531.    case MESA_FORMAT_RGBA_DXT3:
  532.    case MESA_FORMAT_RGBA_DXT5:
  533.    case MESA_FORMAT_SRGB_DXT1:
  534.    case MESA_FORMAT_SRGBA_DXT1:
  535.    case MESA_FORMAT_SRGBA_DXT3:
  536.    case MESA_FORMAT_SRGBA_DXT5:
  537.       return _mesa_get_dxt_fetch_func(format);
  538.    case MESA_FORMAT_RGB_FXT1:
  539.    case MESA_FORMAT_RGBA_FXT1:
  540.       return _mesa_get_fxt_fetch_func(format);
  541.    case MESA_FORMAT_RED_RGTC1:
  542.    case MESA_FORMAT_L_LATC1:
  543.    case MESA_FORMAT_SIGNED_RED_RGTC1:
  544.    case MESA_FORMAT_SIGNED_L_LATC1:
  545.    case MESA_FORMAT_RG_RGTC2:
  546.    case MESA_FORMAT_LA_LATC2:
  547.    case MESA_FORMAT_SIGNED_RG_RGTC2:
  548.    case MESA_FORMAT_SIGNED_LA_LATC2:
  549.       return _mesa_get_compressed_rgtc_func(format);
  550.    case MESA_FORMAT_ETC1_RGB8:
  551.       return _mesa_get_etc_fetch_func(format);
  552.    default:
  553.       return NULL;
  554.    }
  555. }
  556.  
  557.  
  558. /**
  559.  * Decompress a compressed texture image, returning a GL_RGBA/GL_FLOAT image.
  560.  * \param srcRowStride  stride in bytes between rows of blocks in the
  561.  *                      compressed source image.
  562.  */
  563. void
  564. _mesa_decompress_image(gl_format format, GLuint width, GLuint height,
  565.                        const GLubyte *src, GLint srcRowStride,
  566.                        GLfloat *dest)
  567. {
  568.    compressed_fetch_func fetch;
  569.    GLuint i, j;
  570.    GLuint bytes, bw, bh;
  571.    GLint stride;
  572.  
  573.    bytes = _mesa_get_format_bytes(format);
  574.    _mesa_get_format_block_size(format, &bw, &bh);
  575.  
  576.    fetch = _mesa_get_compressed_fetch_func(format);
  577.    if (!fetch) {
  578.       _mesa_problem(NULL, "Unexpected format in _mesa_decompress_image()");
  579.       return;
  580.    }
  581.  
  582.    stride = srcRowStride * bh / bytes;
  583.  
  584.    for (j = 0; j < height; j++) {
  585.       for (i = 0; i < width; i++) {
  586.          fetch(src, stride, i, j, dest);
  587.          dest += 4;
  588.       }
  589.    }
  590. }
  591.