Name

    OML_interlace

Name Strings

    GL_OML_interlace

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/interlace.spec#5 $

Number

    239

Dependencies

    None.

Overview

    This extension provides a way to interlace rows of pixels when
    drawing, reading, or copying pixel rectangles or texture images. In
    this context, interlacing means skiping over rows of pixels or
    texels in the destination. This is useful for dealing with video
    data since a single frame of video is typically composed from two
    images or fields: one image specifying the data for even rows of the
    frame and the other image specifying the data for odd rows of the
    frame.

    The functionality provided by this extension is a combination
    of the older SGIX_interlace and INGR_interlace_read extensions,
    with  changes applying interlacing to texture image queries.

Issues

  * Should there be a single enumerant controlling both draw and read
    operations? For the moment, we continue using separate enums, for
    backwards compatibility with SGIX_interlace and INGR_interlace_read.

  * Can we use the same enum values as the older extensions? Possibly,
    depending on the resolution of issues of exactly which operations
    interlacing is applied to. For the moment we assume the same
    values cannot be used.

  * Are there any GLX protocol issues relating to the actual vs.
    specified size of the image being transferred? Probably not, since
    unlike the effects of convolution, the image being transferred over
    the wire is always the specified size; all that changes is where the
    pixels are positioned in the frame buffer.

  * Discreet requested that INTERLACE_READ_OML apply to GetTexImage. The
    extension does not support this because there's no easy way to
    support it with any generality: with only the binary
    INTERLACE_READ_OML setting available, the implementation could
    return only the even rows, but would have no way of indicating that
    only the odd rows should be returned. This is non-orthogonal
    probably more frustrating than useful; a generic solution would
    require creation of a GetTexSubImage call.

  * We may need to be more precise about exactly which operations
    interlacing is and is not applied to. Currently it must be inferred
    from other parts of the OpenGL Specification, and different
    implementations are likely to disagree on this. Some language has
    been added to section 6.1.4 to deal explicitly with GetTexImage, but
    may be needed elsewhere as well.

IP Status

    No known issues.

New Procedures and Functions

    None.

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled,
    and by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv,
    and GetDoublev:

	INTERLACE_OML				0x8980
	INTERLACE_READ_OML			0x8981

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.4, p. 99) Insert the following subsection between "Pixel
    Transfer Operations" and "Final Conversion"

    Interlacing

    This step applies only if INTERLACE_OML is enabled. All of the
    groups which belong to a row m in the source image are treated as if
    they belonged to the row 2 * m. If the source image has a height of
    h rows, this effectively expands the height of the image to 2 * h -
    1 rows. After interlacing, only every other row of the image is
    defined. If the interlaced pixel rectangle is rasterized to the
    framebuffer, then only these rows are converted to fragments. If the
    interlaced pixel rectangle is a texture image, then only these rows
    are written to texure memory.

    In cases where errors can result from the specification of invalid
    image dimensions, it is the resulting dimensions that are tested,
    not the dimensions of the source image. (A specific example is
    TexImage2D, which specifies constraints for image dimensions. Even
    if TexImage2D is called with a null pixel pointer, the dimensions of
    the resulting texture image are those that would result from the
    effective expansion of the specified image due to interlacing.)

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

  - (4.3.2, p. 157) Modify the 5th paragraph of "Obtaining Pixels from
    the Framebuffer" to read

    If INTERLACE_READ_OML is disabled, then ReadPixels obtains values
    from the selected buffer for each pixel with lower left hand corner
    at (x+i, y+j) for 0 <= i < width and 0 <= j < height; this pixel is
    said to be the ith pixel in the jth row.

    If INTERLACE_READ_OML is enabled, then ReadPixels obtains values
    from the selected buffer for each pixel with lower left hand corner
    at (x+i, y+(j*2)) for 0 <= i < width and 0 <= j < height; this pixel
    is said to be the ith pixel in the jth row.

    If any of these pixels lies outside of the window...


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)

  - (6.1.4, p. 184) Insert in the second paragraph, following "... and
    from the first image to the last for three-dimensional textures."

    The value of INTERLACE_READ_OML has no effect on the operation of
    GetTexImage.

Additions to the GLX 1.3 Specification

    None.

Errors

    See above.

New State

    Get Value		Type Get Command Initial Value Attribute
    ---------		---- ----------- ------------- ---------
    INTERLACE_OML	B    IsEnabled	 False	       pixel/enable
    INTERLACE_READ_OML	B    IsEnabled	 False	       pixel/enable

New Implementation Dependent State

    None.

Revision History

  * Revision 5, 07/24/2001 - Finalized Status for OpenML 1.0.
  * Revision 4, 07/11/2001 - Assign enum values and extension number
    for the registry.
  * Revision 3 - formatting changes for OpenML Specification
  * Revision 2 - expanded description of why GetTexImage doesn't support
    interlaced readbacks.
  * Revision 1 - derived from SGIX_interlace and INGR_interlace_read.
