blob: 8943459eea77a1d8ea2d1051b7e5858d8779f67a [file] [log] [blame]
Name
OML_resample
Name Strings
GL_OML_resample
Contact
Jon Leech, Silicon Graphics (ljp 'at' sgi.com)
Status
Complete. Approved by the Khronos SIG on July 19, 2001.
Version
Last Modified Date: 07/23/2001
Author Revision: $Header: //depot/main/doc/registry/extensions/OML/resample.spec#10 $
Number
241
Dependencies
OML_subsample is required.
This extension is written against the OpenGL 1.2.1 Specification,
Overview
This extension enhances the resampling capabilities of the
OML_subsample extension. It is loosely based on the SGIX_resample
extension.
When converting data from subsampled to uniform sampling, upsampling
may be performed by one of three methods: component replication,
zero fill, or adjacent neighbor averaging.
When converting data from uniform sampling to subsampled form,
downsampling may be performed only by component decimation (point
sampling) or averaging.
Upsampling and downsampling filters other than those defined by this
extension may be performed by appropriate use of convolution and
other pixel transfer operations. The zero fill unpacking mode is
included to assist applications wanting to define their own filters.
Issues
* Should RESAMPLE_xxx enums be renamed to PIXEL_RESAMPLE_xxx?
IP Status
No known issues.
New Procedures and Functions
None.
New Tokens
Accepted by the <pname> parameter of PixelStoref, PixelStorei,
GetBooleanv, GetIntegerv, GetFloatv and GetDoublev:
PACK_RESAMPLE_OML 0x8984
UNPACK_RESAMPLE_OML 0x8985
Accepted by the <param> parameter of PixelStoref and PixelStorei
when the <pname> parameter is UNPACK_RESAMPLE_OML:
RESAMPLE_REPLICATE_OML 0x8986
RESAMPLE_ZERO_FILL_OML 0x8987
RESAMPLE_AVERAGE_OML 0x8988
Accepted by the <param> parameter of PixelStoref and PixelStorei
when the <pname> parameter is PACK_RESAMPLE_OML:
RESAMPLE_DECIMATE_OML 0x8989
RESAMPLE_AVERAGE_OML 0x8988
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)
- (3.6.1, p. 75 "Pixel Storage Modes")
Add to table 3.1 (p. 76):
Parameter Name Type Initial Value Valid Range
-------------- ---- ------------- -----------
UNPACK_RESAMPLE_OML integer RESAMPLE_REPLICATE_OML RESAMPLE_REPLICATE_OML
RESAMPLE_ZERO_FILL_OML
RESAMPLE_AVERAGE_OML
PACK_RESAMPLE_OML integer RESAMPLE_DECIMATE_OML RESAMPLE_DECIMATE_OML
RESAMPLE_AVERAGE_OML
- (3.6.4, p. 88 "Rasterization of Pixel Rectangles")
- Modify the new subsection "Conversion to Uniform Sampling"
(introduced by OML_subsample) to read:
Conversion to Uniform Sampling
This step is applied only to subsampled data. If <format> is
FORMAT_SUBSAMPLE_24_24_OML, then the number of components per pixel
is increased from two to three. If <format> is
FORMAT_SUBSAMPLE_244_244_OML. then the number of components per
pixel is increased from three to four. The upsampling method used is
determined by the value of the PixelStore parameter
UNPACK_RESAMPLE_OML.
After conversion to uniform sampling (see figure 3.9). pixels are
thereafter treated as though they were RGB (three component) or RGBA
(four component) format.
In the remainder of this section, the j'th component of the i'th
pixel in a row is denoted by S_i,j (for source pixels in client
memory) and D_i,j (for destination pixels in the color buffer).
Replication
If the value of UNPACK_RESAMPLE_OML is RESAMPLE_REPLICATE_OML (see
figure 3.9), destination component values are defined as:
For even pixels ((i mod 2) == 0):
D_i,0 = S_i,0
D_i,1 = S_i,1
D_i,2 = S_i+1,0
D_i,3 = S_i,2
For odd pixels ((i mod 2) == 1):
D_i,0 = S_i-1,0
D_i,1 = S_i,1
D_i,2 = S_i,0
D_i,3 = S_i,2
- (figure 3.9, introduced by OML_subsample, is unchanged)
Zero Fill
If the value of UNPACK_RESAMPLE_OML is RESAMPLE_ZERO_FILL_OML (see
figure 3.10), destination component values are defined as:
For even pixels ((i mod 2) == 0):
D_i,0 = S_i,0
D_i,1 = S_i,1
D_i,2 = S_i+1,0
D_i,3 = S_i,2
For odd pixels ((i mod 2) == 1):
D_i,0 = 0
D_i,1 = S_i,1
D_i,2 = 0
D_i,3 = S_i,2
- Add new figure 3.10, following the new figure 3.9 defined in the
OML_subsample extension:
FORMAT_SUBSAMPLE_24_24_OML:
<Cb0,Y0> <Cr0,Y1> <Cb2,Y2> <Cr2, Y3>
| | | | | | | |
| | ____/ | | | ____/ |
| | / | | | / |
| | | 0.0 | 0.0 | | | 0.0 | 0.0
| | | | | | | | | | | |
V V V V V V V V V V V V
<Cb0,Y0,Cr0> <Cb0,Y1,Cr0> <Cb2,Y2,Cr2> <Cb2,Y3,Cr2>
< R0,G0,B1 > < R0,G1,B1 > < R2,G2,B3 > < R2,G3,B3 >
FORMAT_SUBSAMPLE_244_244_OML:
<Cb0,Y0,A0> <Cr0,Y1,A1> <Cb2,Y2,A2> <Cr2,Y3,A3>
| | \ | | \ | | \ | | \
| | _\_____/ | \ | | _\_____/ | \
| | / \ | \ | | / \ | \
| | | \ 0.0 | 0.0 \ | | | \ 0.0 | 0.0 \
| | | | | | | | | | | | | | | |
V V V V V V V V V V V V V V V V
<Cb0,Y0,Cr0,A0> <Cb0,Y1,Cr0,A1> <Cb2,Y2,Cr2,A2> <Cb2,Y3,Cr2,A3>
< R0,G0,B1,A0 > < R0,G1,B1,A1 > < R2,G2,B3,A2 > < R2,G3,B3,A3 >
Figure 3.10: Upsampling with zero fill of subsampled data from host
memory to form RGB or RGBA pixels.
Averaging
If the value of UNPACK_RESAMPLE_OML is RESAMPLE_AVERAGE_OML (see
figure 3.11), destination component values are defined as:
For even pixels:
D_i,0 = S_i,0
D_i,1 = S_i,1
D_i,2 = S_i+1,0
D_i,3 = S_i,2
(No special case for D_i,2 can arise when i is the last pixel,
because of the restriction to even image widths).
For odd pixels:
D_i,0 = S_i,0 i == <width>-1 (last pixel)
= 1/2 S_i-1,0 + 1/2 S_i+1,0 otherwise
D_i,1 = S_i,1
D_i,2 = S_i,0 i == <width>-1 (last pixel)
= 1/2 S_i,0 + 1/2 S_i+2,0 otherwise
D_i,3 = S_i,2
- Add new figure 3.11, following the new figure 3.10:
FORMAT_SUBSAMPLE_24_24_OML:
<Cb0,Y0> <Cr0,Y1> <Cb2,Y2> <Cr2, Y3>
| | | | | | | |
| | ____/ \__|__ ____|___|_______/ \__|__ _
| | / | \/ | | / | \/
|\_|__|_____ __|__|___ /|\__|__|_____ __|__|__
| | | \/ | | | | | \/ | |
V V V V V V V V V V V V
<Cb0,Y0,Cr0> <Cb0,Y1,Cr0> <Cb2,Y2,Cr2> <Cb2,Y3,Cr2>
< R0,G0,B1 > < R0,G1,B1 > < R2,G2,B3 > < R2,G3,B3 >
FORMAT_SUBSAMPLE_244_244_OML:
<Cb0,Y0,A0> <Cr0,Y1,A1> <Cb2,Y2,A2> <Cr2,Y3,A3>
| | \ | | \ | | \ | | \
| | _\_____/ \__|__ \______|___|____\______/ \__|__ \___
| | / \ | \/ \ | | / \ | \/ \
|\_|__|___\____ __|__|___\___/|\__|__|___\_____ __|__|___\_
| | | | \/ | | | | | | | \/ | | |
V V V V V V V V V V V V V V V V
<Cb0,Y0,Cr0,A0> <Cb0,Y1,Cr0,A1> <Cb2,Y2,Cr2,A2> <Cb2,Y3,Cr2,A3>
< R0,G0,B1,A0 > < R0,G1,B1,A1 > < R2,G2,B3,A2 > < R2,G3,B3,A3 >
Figure 3.11: Upsampling with averaging of subsampled data from host
memory to form RGB or RGBA pixels.
Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment
Operations and the Frame Buffer)
- Modify the new section "Conversion to Subsampled Form" (introduced
by OML_subsample) to read:
Conversion to Subsampled Form
This step is applied only if <format> is FORMAT_SUBSAMPLE_24_24_OML
or FORMAT_SUBSAMPLE_244_244_OML. A filter operation specified by the
value of PACK_RESAMPLE_OML is applied prior to the subsampling step.
In the remainder of this section, the j'th component of the i'th
pixel in a row is denoted by S_i,j (for source pixels in the color
buffer) and D_i,j (for destination pixels in client memory).
If <format> is FORMAT_SUBSAMPLE_24_24_OML, then the resulting pixels
have 2 components (see figure 4.3); if <format> is
FORMAT_SUBSAMPLE_244_244_OML, then the resulting pixels have 3
components (see figure 4.4).
Decimation
If the value of PACK_RESAMPLE_OML is RESAMPLE_DECIMATE_OML, then
destination component values are defined as:
For even pixels ((i mod 2) == 0):
D_i,0 = S_i,0
D_i,1 = S_i,1
D_i,2 = S_i,3 (only for FORMAT_SUBSAMPLE_244_244_OML)
For odd pixels ((i mod 2) == 1):
D_i,0 = S_i-1,2
D_i,1 = S_i,1
D_i,2 = S_i,3 (only for FORMAT_SUBSAMPLE_244_244_OML)
- Add new figure 4.3 (renumber following figures):
FORMAT_SUBSAMPLE_24_24_OML:
<R0,G0,B0,A0> <R1,G1,B1,A1> <R2,G2,B2,A2> <R3,G3,B3,A3>
| | | | | | | | | | | | | | | |
| | \ * * | * * | | \ * * | * *
| | | | | | | |
V V V V V V V V
<Cb0,Y0><Cr0, Y1> <Cb2,Y2><Cr2, Y3>
<--- pixel pair ----> <--- pixel pair ---->
FORMAT_SUBSAMPLE_244_244_OML:
<R0,G0,B0,A0> <R1,G1,B1,A1> <R2,G2,B2,A2> <R3,G3,B3,A3>
| | | | | | | | | | | | | | | |
| | \__|__ * | * | | | \__|__ * | * |
| | | \ | | | | | \ | |
| | / | | / | | / | | /
V V V V V V V V V V V V
<Cb0,Y0,A0> <Cr0,Y1,A1> <Cb2,Y2,A2> <Cr2,Y3,A3>
<--- pixel pair ----> <--- pixel pair ---->
Figure 4.3: Downsampling with decimation of RGB or RGBA pixels to
form subsampled data in host memory.
Averaging
If the value of PACK_RESAMPLE_OML is RESAMPLE_AVERAGE_OML, then
destination component values are defined as:
For even pixels:
D_i,0 = 3/4 S_i,0 + 1/4 S_i+1,0 i == 0 (first pixel)
= 1/4 S_i-1,0 + 3/4 S_i,0 i == <width>-1 (last pixel)
= 1/4 S_i-1,0 + otherwise
1/2 S_i,0 +
1/4 S_i+1,0
D_i,1 = S_i,1
D_i,2 = S_i,3
For odd pixels:
D_i,0 = 3/4 S_i-1,2 + 1/4 S_i,2 i == <width>-1 (last pixel)
= 1/4 S_i-1,2 + otherwise
1/2 S_i,2 +
1/4 S_i+1,2
D_i,1 = S_i,1
D_i,2 = S_i,3
XXX Note that the "last pixel" case is only needed for readbacks where
XXX <width> is not even, so may be removable.
- Add new figure 4.4 (renumber following figures):
FORMAT_SUBSAMPLE_24_24_OML:
<R0,G0,B0,A0> <R1,G1,B1,A1> <R2,G2,B2,A2> <R3,G3,B3,A3>
| _|_|_______/\_|__|______ | _|__|_______/\_|__|_______
|/ | | | | \|/ | \_______ | |
| | \______ _|_/ \______|__|_________ \ _|_/ \______
| | \/ | | | \|/ |
V V V V V V V V
<Cb0,Y0> <Cr0,Y1> <Cb2,Y2> <Cr2,Y3>
FORMAT_SUBSAMPLE_244_244_OML:
<R0,G0,B0,A0> <R1,G1,B1,A1> <R2,G2,B2,A2> <R3,G3,B3,A3>
| _|_|___|___/\_|__|___|__ | _|__|___|___/\_|__|___|___
|/ | | | | | | \|/ | \___|___ | | |
| | \__|___ _|_/ \__|___|__|______|__ \ _|_/ \__|___
| | | \/ | | | | | \|/ | |
V V V V V V V V V V V V
<Cb0,Y0, A0><Cr0,Y1, A1><Cb2,Y2, A2><Cr2,Y3, A3>
Figure 4.4: Downsampling with averaging of RGB or RGBA pixels to
form subsampled data in host memory.
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 the GLX 1.3 Specification
None.
Errors
See above.
New State
(table 6.17, p. 207)
Get Value Type Get Command Initial Value
--------- ---- ----------- -------------
UNPACK_RESAMPLE_OML Z3 GetIntegerv RESAMPLE_REPLICATE_OML
PACK_RESAMPLE_OML Z2 GetIntegerv RESAMPLE_DECIMATE_OML
(continued columns)
Get Value Description Sec Attribute
--------- ----------- --- ---------
UNPACK_RESAMPLE_OML Pixel upsampling mode 3.6 pixel-store
PACK_RESAMPLE_OML Pixel downsampling mode 4.3 pixel-store
New Implementation Dependent State
None.
Revision History
* Revision 10, 07/24/2001 - Finalized Status for OpenML 1.0.
* Revision 9, 07/16/2001 - Remove erroneous redefinition of
RESAMPLE_AVERAGE enumerant value.
* Revisions 7-8, 07/11/2001 - Assign enum values and extension number
for the registry.
* Revision 6 - Correct errors in the equations describing subsampling.
* Revision 5 - formatting changes for OpenML Specification
* Revision 4, 03/27/2001 - Rewrite to use the <format> parameter,
rather than a pixel storage mode, to specify subsampled data.
* Revision 3 - Removed support for YC component orders. Renamed CY and
CYA enumerants more sensibly. Added Discreet's RESAMPLE_AVERAGE
resampling mode. Changed text descriptions of sampling to equations.
Made enum values undefined until we've determined if this extension
is backwards compatible with SGIX_resample.
* Revision 2 - corrected 4224 upsampling and downsampling figures.
Moved discussion of errors for non-even image widths to the
OML_subsample specification.
* Revision 1 - derived from SGIX_resample.