Name

    EXT_subtexture

Name Strings

    GL_EXT_subtexture

Version

    $Date: 1995/10/03 05:39:55 $ $Revision: 1.17 $

Number

    9

Dependencies

    EXT_abgr affects the definition of this extension
    EXT_texture is required
    EXT_texture3D affects the definition of this extension

Overview

    This extension allows a contiguous portion of an already-existing
    texture image to be redefined, without affecting the remaining portion
    of the image, or any of the other state that describe the texture.  No
    provision is made to query a subregion of a texture.

    Semantics for null image pointers are defined for TexImage1D,
    TexImage2D, and TexImage3DEXT.  Null image pointers can be used by
    applications to effectively support texture arrays whose dimensions
    are not a power of 2.

New Procedures and Functions

    void TexSubImage1DEXT(enum target,
                          int level,
                          int xoffset,
                          sizei width,
                          enum format,
                          enum type,
                          const void* pixels);

    void TexSubImage2DEXT(enum target,
                          int level,
                          int xoffset,
                          int yoffset,
                          sizei width,
                          sizei height,
                          enum format,
                          enum type,
                          const void* pixels);

    void TexSubImage3DEXT(enum target,
                          int level,
                          int xoffset,
                          int yoffset,
                          int zoffset,
                          sizei width,
                          sizei height,
                          sizei depth,
                          enum format,
                          enum type,
                          const void* pixels);

New Tokens

    None

Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    This extension makes no changes or additions to the texture operations
    defined in the GL Specification.  Its sole purpose is to extend the
    semantics of texture specification.

    TexSubImage1DEXT, TexSubImage2DEXT, and TexSubImage3DEXT redefine a
    contiguous subregion of an existing texture image.  Their <target>
    parameters must be TEXTURE_1D, TEXTURE_2D, and TEXTURE_3D_EXT
    respectively.  (The proxy targets defined by EXT_texture are not
    accepted by the subtexture commands.)  <level>, <width>, <height>,
    <depth>, <format>, <type>, and <pixels> correspond precisely to the
    corresponding arguments of TexImage1D, TexImage2D, and TexImage3DEXT.
    <xoffset>, <yoffset>, and <zoffset> specify texel offsets in the x, y,
    and z directions within the texture array being modified.  The new
    image replaces the portion of the texture array indexed with

        xoffset <= i < (xoffset + width),
        yoffset <= j < (yoffset + height),
        zoffset <= k < (zoffset + depth),

    where i, j, and k are indexes as described in Figure 3.10 of the GL
    Specification.  It is an error for this region to include any texels
    outside the range of the texture array as it was originally specified.  
    Specifically, the error INVALID_VALUE results if any of the following
    conditions are met:

        xoffset < -TEXTURE_BORDER
        (xoffset + width) > (TEXTURE_WIDTH - TEXTURE_BORDER)
        yoffset < -TEXTURE_BORDER
        (yoffset + height) > (TEXTURE_HEIGHT - TEXTURE_BORDER)
        zoffset < -TEXTURE_BORDER
        (zoffset + depth) > (TEXTURE_DEPTH_EXT - TEXTURE_BORDER)

    and TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_DEPTH_EXT, and TEXTURE_BORDER
    are the state values of the texture array that is being modified.  Note
    that TEXTURE_WIDTH, TEXTURE_HEIGHT, and TEXTURE_DEPTH_EXT include twice
    the border width.

    It is not an error to specify a subtexture with zero width, height, or
    depth.  Such a specification has no effect, however.

    Counting from zero, each Nth pixel is assigned internal integer
    coordinates [i,j,k], where

        i = xoffset + (N mod width),                    1D, 2D, and 3D textures

        j = yoffset + ((N div width) mod height),       2D and 3D textures only

        k = zoffset + ((N div (width * height)) mod depth),  3D textures only

    and the div operator performs integer division with truncation.

    Null images
    -----------

    It is sometimes useful to define the parameters of a texture image
    without actually initializing the contents of that image.  In
    particular, this capability is expected to be used in conjunction with
    the TexSubImage commands that are defined in this extension.  If
    EXT_subtexture is implemented, and TexImage1D, TexImage2D, or
    TexImage3DEXT is called with <pixels> equal to the null pointer
    (a pointer to location zero in the C language), then the specified
    texture is created as it would otherwise be, but no pixels are
    processed, so the contents of the resulting texture image are undefined.
    It is permissible to use such an uninitialized texture image, the
    resulting color buffer contents being undefined only due to the random
    color values of the texture image.

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Framebuffer)

    None

