EXT_texture_compression_dxt1

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