Name

    NV_texture_compression_vtc

Name Strings

    GL_NV_texture_compression_vtc

Contact

    Matt Craighead, NVIDIA Corporation (mcraighead 'at' nvidia.com)

Notice

    Copyright NVIDIA Corporation, 2000, 2001, 2004.

IP Status

    NVIDIA Proprietary.

Version

    NVIDIA Date: June 3, 2004
    Version:     4

Number

    228

Dependencies

    Written based on the wording of the OpenGL 1.2.1 specification.

    ARB_texture_compression is required.

    EXT_texture_compression_s3tc is required.

    ARB_texture_non_power_of_two interacts with this extension.

Overview

    This extension adds support for the VTC 3D texture compression
    formats, which are analogous to the S3TC texture compression formats,
    with the addition of some retiling in the Z direction.  VTC has the
    same compression ratio as S3TC and uses 4x4x1, 4x4x2, (4x4x3 when
    non-power-of-two textures are supported), or 4x4x4 blocks.

Issues

    *   Should the enumerants' (1) values and (2) names be reused from
        the S3TC extension?

        RESOLVED: Yes and yes.  There is such a close correspondence
        between the formats that introducing new values or names would
        serve no purpose.

    *   Should the block alignment restrictions differ in any way from
        the block alignment restrictions in the S3TC extension?

        RESOLVED: No, except for the addition of the Z-direction block
        alignment restriction for CompressedTexSubImage3D, which is
        analogous to the X and Y restrictions.

    *   Should VTC compression work with the ARB_texture_non_power_of_two
        functionality?

        RESOLVED: Yes.  The blockIndex computation works for
        non-power-of-two width, height, and depth dimensions.

        Consider a 31x25x11 3D texture to be stored using VTC.
        The initial 31x25x8 portion of the volume is bricked up using
        VTC with 4x4x4 blocks where the 31x25 dimensions are rounded
        up to 32x28.  Following the expanded 32x28x8 initial volume are
        the final texels arranged as 32x28x3 with 4x4x3 blocks.

New Procedures and Functions

    None.

New Tokens

    Accepted by the <internalformat> parameter of TexImage3D and
    CompressedTexImage3DARB and the <format> parameter of
    CompressedTexSubImage2DARB:

        COMPRESSED_RGB_S3TC_DXT1_EXT                   0x83F0
        COMPRESSED_RGBA_S3TC_DXT1_EXT                  0x83F1
        COMPRESSED_RGBA_S3TC_DXT3_EXT                  0x83F2
        COMPRESSED_RGBA_S3TC_DXT5_EXT                  0x83F3

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

    None.

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

    Modify the paragraph added to the end of the TexSubImage discussion
    (page 123) by EXT_texture_compression_s3tc to say:

    "If the internal format of the texture image being modified is
    COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT3_EXT, or COMPRESSED_RGBA_S3TC_DXT5_EXT, the
    texture is stored using one of several S3TC or VTC compressed texture
    image formats.  Such images are easily edited along 4x4 texel
    boundaries, so the limitations on TexSubImage2D, TexSubImage3D,
    CopyTexSubImage2D, and CopyTexSubImage3D parameters are relaxed.
    These commands 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."

    Modify the paragraph added to Section 3.8.2 "Alternate Image
    Specification" at the end of the CompressedTexImage section by
    EXT_texture_compression_s3tc to say:

    "If <internalformat> is COMPRESSED_RGB_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, or
    COMPRESSED_RGBA_S3TC_DXT5_EXT, the compressed texture is stored using
    one of several S3TC or VTC compressed texture image formats.  The
    S3TC texture compression algorithm supports only 2D images without
    borders, while the VTC texture compression algorithm supports only
    3D images without borders.  CompressedTexImage1DARB produces an
    INVALID_ENUM error if <internalformat> is an S3TC/VTC format.
    CompressedTexImage2DARB and CompressedTexImage3DARB will produce an
    INVALID_OPERATION error if <border> is non-zero."

    Modify the paragraph added to Section 3.8.2 "Alternate Image
    Specification" at the end of the CompressedTexSubImage section by
    EXT_texture_compression_s3tc to say:

    "If the internal format of the texture image being modified is
    COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT3_EXT, or COMPRESSED_RGBA_S3TC_DXT5_EXT, the
    texture is stored using one of several S3TC or VTC compressed texture
    image formats.  Since these algorithms support only 2D and 3D images,
    CompressedTexSubImage1DARB produces an INVALID_ENUM error if <format>
    is an S3TC/VTC format.  Since S3TC/VTC images are easily edited along
    4x4 and 4x4x4 texel boundaries, the limitations on
    CompressedTexSubImage2D and CompressedTexSubImage3D are relaxed.
    CompressedTexSubImage2D and CompressedTexSubImage3D 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.
        * <depth> is not a multiple of four or equal to TEXTURE_DEPTH.
        * <xoffset>, <yoffset>, or <zoffset> is not a multiple of four."

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

    None.

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

    None.

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

    None.

Additions to Appendix A of the OpenGL 1.2.1 Specification (Invariance)

    None.

