XXX - Not complete. Name SGIX_slim Name Strings GL_SGIX_slim Version $Date: 1998/08/03 19:03:02 $ $Revision: 1.11 $ Number ??? Dependencies This extension depends on the ycrcbformat, and subsample extensions. Overview This extension defines a mechanism to draw and read SLIM (Rice) compressed images. SLIM is a lossless compression technique derived from a scheme developed by Robert F. Rice, Pen-Shu Yeh, and Warner Miller. The scheme works well on data (images) composed of relatively small integers, 8-12 bits. The specifics of the algorithm used in OpenGL are not included in this spec. If the extension were made public we would have to include such a specification. SLIM supports 8, 10, and 12 bit components, one to four components per pixel, and two alternative component samplings beyond uniform (422 and 4224). NOTE: that for compatibility reasons the older Rice format images will also be supported. The specification of color space and component subsampling is accomplished through the subsample and ycrcbformat extensions. SLIM compression is specified through the parameter to DrawPixels, ReadPixels. Six data types are supported, corresponding to unsigned 8 and 10 bit components, and signed 12 bit components (SLIM8U_SGIX, SLIM10U_SGIX, SLIM12S_SGIX, and RICE8U_SGIX, RICE10U_SGIX, RICE12S_SGIX). PixelStore parameters are used to specify and query compressed image size. Issues - The SLIM/RICE compression/decompression algorithm is not defined/described in this extension. - Rice now shows up explicitly as an input is that a problem? This is a person (Robert Rice). - Do we really need a header to store the image size? Could this be passed as a separate parameter? A: We looked into passing the sizes as pixel storage parameters, but ran into problems with the async extension. If the size is GL state, it's difficult to come up with an implementation-friendly spec for when the state is updated. Also it's difficult to allow more than one asynchronous read outstanding in this case. Putting the data in a header has the advantage that it keeps the length associated with the image data automatically. New Procedures and Functions None. New Tokens Accepted by the parameter of PixelStoref, PixelStorei, GetBooleanv, GetIntegerv, GetFloatv and GetDoublev: PACK_MAX_COMPRESSED_SIZE_SGIX 0x831B Accepted by the parameter of all routines which take one or two dimensional color pixel data from client memory or write it to client memory including DrawPixels, ReadPixels, TexImage2D, GetTexImage2D, GetHistogramEXT, GetMinmaxEXT, ConvolutionFilter2DEXT, and ColorTableSGI: SLIM8U_SGIX 0x831D SLIM10U_SGIX 0x831E SLIM12S_SGIX 0x831F RICE8U_SGIX RICE10U_SGIX RICE12S_SGIX Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation) None. Additions to Chapter 3 of the 1.1 Specification (Rasterization) 3.6.3 Rasterization of Pixel Rectangles The SLIM/RICE s are added to Table 3.4: Parameter Corresponding Special Token Value GL Data Type Interpretation ---------------- ------------- -------------- UNSIGNED_BYTE ubyte No BYTE byte No UNSIGNED_SHORT ushort No SHORT short No UNSIGNED_INT uint No INT int No FLOAT float No BITMAP ubyte Yes UNSIGNED_BYTE_3_3_2_EXT ubyte Yes UNSIGNED_SHORT_4_4_4_4_EXT ushort Yes UNSIGNED_SHORT_5_5_5_1_EXT ushort Yes UNSIGNED_INT_8_8_8_8_EXT uint Yes UNSIGNED_INT_10_10_10_2_EXT uint Yes SLIM8U_SGIX float Yes SLIM10U_SGIX float Yes SLIM12S_SGIX float Yes RICE8U_SGIX float Yes RICE10U_SGIX float Yes RICE12S_SGIX float Yes Decompression This step only applies if the parameter to DrawPixels is set to one of SLIM8U_SGIX, SLIM10U_SGIX, SLIM12S_SGIX, RICE8U_SGIX, RICE10U_SGIX, or RICE12S_SGIX. These types indicate that the image is compressed using SLIM or Rice compression, respectively. The images are stored as a header containing a GLsizei value giving the length of compressed image in bytes followed by the compressed image data. For correct operation, the data pointer passed to DrawPixels must obey any alignment restrictions imposed by the host architecture on the GLsizei data type. If the data is not correctly aligned, the results are undefined. (This restriction is analogous to the restriction tacitly placed on the image pointer passed to DrawPixels when the type is INT. The GL implementation must be able to dereference the pointer as a GLint value without getting a bus error.) If the width or height argument is zero, the data pointer is not dereferenced and so a NULL pointer may be passed in. The compressed byte stream is passed to the GL and interpreted as defined by the , and parameters to DrawPixels, and the UNPACK_SAMPLING_SGIX parameter to PixelStore. The width of the image represented by the byte stream is determined by UNPACK_ROW_LENGTH, if it is positive, and the parameter to DrawPixels, otherwise. The height of the image represented by the byte stream is determined by UNPACK_IMAGE_HEIGHT_EXT, if it is positive, and the parameter to DrawPixels, otherwise. ?? since we don't support subimage should the UNPACK parameters be ignored?? If the PixelStore parameters UNPACK_ROW_LENGTH, UNPACK_SKIP_ROWS, and UNPACK_SKIP_PIXELS, and the DrawPixel parameters and indicate that a sub-image is to be drawn an error INVALID_OPERATION is issued. The output of the decompression algorithm is a sequence of unsigned bytes or signed shorts corresponding to an uncompressed image. The downstream GL mechanisms should proceed as if the PixelStore parameters UNPACK_ROW_LENGTH, UNPACK_SKIP_ROWS, and UNPACK_SKIP_PIXELS are all equal to zero. The components of a SLIM/RICE image are mapped to GL that do not have special interpretation, FLOAT. The pixel storage parameters UNPACK_SWAP_BYTES, UNPACK_LSB_FIRST, and UNPACK_ALIGNMENT are ignored for compressed images. Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations and the Frame Buffer) 4.3.2 Reading Pixels The following entries are added to Table 4.5: Parameter Name Type Initial Value Valid Range -------------- ---- ------------- ----------- PACK_MAX_COMPRESSED_SIZE_SGIX integer 0 [0,inf) The following needs to be added to the end of the "Final Conversion" subsection: If the parameter to ReadPixels is one of SLIM8U_SGIX, SLIM10U_SGIX, SLIM12S_SGIX, RICE8U_SGIX, RICE10U_SGIX, or RICE12S_SGIX the components are converted to UNSIGNED_BYTE and SIGNED_SHORT as appropriate. ??? Compression This step only applies if the parameter to ReadPixels is set to one of SLIM8U_SGIX, SLIM10U_SGIX, SLIM12S_SGIX, RICE8U_SGIX, RICE10U_SGIX, or RICE12S_SGIX. The pixel stream being read is compressed as defined by the and parameters to ReadPixels, and the PACK_SAMPLING_SGIX parameter to PixelStore. The output of this step is a byte stream of compressed image data. Placement in Client Memory, Uncompressed Images If the parameter to ReadPixels is not one of SLIM/RICE* then the pixels of the image are transferred to host memory as described in this section. etc... Placement in Client Memory, Compressed Images This step only applies if the parameter to ReadPixels is set to one of SLIM8U_SGIX, SLIM10U_SGIX, SLIM12S_SGIX, RICE8U_SGIX, RICE10U_SGIX, or RICE12S_SGIX. The compressor places a header containing the size in bytes of the compressed image stored as a GLsizei value at the location *data in host memory. As in the DrawPixels case, the data pointer must obey system requirements for the alignment of GLsizei values. The byte stream of compressed image data is placed in host memory starting immediately after the header. Up to PACK_MAX_COMPRESSED_SIZE_SGIX bytes are written. If the value of PACK_MAX_COMPRESSED_SIZE_SGIX is greater than zero and the compressed size is greater than the value of PACK_MAX_COMPRESSED_SIZE_SGIX, the error INVALID_OPERATION is generated. If this occurs, the contents of the first PACK_MAX_COMPRESSED_SIZE_SGIX bytes after the pointer are undefined, but bytes outside this range are guaranteed to be left unchanged. The pixel pack parameters PACK_SWAP_BYTES, PACK_LSB_FIRST, PACK_ROW_LENGTH, PACK_SKIP_ROWS, PACK_SKIP_PIXELS, and PACK_ALIGNMENT are not considered when reading back compressed images. 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) XXX Additions to the GLX Specification Errors INVALID_VALUE is generated if the pname argument to PixelStorei or PixelStoref is PACK_MAX_COMPRESSED_SIZE_SGIX and the value of pname is less than zero. INVALID_OPERATION is generated if the compressed data requested by a ReadPixels or GetTexImage will occupy more than PACK_MAX_COMPRESSED_SIZE_SGIX bytes. INVALID_ENUM is generated if the type argument for a pixel command specifies a slim type but the format argument specifies color index, stencil index, or depth values. INVALID_ENUM is generated if the type argument for a pixel command which deals with images of greater than two dimensions specifies a slim type. New State Get Value Get Command Type Initial Value Attribute --------- ----------- ---- ------------- --------- PACK_MAX_COMPRESSED_SIZE_SGIX GetIntegerv Z+ 0 client New Implementation Dependent State None.