Name

    EXT_unpack_subimage

Name Strings

    GL_EXT_unpack_subimage

Contact

    Peter Pipkorn, NVIDIA Corporation (ppipkorn 'at' nvidia.com)

Contributors

    Daniel Kartch, NVIDIA Corporation (dkartch 'at' nvidia.com)
    Nicolai de Haan, NVIDIA Corporation (nicolaid 'at' nvidia.com)
    Daniel Koch, NVIDIA Corporation (dkoch 'at' nvidia.com)

Status

    Complete.

Version

    Last Modifed Date:  Feb 8, 2013
    Author Revision:    2

Number

    OpenGL ES Extension #90

Dependencies

    The extension is written against the OpenGL ES 2.0 specification.
    The extension references the OpenGL 2.0 specification.

Overview

    This OpenGL ES 2.0 extension adds support for GL_UNPACK_ROW_LENGTH,
    GL_UNPACK_SKIP_ROWS and GL_UNPACK_SKIP_PIXELS as valid enums to
    PixelStore.  The functionality is the same as in OpenGL. These are
    useful for updating textures with a sub-rectangle of pixel data
    coming from a larger image in host memory.

IP Status

    None

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameters of PixelStorei, GetIntegerv, and
    GetFloatv:

        GL_UNPACK_ROW_LENGTH_EXT            0x0CF2
        GL_UNPACK_SKIP_ROWS_EXT             0x0CF3
        GL_UNPACK_SKIP_PIXELS_EXT           0x0CF4

Additions to the OpenGL ES 2.0 Specification

    Modifications to Table 3.1 (PixelStore parameters)

        Add the following entries:

        Parameter Name          Type      Initial Value  Valid Range
        ==============          ====      =============  ===========
        UNPACK_ROW_LENGTH_EXT   integer   0              [0,Infinity)
        UNPACK_SKIP_ROWS_EXT    integer   0              [0,Infinity)
        UNPACK_SKIP_PIXELS_EXT  integer   0              [0,Infinity)

    Modifications to 3.6.2 Transfer of Pixel Rectangles, in the Unpacking
    section:

        Change

          "The number of groups in a row is width;"

        to

          "If the value of UNPACK_ROW_LENGTH_EXT is not positive, then the
          number of groups in a row is <width>; otherwise the number of
          groups is UNPACK_ROW_LENGTH_EXT."

        After the sentence

          "If the number of bits per element is not 1, 2, 4 or 8 times
          the number of bits in a GL ubyte, then k = nl for all values
          of a."

        insert:

          "There is a mechanism for selecting a sub-rectangle of groups
          from a larger containing rectangle. This mechanism relies on
          three integer parameters: UNPACK_ROW_LENGTH_EXT, UNPACK_SKIP_ROWS_EXT,
          and UNPACK_SKIP_PIXELS_EXT. Before obtaining the first group from
          memory, the pointer supplied to TexImage2D is effectively
          advanced by (UNPACK_SKIP_PIXELS_EXT)n + (UNPACK_SKIP_ROWS_EXT)k
          elements. Then <width> groups are obtained from contiguous
          elements in memory (without advancing the pointer), after
          which the pointer is advanced by k elements. <height> sets of
          <width> groups of values are obtained this way. See figure
          3.6."

        Before Table 3.5 Packed pixel formats, insert

           Figure 3.8 from the OpenGL 2.0 specification (a visual
           description of UNPACK_ROW_LENGTH_EXT, UNPACK_SKIP_ROWS_EXT, and
           UNPACK_SKIP_PIXELS_EXT)

Errors

    None

New State

    Modifications to Table 6.12 Pixels in section 6.2 State Tables:

        Get Value              Type  Get Cmnd     Initial  Description                     Sec.
                                                  Value
        ====================   ====  ===========  =======  =============================== =====
        UNPACK_ROW_LENGTH_EXT  Z+    GetIntegerv  0        Value of UNPACK_ROW_LENGTH_EXT  3.6.1
        UNPACK_SKIP_ROWS_EXT   Z+    GetIntegerv  0        Value of UNPACK_SKIP_ROWS_EXT   3.6.1
        UNPACK_SKIP_PIXELS_EXT Z+    GetIntegerv  0        Value of UNPACK_SKIP_PIXELS_EXT 3.6.1

Issues

    1. Can't this be done with repeated calls to
       TexSubImage2D/TexSubImage3D?

        Yes, it is possible to unpack pixels from a sub-rectangle in
        host memory by by calling these functions for one line at a
        time, but this could add unnecessary burden on the CPU system.
        Specifying GL_UNPACK_ROW_LENGTH_EXT makes it possible to unpack
        sub-rectangles of pixels with lower overhead.

    2. Should the corresponding PACK enums be added?

        No, it should be done in a separate extension. There is no
        dependency between the PACK enums and the UNPACK enums.

    3. Are these UNPACK_SKIP_* tokens strictly necessary?

        No. The same functionality can be achieved by advancing the
        pixel pointer to host memory appropriately before issuing an
        unpacking function call. They are included here for both
        completeness and for convenience.

    4. Should the new tokens be suffixed?
 
        Yes. This extension was originally drafted with unsuffixed tokens
        since they provide the same functionality as in core Desktop GL.
        However, the policy of the ES working group is that suffixes 
        must be used in extensions even for functionality that is core
        in Desktop GL.

Revision History

    Rev.   Date       Author       Changes
    ----   --------   ---------    ------------------------------------
     1     03/25/11   ppipkorn     First revision.
     2     02/08/13   dgkoch       add suffixes to tokens
                                   remove unnecessary column from table 6.12 edits
