Name

    EXT_texture_compression_dxt1

Name Strings

    GL_EXT_texture_compression_dxt1

Contributors

    Pat Brown, NVIDIA Corporation
    Mathias Agopian, PalmSource, Inc

Contact

    Norbert Juffa, NVIDIA Corporation (njuffa 'at' nvidia.com)

Notice

    Copyright NVIDIA Corporation, 2004.

Status

    Shipping in an NVIDIA OpenGL ES 1.x implementation

Version

    1.0, August 12, 2008

Number

    OpenGL Extension #309
    OpenGL ES Extension #49

Dependencies

    OpenGL-ES 1.0 is required. Since OpenGL-ES 1.0 is specified using
    the OpenGL 1.3 Specification as a base, this extension references
    the OpenGL 1.3 Specification.

Overview

    Support of EXT_texture_compression_s3tc is attractive for OpenGL-ES
    implementations because it provides compressed textures that allow
    for significantly reduced texture storage. Reducing texture storage is 
    advantageous because of the smaller memory capacity of many embedded 
    systems compared to desktop systems. Smaller textures also provide a
    welcome performance advantage since embedded platforms typically provide
    less performance than desktop systems. S3TC compressed textures 
    are widely supported and used by applications. The DXT1 format is 
    used in the vast majority of cases in which S3TC compressed textures 
    are used.
    
    However, EXT_texture_compression_s3tc specifies functionality that is
    burdensome for an OpenGL-ES implementation. In particular it requires
    that the driver provide the capability to compress textures into 
    S3TC texture formats, as an S3TC texture format is accepted as the
    <internalformat> parameter of TexImage2D and CopyTexImage2D. Further,
    EXT_texture_compression_s3tc may require conversion from one S3TC 
    format to another during CompressedTexSubImage2D if the <format> 
    parameter does not match the <internalformat> of the texture image 
    previously created by TexImage2D.

    In an OpenGL-ES implementation it is therefore advantageous to support 
    a limited subset of EXT_texture_compression_s3tc: Restrict supported 
    texture formats to DXT1 and restrict supported operations to those
    that do not require texture compression into an S3TC texture format or
    decompression from an S3TC texture format.

IP Status

    A license to the S3TC Intellectual Property may be necessary for 
    implementation of this extension.  You should consult with your 
    Attorney to determine the need for a license.

New Procedures and Functions

    None

New Tokens

    Accepted by the <internalformat> parameter of CompressedTexImage2D
    and the <format> parameter of CompressedTexSubImage2D:

    COMPRESSED_RGB_S3TC_DXT1_EXT                      0x83F0
    COMPRESSED_RGBA_S3TC_DXT1_EXT                     0x83F1

    CompressedTexImage2D and CompressedTexSubImage2D are the only 
    functions that support the S3TC DXT1 texture formats. No other S3TC 
    texture formats are supported.

Additions to Chapter 2 of the OpenGL 1.3 Specification (OpenGL Operation)

    None.

