blob: 1655d08e0946c8eb634de127575ba67c60f44e13 [file] [log] [blame]
XXX - Not complete -- needs errors & GLX protocol
work
Name
SGIX_icc_texture
Name Strings
GL_SGIX_icc_texture
Version
$Date: 1999/06/09 18:23:05 $ $Revision: 1.16 $
Number
154
Dependencies
OpenGL 1.1 is required.
EXT_texture3D affects the definition of this extension
SGIS_texture4D affects the definition of this extension
Overview
This extension defines new host and internal formats for the
storage of compressed images. The formats utilize a variant of
color cell compression, in which 4x4 pixel blocks are represented
by two color values and a two bit index per pixel. Two additional
values are interpolated between the two explicitly stored values,
and each pixel's index selects one of these four values. For RGB
and RGBA images, two RGB colors and a single index per pixel are
used to store the R, G, and B channels. For RGBA and
LUMINANCE_ALPHA formats, the alpha channel is encoded
independently using two alpha values and an index per pixel.
Issues
- Do we really want compressed textures to be a full-blown host
format that may be used to specify things like color tables?
Orthogonality says yes, simplicity says no.
A: ICC formats don't seem useful for things other than textures
so limit it to that.
- What about one, three, and four dimensional textures?
A: Three and four should work as stacks of 2D textures. One
could be made to work but the natural hardware implementation
would be to have a block represent a 16x1 subimage. The
locality probably wouldn't be good and equivalent results could
be obtained with texture filtering.
- Method of dealing with width & height of host image is awkward
when downloading small mipmap levels since UNPACK_ROW_LENGTH
must be set. Should we say that the rounding up happens
automatically?
A: Yes.
- Should unpacking of ICC formats be described in the section
about pixel rectangles (with the rest of the unpacking) or in
the section about texture downloads (since they cannot be used
in any other situation)? Similar question for readbacks.
- There are still some problems with the sized and base internal
formats. We're ok for now since there is only one sized
internal format for each base internal format. Can we get rid
of the unsized internal formats?
- Need to say that pixel transfer modes are not applied. Ideally this
should be done in such a way that removing this restriction in a
later extension is not a problem. We could say that trying to
do a ICC download with a non-identity pixel transfer operation
applied results in an error, but checking for non-identity pixel
transfer operations can be tricky.
- Is there any way to change this extension such that
implementations which don't support a certain compressed format
can "fake it?" With the "no compressor" limitation this might
require the texture manager to maintain a shadowed copy of the
compressed texture and put decompressed versions in texture
memory.
- Need to document behavior when interlacing is on. Won't work
but should it be ignored or an error?
Reasoning
- This spec is designed to avoid adding the ability to compress
into the ICC formats within GL. Therefore, we do not allow
subtexture downloads which are not aligned to the 4x4 tile size
or downloads of host images which are not already in a ICC
format. This ability can be added by a subsequent extension.
For now, the compression should go in a GLU extension.
New Procedures and Functions
None
New Tokens
Accepted by the <internalformat> parameter of TexImage2D,
TexImage3DEXT, and TexImage4DSGIS:
RGB_ICC_SGIX 0x8460
RGBA_ICC_SGIX 0x8461
ALPHA_ICC_SGIX 0x8462
LUMINANCE_ICC_SGIX 0x8463
INTENSITY_ICC_SGIX 0x8464
LUMINANCE_ALPHA_ICC_SGIX 0x8465
Accepted by the <internalformat> and <format> parameters of
TexImage2D, TexImage3DEXT, and TexImage4DSGIS:
R5_G6_B5_ICC_SGIX 0x8466
R5_G6_B5_A8_ICC_SGIX 0x8467
ALPHA16_ICC_SGIX 0x8468
LUMINANCE16_ICC_SGIX 0x8469
INTENSITY16_ICC_SGIX 0x846A
LUMINANCE16_ALPHA8_ICC_SGIX 0x846B
Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation)
None
Additions to Chapter 3 of the 1.1 Specification (Rasterization)
The following is added to the end if the last paragraph in the
introduction: "Six ICC formats are described in this section:
R5_G6_B5_ICC_SGIX, R5_G6_B5_A8_ICC_SGIX, ALPHA16_ICC_SGIX,
LUMINANCE16_ICC_SGIX, INTENSITY16_ICC_SGIX, and
LUMINANCE16_ALPHA8_ICC_SGIX. The ICC formats are used only as
arguments to texture download commands and not as arguments to
other commands which take pixel data from client memory. If the
format argument to a command other than a texture download command
is an enumerant for a ICC format, the error INVALID_ENUM is
generated. Other restrictions on the use of ICC formats are
described below and in Section 3.8"
The following is added to section 3.6.3 at the end of the
subsection entitled "Unpacking":
If the data in host memory is in one of the ICC formats, the data
is treated as being a sequence of blocks each of which represents
a 4x4 pixel subimage. The blocks are stored in a row-major order,
analogous to the host memory storage of pixels. The length of
each block in words and how it is decoded depends on the specific
ICC format. This information is given in the subsection
"Decompression from ICC." For each format, the block length is a
non-zero integer number of words. The type argument to the
function must be set to GL_UNSIGNED_SHORT or the error
INVALID_ENUM will be generated.
A ICC-compressed image in host memory must be made of complete 4x4
blocks. The width and height arguments give the uncompressed size
and both must be multiples of four. The number of pixels in a row
of the host image is determined in the same manner as for
uncompressed host images. If this value is not a multiple of
four, it is rounded up to the next multiple of four. The
resulting value is referred to as l. If p indicates the location
in memory of the first byte of the first block of the first row,
then the first byte of the first block of the Nth row is indicated
by
p + (N/4)k
where N is the row number (counting from zero). N must be a
multiple of four; rows which are not four-aligned may not be
individually accessed. k is defined as:
k = ceil(sl / a) * a
where s is the size of a block for the given format in GL ubytes
and a is the value of UNPACK_ALIGNMENT.
The height h of the host image is assumed to be:
h = ceil((height + s) / 4) * 4
where s is the value of SKIP_ROWS and height is the value of the
height argument to the pixel function. In other words, the sum of
the value of SKIP_ROWS and the height argument to the function is
rounded up to the next multiple of four to give the height of the
host image.
Subrectangles of ICC images may be extracted in a manner similar
to uncompressed images as determined by the parameters
UNPACK_ROW_LENGTH, UNPACK_SKIP_ROWS, and UNPACK_SKIP_PIXELS. For
compressed images, the lower left corner of the subrectangle must
be aligned to four-pixel boundaries in both x and y. The values
of UNPACK_SKIP_ROWS and UNPACK_SKIP_PIXELS must be multiples of
four (positive, negative, or zero) or the error INVALID_OPERATION
is generated. Before obtaining the first group from memory, the
pointer p is effectively advanced by (UNPACK_SKIP_PIXELS / 4)s +
(UNPACK_SKIP_ROWS/4)k bytes. ceil(width / 4) blocks are
obtained from contiguous memory (without advancing the pointer),
after which the pointer is advanced by k bytes. ceil(height/4)
sets of ceil(width/4) blocks are obtained this way.
The following is added to the end of table 3.5:
Element Meaning Target
Name and Order Buffer
---- --------------- --------
RGB_ICC_SGIX R, G, B Components Color
RGBA_ICC_SGIX R, G, B, A Components Color
LUMINANCE_ICC_SGIX Luminance Component Color
LUMINANCE_ALPHA_ICC_SGIX Luminance, A Components Color
The following subsection is added to section 3.6.3 just prior to
the subsection entitled "Conversion to floating-point":
Decompression from ICC
After being extracted from host memory, a ICC-compressed image is
converted into a floating-point color image. Each 4x4 block is
decompressed independently using mechanisms described below. We
start by describing mechanisms we will describe mechanisms common
to all ICC formats and then describe the organization of the data
within a block for each format. In this section, we assume that
byte swapping (if SWAP_BYTES is TRUE) has already taken place.
Each ICC format contains one or two fields containing 2-bit
indices for the each of the 16 pixels in the block. Within the
field, the indices are stored in bottom-to-top, left-to-right
order regardless of user-specified pixel storage modes. The index
of the bottom left pixel is stored in the two high-order bits of
the first byte of the field. The index of the top right pixel is
stored in the low-order bits of the last byte.
For ICC formats which contain RGB data (R5_G6_B5_ICC_SGIX and
R5_G6_B5_A8_ICC_SGIX), two field contain RGB color values. The
fields are each 16 bits wide with the top 5 bits specifying the
red value, the middle 6 bits specifying the green value, and the
lower 5 bits specifying the blue value. For ICC formats which
contain luminance data (LUMINANCE16_ICC_SGIX and
LUMINANCE16_ALPHA8_ICC_SGIX), two 16-bit wide fields contain
luminance values. For ICC formats which contain alpha data
(R5_G6_B5_A8_ICC_SGIX and LUMINANCE16_ALPHA8_ICC_SGIX), two 8-bit
wide fields contain alpha values. For each channel, the bits are
interpreted as unsigned fixed-point values between 0 and 1 and are
converted to floating point using the formula:
f = c / ((2**N) - 1)
where f is the floating-point representation of the value, c is
the value of the bitfield (interpreted as an unsigned integer), N
is the number of bits in the fixed-point color value, and the
division is performed in floating-point.
Once the color fields have been extracted and converted into
floating point RGB, L, or A values, intermediate values are
constructed from them. For each pair of fields c0 and c1, four
values are created:
v0 = c0
v1 = (2 * c0 + c1) / 3
v2 = (c0 + 2 * c1) / 3
v3 = c1
Operations are performed with unspecified precision. For fields
which encode RGB data, the computations are performed independently
on a per-channel basis to give the vectors RGB0, RGB1, RGB2, and
RGB3. For fields which encode alpha data, the computations give
the values A0, A1, A2, and A3. For fields which encode luminance
data, the computations give L0, L1, L2, and L3.
After the intermediate values are created, indices for each pixel
are used to choose the output value for the pixel. The indices
are each two bits. R5_G6_B5_ICC_SGIX values contain one index per
pixel to choose the intermediate value RGB0, RGB1, RGB2, or RGB3.
R5_G6_B5_A8_ICC_SGIX values contain two indices per pixel: one to
choose the RGB value and one to choose the alpha value.
Similarly, LUMINANCE16_A8_ICC_SGIX values contain an index per
pixel to choose the luminance value and an index per pixel to
choose the alpha value. LUMINANCE16_ICC_SGIX values contain an
index per pixel to choose the luminance value. In each case, an
index value of 0 results in the channel (or channels) being set to
the 0th intermediate value (RGB0, A0, or L0). A value of 1 gives
the 1st intermediate value and so on.
The bit encodings for the formats are described below. Each
description assumes that the first byte is in the lowest memory
location and the last byte is in the highest memory location. The
high-order bit of each byte is assumed to be the "first."
An R5_G6_B5_ICC_SGIX encoded block consists of 64 bits divided
into 3 fields. The first is a 32 bit field containing the two-bit
indices for the RGB channels. The second and third fields are 16
bit R5G6B5 values containing c0 and c1 for the RGB channels.
R5_G6_B5_A8_ICC_SGIX blocks encode RGB and alpha independently.
An R5_G6_B5_A8_ICC_SGIX encoded block consists of 128 bits divided
into 7 fields. The first 64 bits of the block contain the two-bit
RGB indices followed by the two 16-bit R5G6B5 values for c0 and c1
(this encoding is equivalent to the 64-bit R5_G6_B5_ICC_SGIX block
described above). The fourth field is 32 bits wide and contains
indices for the alpha values. The fifth and sixth fields are 8
bit alpha representing c0 and c1. The seventh field is 16 bits
wide and is unused. It is necessary to pad out the block so that
the 16-bit color boundaries will always fall on half-word
boundaries in host memory.
An ALPHA16_ICC_SGIX, LUMINANCE16_ICC_SGIX, or INTENSITY16_ICC_SGIX
encoded block consists of 64 bits divided into 3 fields. The
first is a 32 bit field containing the two-bit indices for the
alpha, luminance, or intensity values. The second and third
fields are 16 bit unsigned fixed-point alpha, luminance, or
intensity values containing c0 and c1 respectively. This encoding
is identical to the encoding of R5_G6_B5_ICC_SGIX blocks except
that the c0 and c1 fields represent alpha, luminance, or intensity
instead of RGB.
A LUMINANCE16_ALPHA8_ICC_SGIX encoded block is identical to a
R5_G6_B5_A8_ICC_SGIX block except that sixteen-bit unsigned
luminance values are stored in place of the sixteen-bit RGB
values.
After decompression, the image is recombined into a ceil(width /
4) * 4 by ceil(height / 4) * 4 image of RGB, RGBA, A, L, I, or LA
pixels. Pixels whose y positions in the image (where the bottom
row is 0 and the top row is (ceil(height / 4) * 4) - 1) are
greater than (height - 1) are discarded. Likewise, pixels whose x
positions are greater than (width - 1) are discarded.
The following is added to Section 3.8:
In the paragraph beginning "The image itself (pointed to by data)"
the sentence beginning "Each color component is converted" is
prefixed by "If the internal format of the texture is not one of
RGB_ICC_SGIX, RGBA_ICC_SGIX, LUMINANCE_ICC_SGIX,
LUMINANCE_ALPHA_ICC_SGIX, R5_G6_B5_ICC_SGIX, R5_G6_B5_A8_ICC_SGIX,
LUMINANCE16_ICC_SGIX, or LUMINANCE16_ALPHA8_ICC_SGIX." The
following is added to the end of the paragraph: "If the internal
format is one of the ICC formats, the format parameter of the
function must either be equal to the internal format parameter (if
the internal format parameter is sized) or contain the same
channels as the internal format (if the internal format is
unsized) or the error INVALID_ENUM will be generated. Also, a ICC
internal format may not be specified for a one-dimensional
texture. If the format parameter to TexImage1D is set to one of
the ICC internal formats, the error INVALID_ENUM is generated."
The sentence in the paragraph describing CopyTexImage2D which
reads: "Parameters level, internalformat, and border are specified
using the same values, with the same meanings, as the equivalent
arguments of TexImage2D, except that internalformat may not be
specified as 1, 2, 3, or 4." is changed to read: "Parameters
level, internalformat, and border are specified using the same
values, with the same meanings, as the equivalent arguments of
TexImage2D, except that internalformat may not be specified as 1,
2, 3, 4, or any of the ICC internal formats."
The following is added to the end of the paragraph which describes
the subtexture download and copy commands: "CopyTexSubImage1D and
CopyTexSubImage2D may not be used with a target texture whose
internal format is one of the ICC formats or the error
INVALID_OPERATION is generated. For TexSubImage1D and
TexSubImage2D, the target texture have a ICC internal format but
requirements in addition to those mentioned above are enforced.
The xoffset and yoffset parameters must be multiples of four or
the error INVALID_OPERATION is generated. Also, the width
parameter must either be a multiple of four which is less than the
width of the texture minus xoffset or be equal to the width of the
texture minus xoffset or the error INVALID_VALUE is generated.
The height parameter must either a multiple of four which is less
than the height of the texture minus yoffset or be equal to the
height of the texture minus yoffset or the error INVALID_VALUE is
generated. In other words, the subimage may not partially cover a
4x4 region of the target texture. Additionally, for
TexSubImage2D, TexSubImage3DEXT, and TexSubImage4DSGIS calls, the
format parameter must have the same channels as the base internal
format of the texture or the error INVALID_ENUM will be
generated."
The following is added to Table 3.8:
Sized Base R G B A L I
Internal Format Internal Format Bits Bits Bits Bits Bits Bits
--------------- --------------- ---- ---- ---- ---- ---- ----
R5_G6_B5_ICC_SGIX RGB 5 6 5
R5_G6_B5_A8_ICC_SGIX RGBA 5 6 5 8
LUMINANCE16_ICC_SGIX LUMINANCE 16
LUMINANCE16_ALPHA8_ICC_SGIX LUMINANCE_ALPHA 8 16
The caption for Table 3.8 is updated as follows:
Correspondence of sized internal formats to base internal formats
and desired component resolutions for each sized internal format.
For ICC compressed formats, the component resolutions do not
directly reflect the stored size of each pixel, but rather the
resolution of the two color values stored for each 4x4 pixel
block.
Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations
and the Frame Buffer)
The following is added to the first paragraph of section 4.3.2
after the sentence beginning "The arguments after x and y: "As in
the case of TexImage, ICC formats may only be used for reading
back ICC textures or the error INVALID_ENUM is generated. For
more information, see Chapter 6 (State and State Requests).
Additionally, the host ICC format must have the same
channels as the base internal format of the source ICC texture of
the error INVALID_ENUM is generated. During TexSubImage readbacks of ICC
textures, the "
Additions to Chapter 5 of the 1.1 Specification (Special Functions)
None
Additions to Chapter 6 of the 1.1 Specification (State and State Requests)
Added to the end of the paragraph in the introduction which talks
about the GetTexImage command: "Additional restrictions apply if
the format is one of the ICC formats. The internal format of the
texture must have a base internal format equal to the format
parameter or the error INVALID_ENUM is generated. Similarly to
the download case, the width and height of the data read back is
rounded up to the next multiples of 4 such that only complete
compressed tiles are returned."
Additions to the GLX Specification
None
Dependencies on EXT_texture3D
If EXT_texture3D is not supported, all references to
TexImage3DEXT, TexSubImage3DEXT, CopyTexImage3DEXT, and
CopyTexSubImage3DEXT are ignored.
Dependencies on SGIS_texture4D
If SGIS_texture4D is not supported, all references to
TexImage4DSGIS, TexSubImage4DSGIS, CopyTexImage4DSGIS, and
CopyTexSubImage4DSGIS are ignored.
Errors
XXX
New State
None
New Implementation Dependent State
None