Dependencies on ARB_texture_non_power_of_two

    There are no explicit dependencies on ARB_texture_non_power_of_two
    but the Appendix language is compatible with non-power-of-two
    texture sizes.  4x4x3 blocks are not possible if texture sizes are
    restricted to power-of-two values.

GLX Protocol

    None.

Errors

    The INVALID_ENUM error that was generated by CompressedTexImage3DARB
    if <internalformat> is COMPRESSED_RGB_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, or
    COMPRESSED_RGBA_S3TC_DXT5_EXT no longer occurs.

    INVALID_OPERATION is generated by CompressedTexImage3DARB if
    <internalformat> is COMPRESSED_RGB_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, or
    COMPRESSED_RGBA_S3TC_DXT5_EXT and <border> is not equal to zero.

    The INVALID_ENUM error that was generated by
    CompressedTexSubImage3DARB if <format> is
    COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT3_EXT, or COMPRESSED_RGBA_S3TC_DXT5_EXT no
    longer occurs.

    INVALID_OPERATION is generated by TexSubImage3D or
    CopyTexSubImage3D if INTERNAL_FORMAT is COMPRESSED_RGB_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT, or
    COMPRESSED_RGBA_S3TC_DXT5_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.

    INVALID_OPERATION is generated by CompressedTexSubImage3D
    if INTERNAL_FORMAT is COMPRESSED_RGB_S3TC_DXT1_EXT,
    COMPRESSED_RGBA_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT3_EXT,
    or COMPRESSED_RGBA_S3TC_DXT5_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; <depth> is not
    a multiple of four or equal to TEXTURE_DEPTH; <xoffset> <yoffset>,
    or <zoffset> is not a multiple of four.

    See also errors in the GL_ARB_texture_compression and
    GL_EXT_texture_compression_s3tc specifications.

New State

    None.

Appendix

    VTC Compressed Texture Image Formats

    Each VTC compression format is similar to a corresponding S3TC
    compression format, but where an S3TC block encodes a 4x4 block of
    texels, a VTC block encodes a 4x4x1, 4x4x2, or 4x4x4 (or 4x4x3 if
    non-power-of-two textures are supported) block of texels.  If the
    depth of the image is four or greater, 4x4x4 blocks are used, and
    if the depth is 1 or 2, 4x4x1 or 4x4x2 blocks are used.

    (If non-power-of-two textures are supported and the depth of the
    texture is not a multiple 4, the excess texels in depth after 4x4x4
    blocks are arranged are stored with 4x4x1, 4x4x2, or 4x4x3 blocks
    as necessary to complete the texture.)

    The size in bytes of a VTC image with dimensions w, h, and d is:

        ceil(w/4) * ceil(h/4) * d * blocksize,

    where blocksize is the size of an analogous 4x4 S3TC block and is
    either 8 or 16 bytes.

    The block containing a texel at location (x,y,z) starts at an offset
    inside the image of blockIndex bytes where blockIndex is computed
    as follows:

    if (z >= 4*floor(d/4)) {
        blockIndex = blocksize * (ceil(w/4) * ceil(h/4) * 4*floor(d/4) +
                                  floor(x/4) +
                                  ceil(w/4) * (floor(y/4) +
                                               ceil(h/4) * (z-4*floor(d/4)) ));
    } else {
        blockIndex = blocksize * 4 * (floor(x/4) +
                                      ceil(w/4) * (floor(y/4) +
                                                   ceil(h/4) * floor(z/4)));
    }

    These two observations about subexpressions in the above computation
    are useful:

        4*floor(d/4) == d & ~0x3

        when z > 4*floor(d/4) and z < d, z-4*floor(d/4) == z & 0x3

    A 4x4x1 block of each of the four formats is stored in exactly the
    same way that a 4x4 block of the analogous S3TC format is stored.

    A 4x4x2, 4x4x3, or 4x4x4 block is stored as two, three, or four
    consecutive 4x4 blocks of the analogous S3TC format, one for each
    layer inside the block.  For example, a 4x4x2 DXT1 block consists of
    16 bytes in total.  The first 8 bytes encode the texels at locations
    (0,0,0) through (3,3,0), and the second 8 bytes encode the texels
    at locations (0,0,1) through (3,3,1).

    For definitions of the S3TC formats, please refer to the
    EXT_texture_compression_s3tc specification.

Revision History

    April 20, 2004 - Relax restrictions on depth and zoffset for
    CopyTexSubImage3D and TexSubImage3D commands.  Previous restrictions
    required 1) the image level's depth to be 1 for CopyTexSubImage3D to
    work (making the command useless in practice) and 2) the depth and
    zoffset for TexSubImage3D to be a multiple 4.  If these restrictions
    were violated, an INVALID_OPERATION error was documented to be
    generated.  NVIDIA Release 60 drivers after April 20, 2004 relax
    these restrictions.  Note the restrictions on CompressedTexSubImage3D
    that depth and zoffset must be multiples of 4 still exist because the
    VTC block is a 3D 4x4x4 block (or 4x4x2 and 4x4x1 in the end cases).

    Jun 3, 2004 - Update blockIndex to support non-power-of-two dimensions
    for VTC storage.