Additions to Chapter 3 of the OpenGL 1.3 Specification (Rasterization)

    Table 3.17: Specific Compressed Internal Formats

    Compressed Internal Format        Base Internal Format
    ==========================        ====================
    COMPRESSED_RGB_S3TC_DXT1_EXT      RGB
    COMPRESSED_RGBA_S3TC_DXT1_EXT     RGBA


    Add to Section 3.8.3, Compressed Texture Images
    (add to the end of the CompressedTexImage section)

    If <internalformat> is COMPRESSED_RGB_S3TC_DXT1_EXT or
    COMPRESSED_RGBA_S3TC_DXT1_EXT, the compressed texture is stored 
    in one of these two S3TC texture formats. OpenGL-ES 1.0 and the S3TC 
    texture compression algorithm support only 2D images without borders.
    CompressedTexImage2D will produce an INVALID_OPERATION error if
    <border> is non-zero, according to the OpenGL-ES 1.0 Specification.

    Add to Section 3.8.3, Compressed Texture Images
    (add to the end of the CompressedTexSubImage section)

    If the internal format of the texture image being modified is
    COMPRESSED_RGB_S3TC_DXT1_EXT or COMPRESSED_RGBA_S3TC_DXT1_EXT, the
    texture is stored using one of these two S3TC compressed texture image
    formats. OpenGL-ES 1.0 only supports CompressedTexSubImage2D.
    Since DXT1 images are easily edited along 4x4 texel boundaries, 
    the limitations on CompressedTexSubImage2D are relaxed.  
    CompressedTexSubImage2D will result in an INVALID_OPERATION error only 
    if one of the following conditions occurs:

        * <width> is not a multiple of four or equal to TEXTURE_WIDTH.
        * <height> is not a multiple of four or equal to TEXTURE_HEIGHT.
        * <xoffset> or <yoffset> is not a multiple of four.
        * <format> does not match the internal format of the texture image
          being modified.

    The following restrictions at the end of section 3.8.3 of the 
    OpenGL 1.3 Specification do not apply to S3TC DXT1 texture formats, 
    since subimage modification is straightforward as long as the subimage 
    is properly aligned.
    
    DELETE: Calling CompressedTexSubImage3D, CompressedTexSubImage2D, 
    DELETE: or CompressedTexSubImage1D will result in an INVALID 
    DELETE: OPERATION error if xoffset, yoffset, or zoffset is not 
    DELETE: equal to -b (border width), or if <width>, <height>, and
    DELETE: <depth> do not mathc the values of TEXTURE_WIDTH,
    DELETE: TEXTURE_HEIGHT, or TEXTURE_DEPTH, respectively. The contents
    DELETE: of any texel outside the region modified by the call are
    DELETE: undefined.

Additions to Chapter 4 of the OpenGL 1.3 Specification (Per-Fragment
Operations and the Frame Buffer)

    None.

Additions to Chapter 5 of the OpenGL 1.3 Specification (Special Functions)

    None.

Additions to Chapter 6 of the OpenGL 1.3 Specification (State and State 
Requests)

    None.

Additions to Appendices A through G of the OpenGL 1.3 Specification

    None.

Additions to the EGL Specifications

    None.

Errors

    INVALID_OPERATION is generated by CompressedTexImage2D if
    <internalformat> is COMPRESSED_RGB_S3TC_DXT1_EXT or
    COMPRESSED_RGBA_S3TC_DXT1_EXT and <border> is not equal to zero.
    OpenGL-ES 1.0 does not support non-zero borders.

    INVALID_OPERATION is generated by TexImage2D and CopyTexImage2D 
    if <internalformat> is COMPRESSED_RGB_S3TC_DXT1_EXT or 
    COMPRESSED_RGBA_S3TC_DXT1_EXT.

    INVALID_OPERATION is generated by TexSubImage2D and CopyTexSubImage2D
    if the internal format of the texture currently bound to <target> is
    COMPRESSED_RGB_S3TC_DXT1_EXT or COMPRESSED_RGBA_S3TC_DXT1_EXT.

    INVALID_OPERATION is generated by CompressedTexSubImage2D if <format> 
    is COMPRESSED_RGB_S3TC_DXT1_EXT or COMPRESSED_RGBA_S3TC_DXT1_EXT and 
    any of the following apply:
    <width> is not a multiple of four or equal to TEXTURE_WIDTH;
    <height> is not a multiple of four or equal to TEXTURE_HEIGHT;
    <xoffset> or <yoffset> is not a multiple of four;
    <format> does not match the internal format of the texture image
    being modified.