Additions to Chapter 5 of the 1.0 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.0 Specification (State and State Requests)

    None.  No provision is made to query a subregion of a texture image.

Additions to the GLX Specification

    None

GLX Protocol

    Several new GL rendering commands are added. All of these commands have pixel
    data; thus they are sent to the server either as part of a glXRender request or 
    a glXRenderLarge request:

        TexSubImage1DEXT
            2           60+n+p          rendering command length
            2           4099
            1           BOOL            swap_bytes
            1           BOOL            lsb_first
            2                           unused
            4           CARD32          row_length
            4           CARD32          skip_rows
            4           CARD32          skip_pixels
            4           CARD32          alignment
            4           ENUM            target
            4           INT32           level
            4           INT32           xoffset
            4           INT32           yoffset
            4           INT32           width
            4           INT32           height
            4           ENUM            format
            4           ENUM            type
            4           CARD32          unused
            n           LISTofBYTE      image
            p                           unused, p=pad(n)

            If the command is encoded in a glXRenderLarge request, the command
            opcode and command length fields above are expanded to 4 bytes each:

            4           64+n+p          rendering command length
            4           4099            rendering command opcode

        If <width> < 0, <format> is invalid or <type> is invalid, then the command is 
        erroneous and n=0. The <yoffset> and <height> parameters in this request are 
        ignored.

        The structure of <pixels> is described in Appendix A of the GLX Protocol 
        Specification, "Pixel Data", using the parameters <swap_bytes>, <lsb_first>, 
        <row_length>, <skip_rows>, <skip_pixels>, <alignment>, <width>, <format>, and 
        <type> as given in the request and height = 1.


        TexSubImage2DEXT
            2           60+n+p          rendering command length
            2           4100            rendering command opcode
            1           BOOL            swap_bytes
            1           BOOL            lsb_first
            2                           unused
            4           CARD32          row_length
            4           CARD32          skip_rows
            4           CARD32          skip_pixels
            4           CARD32          alignment
            4           ENUM            target
            4           INT32           level
            4           INT32           xoffset
            4           INT32           yoffset
            4           INT32           width
            4           INT32           height
            4           ENUM            format
            4           ENUM            type
            4           CARD32          unused
            n           LISTofBYTE      image
            p                           unused, p=pad(n)

            If the command is encoded in a glXRenderLarge request, the command
            opcode and command length fields above are expanded to 4 bytes each:

            4           64+n+p          rendering command length
            4           4100            rendering command opcode

        If <width> < 0, <height> < 0, <format> is invalid or <type> is invalid, then 
        the command is erroneous and n=0.

        The structure of <pixels> is described in Appendix A of the GLX Protocol 
        Specification, "Pixel Data", using the parameters <swap_bytes>, <lsb_first>, 
        <row_length>, <skip_rows>, <skip_pixels>, <alignment>, <width>, <height>, 
        <format>, and <type> as given in the request.


        TexSubImage3DEXT
            2           88+n+p          rendering command length
            2           4115            rendering command opcode
            1           BOOL            swap_bytes
            1           BOOL            lsb_first
            2                           unused
            4           CARD32          row_length
            4           CARD32          image_height
            4           CARD32          image_depth
            4           CARD32          skip_rows
            4           CARD32          skip_images
            4           CARD32          skip_volumes
            4           CARD32          skip_pixels
            4           CARD32          alignment
            4           ENUM            target
            4           INT32           level
            4           INT32           xoffset
            4           INT32           yoffset
            4           INT32           zoffset
            4           INT32           woffset
            4           INT32           width
            4           INT32           height
            4           INT32           depth
            4           INT32           size4d
            4           ENUM            format
            4           ENUM            type
            4           CARD32          unused
            n           LISTofBYTE      image
            p                           unused, p=pad(n)

            If the command is encoded in a glXRenderLarge request, the command
            opcode and command length fields above are expanded to 4 bytes each:

            4           92+n+p          rendering command length
            4           4115            rendering command opcode

        If <width> < 0, <height> < 0, <depth> < 0, <format> is invalid or <type> is 
        invalid, then the command is erroneous and n=0. The <woffset>, <size4d>,
        <image_depth>, and <skip_volumes> parameters in this request are ignored.

        <pixels> is arranged as a sequence of adjacent rectangles. Each rectangle is a
        2-dimensional image, whose structure is determined by the image height and the
        parameters <swap_bytes>, <lsb_first>, <row_length>, <skip_rows>, <skip_pixels>,
        <alignment>, <width>, <format>, and <type> given in the request. If <image_height>
        is not positive then the number of rows (i.e., the image height) is <height>;
        otherwise the number of rows is <image_height>.

        <skip_images> allows a sub-volume of the 3-dimensional image to be selected.
        If <skip_images> is positive, then the pointer is advanced by <skip_images>
        times the number of elements in one 2-dimensional image. Then <depth>
        2-dimensional images are read, each having a subimage extracted in the
        manner described in Appendix A of the GLX Protocol Specification.

