blob: e91c7a8f7466dddfcc62af14df18913de595c829 [file] [log] [blame]
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.