Name

    EXT_copy_texture

Name Strings

    GL_EXT_copy_texture

Version

    $Date: 1995/06/17 03:33:42 $ $Revision: 1.21 $

Number

    10

Dependencies

    EXT_texture is required.
    EXT_texture3D affects the definition of this extension.
    SGIS_texture_filter4 affects the definition of this extension.
    EXT_subtexture affects the definition of this extension.

Overview

    This extension defines methods to load texture images directly from the
    framebuffer.  Methods are defined for both complete and partial
    replacement of a texture image.  Because it is not possible to define
    an entire 3D texture using a 2D framebuffer image, 3D textures are
    supported only for partial replacement.

New Procedures and Functions

    void CopyTexImage1DEXT(enum target,
                           int level,
                           enum internalformat,
                           int x,
                           int y,
                           sizei width,
                           int border);

    void CopyTexImage2DEXT(enum target,
                           int level,
                           enum internalformat,
                           int x,
                           int y,
                           sizei width,
                           sizei height,
                           int border);

    void CopyTexSubImage1DEXT(enum target,
                              int level,
                              int xoffset,
                              int x,
                              int y,
                              sizei width);

    void CopyTexSubImage2DEXT(enum target,
                              int level,
                              int xoffset,
                              int yoffset,
                              int x,
                              int y,
                              sizei width,
                              sizei height);

    void CopyTexSubImage3DEXT(enum target,
                              int level,
                              int xoffset,
                              int yoffset,
                              int zoffset,
                              int x,
                              int y,
                              sizei width,
                              sizei height);

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)

    CopyTexImage1DEXT and CopyTexImage2DEXT are related to TexImage1D and
    TexImage2D in exactly the way that CopyPixels is related to DrawPixels.
    Rather than accepting image data from memory, they copy image data from
    the color buffer specified by the current ReadBuffer mode.
    CopyTexImage2DEXT accepts image data from a width+2*border pixel wide by
    height+2*border pixel high color buffer region whose lower-left pixel
    has window coordinates <x>,<y>.  If any pixels within this region are
    outside the window that is associated with the GL context, the values
    obtained for those pixels are undefined.  These pixel values are
    processed exactly as if CopyPixels had been called, but the process
    stops just before final conversion.  Subsequent processing is exactly
    as though TexImage2D had be called, beginning with the clamping of the
    pixel group components to [0,1].  Pixel ordering is such that lower X
    screen coordinates correspond to lower i texture coordinates, and lower
    Y screen coordinates correspond to lower j texture coordinates (refer to
    Figure 3.10 - A texture image and the coordinates used to access it, GL
    Specification).  The semantics and accepted values of the <target>,
    <level>, and <border> parameters are exactly equivalent to their
    TexImage2D counterparts, except that <target> does not accept
    PROXY_TEXTURE_2D_EXT.  The semantics of <internalformat> are identical
    to those of the <components> parameter of TexImage2D, except that
    values 1, 2, 3, and 4 are not accepted by CopyTexImage2DEXT.

    CopyTexImage1DEXT accepts image data from a width+2*border pixel wide
    by 1 pixel high color buffer region whose left-most pixel has window
    coordinates <x>,<y>.  If any pixels within this region are outside the
    window that is associated with the GL context, the values obtained for
    those pixels are undefined.  The pixels are processed just as those of
    CopyTexImage2DEXT are, and they define a texture such that lower X
    window coordinates correspond to lower i texture coordinates, as per
    Figure 3.10 of the GL Specification.  The semantics and accepted values
    of the <level>, <border>, and <internalformat> parameters are exactly
    those of CopyTexImage2DEXT.  <target> accepts only TEXTURE_1D.
    
    If EXT_subtexture is supported, this extension also defines
    CopyTexSubImage1DEXT and CopyTexSubImage2DEXT.  These commands are
    related to TexSubImage1DEXT and TexSubImage2DEXT in exactly the way
    that CopyPixels is related to DrawPixels.  Rather than accepting image
    data from memory, they copy image data from the framebuffer.  The
    semantics and accepted values of the <target>, <level>, <xoffset>, and
    <yoffset> parameters are exactly equivalent to their TexSubImage1DEXT
    and TexSubImage2DEXT counterparts.  The semantics and accepted values
    of the <x>, <y>, <width>, and <height> parameters are exactly equivalent
    to their CopyTexImage1DEXT and CopyTexImage2DEXT counterparts.

    If EXT_subtexture and EXT_texture3D are both supported, this extension
    also defines CopyTexSubImage3DEXT.  Because framebuffer memory is two-
    dimensional, only a portion of a single s,t slice of a 3D texture is
    replaced by this command.  Thus CopyTexSubImage3DEXT is related to
    TexSubImage3DEXT in exactly the way that CopyPixels is related to
    DrawPixels, except that it is as though TexSubImage3DEXT parameter
    <depth> were 1.  Rather than accepting image data from memory,
    CopyTexSubImage3DEXT copies image data from the framebuffer.  The
    semantics and accepted values of the <target>, <level>, <xoffset>,
    <yoffset>, and <zoffset> parameters are exactly equivalent to their
    TexSubImage3DEXT counterparts.  The semantics and accepted values of
    the <x>, <y>, <width>, and <height> parameters are exactly equivalent
    to their CopyTexImage2DEXT counterparts.

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