Dependencies on EXT_abgr

    If EXT_abgr is supported, the <format> parameters of TexSubImage1DEXT,
    TexSubImage2DEXT, and TexSubImage3DEXT accept ABGR_EXT.  Otherwise they
    do not.

Dependencies on EXT_texture

    EXT_texture is required.  This extension builds on the notion of
    internal image format, which is defined by EXT_texture.

Dependencies on EXT_texture3D

    If EXT_texture3D is not supported, then TexSubImage3DEXT is not defined
    by this extension.  In this case, none of the description of
    3-dimensional texture mapping in this extension document is valid.  The
    descriptions of TexSubImage1DEXT and TexSubImage2DEXT remain valid,
    however.

Errors

    INVALID_ENUM is generated by TexSubImage1DEXT if its <target> parameter
    is not TEXTURE_1D.

    INVALID_ENUM is generated by TexSubImage2DEXT if its <target> parameter
    is not TEXTURE_2D.

    INVALID_ENUM is generated by TexSubImage3DEXT if its <target> parameter
    is not TEXTURE_3D_EXT.

    INVALID_OPERATION is generated by TexSubImage1DEXT if the specified
    texture array has not been defined by a previous TexImage1D operation.

    INVALID_OPERATION is generated by TexSubImage2DEXT if the specified
    texture array has not been defined by a previous TexImage2D operation.

    INVALID_OPERATION is generated by TexSubImage3DEXT if the specified
    texture array has not been defined by a previous TexImage3DEXT
    operation.

    INVALID_VALUE is generated if <level> is less than zero

    INVALID_VALUE is generated if <width>, <height>, or <depth> is negative.

    INVALID_VALUE is generated if <xoffset>, <yoffset>, or <zoffset> is
    less than -TEXTURE_BORDER.

    INVALID_VALUE is generated if
        (xoffset + width) > (TEXTURE_WIDTH - TEXTURE_BORDER), or if
        (yoffset + height) > (TEXTURE_HEIGHT - TEXTURE_BORDER), or if
        (zoffset + depth) > (TEXTURE_DEPTH_EXT - TEXTURE_BORDER).

    INVALID_ENUM is generated if <format> is not COLOR_INDEX, RED, GREEN,
    BLUE, ALPHA, RGB, RGBA, LUMINANCE, or LUMINANCE_ALPHA (or ABGR_EXT if
    EXT_abgr is supported).

    INVALID_ENUM is generated if <type> is not UNSIGNED_BYTE, BYTE,
    UNSIGNED_SHORT, SHORT, UNSIGNED_INT, INT, or FLOAT.

    INVALID_OPERATION is generated if TexSubImage1DEXT, TexSubImage2DEXT,
    or TexSubImage3DEXT is called between execution of Begin and the
    corresponding execution of End.

New State

    None

New Implementation Dependent State

    None