Appendix:

    S3TC DXT1 Compressed Texture Image Formats

    Compressed texture images stored using the S3TC compressed image formats
    are represented as a collection of 4x4 texel blocks, where each block
    contains 64 or 128 bits of texel data.  The image is encoded as a normal
    2D raster image in which each 4x4 block is treated as a single pixel.  If
    an S3TC image has a width or height less than four, the data corresponding
    to texels outside the image are irrelevant and undefined.

    When an S3TC image with a width of <w>, height of <h>, and block size of
    <blocksize> (8 or 16 bytes) is decoded, the corresponding image size (in
    bytes) is:
    
        ceil(<w>/4) * ceil(<h>/4) * blocksize.

    When decoding an S3TC image, the block containing the texel at offset
    (<x>, <y>) begins at an offset (in bytes) relative to the base of the
    image of:

        blocksize * (ceil(<w>/4) * floor(<y>/4) + floor(<x>/4)).

    The data corresponding to a specific texel (<x>, <y>) are extracted from a
    4x4 texel block using a relative (x,y) value of
    
        (<x> modulo 4, <y> modulo 4).

    There are four distinct S3TC image formats:

    COMPRESSED_RGB_S3TC_DXT1_EXT:  Each 4x4 block of texels consists of 64
    bits of RGB image data.  

    Each RGB image data block is encoded as a sequence of 8 bytes, called (in
    order of increasing address):

            c0_lo, c0_hi, c1_lo, c1_hi, bits_0, bits_1, bits_2, bits_3

        The 8 bytes of the block are decoded into three quantities:

            color0 = c0_lo + c0_hi * 256
            color1 = c1_lo + c1_hi * 256
            bits   = bits_0 + 256 * (bits_1 + 256 * (bits_2 + 256 * bits_3))
        
        color0 and color1 are 16-bit unsigned integers that are unpacked to
        RGB colors RGB0 and RGB1 as though they were 16-bit packed pixels with
        a <format> of RGB and a type of UNSIGNED_SHORT_5_6_5.

        bits is a 32-bit unsigned integer, from which a two-bit control code
        is extracted for a texel at location (x,y) in the block using:

            code(x,y) = bits[2*(4*y+x)+1..2*(4*y+x)+0]
        
        where bit 31 is the most significant and bit 0 is the least
        significant bit.

        The RGB color for a texel at location (x,y) in the block is given by:

            RGB0,              if color0 > color1 and code(x,y) == 0
            RGB1,              if color0 > color1 and code(x,y) == 1
            (2*RGB0+RGB1)/3,   if color0 > color1 and code(x,y) == 2
            (RGB0+2*RGB1)/3,   if color0 > color1 and code(x,y) == 3

            RGB0,              if color0 <= color1 and code(x,y) == 0
            RGB1,              if color0 <= color1 and code(x,y) == 1
            (RGB0+RGB1)/2,     if color0 <= color1 and code(x,y) == 2
            BLACK,             if color0 <= color1 and code(x,y) == 3

        Arithmetic operations are done per component, and BLACK refers to an
        RGB color where red, green, and blue are all zero.

    Since this image has an RGB format, there is no alpha component and the
    image is considered fully opaque.


    COMPRESSED_RGBA_S3TC_DXT1_EXT:  Each 4x4 block of texels consists of 64
    bits of RGB image data and minimal alpha information.  The RGB components
    of a texel are extracted in the same way as COMPRESSED_RGB_S3TC_DXT1_EXT.
 
        The alpha component for a texel at location (x,y) in the block is
        given by:

            0.0,               if color0 <= color1 and code(x,y) == 3
            1.0,               otherwise

        IMPORTANT:  When encoding an RGBA image into a format using 1-bit
        alpha, any texels with an alpha component less than 0.5 end up with an
        alpha of 0.0 and any texels with an alpha component greater than or
        equal to 0.5 end up with an alpha of 1.0.  When encoding an RGBA image
        into the COMPRESSED_RGBA_S3TC_DXT1_EXT format, the resulting red,
        green, and blue components of any texels with a final alpha of 0.0
        will automatically be zero (black).  If this behavior is not desired
        by an application, it should not use COMPRESSED_RGBA_S3TC_DXT1_EXT.
        This format will never be used when a generic compressed internal
        format (Table 3.16.2) is specified, although the nearly identical
        format COMPRESSED_RGB_S3TC_DXT1_EXT (above) may be.


Revision History

    1.0,  08/12/08 jleech:  Move out of draft status as NVIDIA has
                            verified a shipping implementation.
    0.6,  08/07/08 jleech:  Assigned OpenGL ES extension number so the
                            extension can live in both API registries.
    0.5,  09/24/04 njuffa:  Added contributors section. Changed name to
                            EXT_texture_compression_dxt1
    0.4,  09/23/04 njuffa:  Extension no longer specified as a delta to
                            EXT_texture_compression_s3tc
    0.3,  03/12/04 njuffa:  Added section IP Status
    0.2,  03/04/04 njuffa:  Extension name modification; clarification of
                            error generation conditions
    0.1,  02/13/04 njuffa:  Initial revision