Additions to the GLX Specification

    None

GLX Protocol

    Five new GL rendering commands are added. The following commands are sent to the
    server as part of a glXRender request:

        CopyTexImage1DEXT
            2           32              rendering command length
            2           4119            rendering command opcode
            4           ENUM            target
            4           INT32           level
            4           ENUM            internalformat
            4           INT32           x       
            4           INT32           y       
            4           INT32           width
            4           INT32           border

        CopyTexImage2DEXT
            2           36              rendering command length
            2           4120            rendering command opcode
            4           ENUM            target
            4           INT32           level
            4           ENUM            internalformat
            4           INT32           x       
            4           INT32           y       
            4           INT32           width
            4           INT32           height
            4           INT32           border

        CopyTexSubImage1DEXT
            2           28              rendering command length
            2           4121            rendering command opcode
            4           ENUM            target
            4           INT32           level
            4           INT32           xoffset
            4           INT32           x       
            4           INT32           y       
            4           INT32           width

        CopyTexSubImage2DEXT
            2           36              rendering command length
            2           4122            rendering command opcode
            4           ENUM            target
            4           INT32           level
            4           INT32           xoffset
            4           INT32           yoffset
            4           INT32           x       
            4           INT32           y       
            4           INT32           width
            4           INT32           height

        CopyTexSubImage3DEXT
            2           40              rendering command length
            2           4123            rendering command opcode
            4           ENUM            target
            4           INT32           level
            4           INT32           xoffset
            4           INT32           yoffset
            4           INT32           zoffset
            4           INT32           x       
            4           INT32           y       
            4           INT32           width
            4           INT32           height

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, CopyTexSubImage3DEXT is not defined
    by this extension.

Dependencies on SGIS_texture_filter4

    If SGIS_texture_filter4 is not supported, 2 is not accepted as a border
    value.

Dependencies on EXT_subtexture

    If EXT_subtexture is not supported, CopyTexSubImage1DEXT,
    CopyTexSubImage2DEXT, and CopyTexSubImage3DEXT are not defined by this
    extension.

Errors

    INVALID_ENUM is generated if CopyTexImage1DEXT or CopyTexSubImage1DEXT
    parameter <target> is not TEXTURE_1D.  (The commands defined by this
    extension do not accept PROXY targets.)

    INVALID_ENUM is generated if CopyTexImage2DEXT or CopyTexSubImage2DEXT
    parameter <target> is not TEXTURE_2D.

    INVALID_ENUM is generated if CopyTexSubImage3DEXT parameter <target>
    is not TEXTURE_3D_EXT.

    INVALID_VALUE is generated if CopyTexImage1DEXT or CopyTexImage2DEXT
    parameter <level> is less than zero, or greater than the maximum value
    supported by the implementation.

    INVALID_ENUM is generated if CopyTexImage1DEXT or CopyTexImage2DEXT
    parameter <internalformat> is not ALPHA, RGB, RGBA, LUMINANCE,
    LUMINANCE_ALPHA, or one of the token values defined by EXT_texture.

    INVALID_VALUE is generated when any of the <width> or <height>
    parameters of CopyTexImage1DEXT or CopyTexImage2DEXT is less than zero,
    or if it cannot be represented as 2**k + 2*border for some integer k.

    INVALID_VALUE is generated if CopyTexSubImage1DEXT, CopyTexSubImage2DEXT,
    or CopyTexSubImage3DEXT parameter <xoffset>, CopyTexSubImage2DEXT or
    CopyTexSubImage3DEXT parameter <yoffset>, or CopyTexSubImage3DEXT
    parameter <zoffset> is less than -TEXTURE_BORDER, where TEXTURE_BORDER
    is the border width of the texture array to be modified.

    INVALID_VALUE is generated if CopyTexSubImage1DEXT, CopyTexSubImage2DEXT,
    or CopyTexSubImage3DEXT (xoffset + width) > (TEXTURE_WIDTH -
    TEXTURE_BORDER), or if CopyTexSubImage2DEXT or CopyTexSubImage3DEXT
    (yoffset + height) > (TEXTURE_HEIGHT - TEXTURE_BORDER), or if
    CopyTexSubImage3DEXT zoffset >= (TEXTURE_DEPTH_EXT - TEXTURE_BORDER).
    Note that TEXTURE_WIDTH, TEXTURE_HEIGHT, and TEXTURE_DEPTH_EXT include
    twice the border width.

    TEXTURE_TOO_LARGE_EXT is generated by CopyTexImage1DEXT or
    CopyTexImage2DEXT if the specified image is too large, for any reason.
    (See EXT_texture for a discussion of how applications can query the
    maximum texture size.)

    INVALID_VALUE is generated if CopyTexImage1DEXT or CopyTexImage2DEXT
    parameter <border> is not 0, 1, or 2.

    INVALID_OPERATION is generated if CopyTexImage1DEXT, CopyTexImage2DEXT,
    CopyTexSubImage1DEXT, CopyTexSubImage2DEXT, or CopyTexSubImage3DEXT is
    called between execution of Begin and the corresponding execution of
    End.

New State

    None

New Implementation Dependent State

    None
