Name

    CHROMIUM_copy_texture

Name Strings

    GL_CHROMIUM_copy_texture

Version

    Last Modifed Date: March 24, 2017

Dependencies

    OpenGL ES 2.0 or OpenGL ES 3.0 is required.

    EXT_texture_format_BGRA8888 affects the definition of this extension.
    ARB_texture_rg affects the definition of this extension.
    CHROMIUM_ycbcr_422_image affects the definition of this extension.

Overview

    This extension expands on the functionality provided by the
    glCopyTexImage2D command.  A new function is exported,
    glCopyTextureCHROMIUM, that performs the same copy operation as
    glCopyTexImage2D.

    The extension also supports copying BGRA textures and copying
    EXTERNAL_OES texture to BGRA texture, which is not explicitly
    granted by EXT_texture_format_BGRA8888.

New Procedures and Functions

    void CopyTextureCHROMIUM(uint sourceId,
                             int sourceLevel,
                             enum destTarget,
                             uint destId,
                             int destLevel,
                             int internalFormat,
                             enum destType,
                             boolean unpackFlipY,
                             boolean unpackPremultiplyAlpha,
                             boolean unpackUnmultiplyAlpha)


    void CopySubTextureCHROMIUM(uint sourceId,
                                int sourceLevel,
                                enum destTarget,
                                uint destId,
                                int destLevel,
                                int xoffset,
                                int yoffset,
                                int x,
                                int y,
                                sizei width,
                                sizei height,
                                boolean unpackFlipY,
                                boolean unpackPremultiplyAlpha,
                                boolean unpackUnmultiplyAlpha)

Additions to the OpenGL ES 2.0 Specification

    The command

        CopyTextureCHROMIUM

    Copies the contents of <sourceLevel> level of <sourceId> texture to
    <destLevel> level and <destTarget> target of <destId> texture.

    <destTarget> must be TEXTURE_2D,
    TEXTURE_CUBE_MAP_POSITIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_X,
    TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_NEGATIVE_Y,
    TEXTURE_CUBE_MAP_POSITIVE_Z, TEXTURE_CUBE_MAP_NEGATIVE_Z,
    TEXTURE_RECTANGLE_ARB.

    The internal format of the destination texture is converted to that
    specified by <internalFormat>.

    When source texture doens't contain a superset of the component
    required by <internalFormat>, fill the components by following rules.

       source format           color components
       ----------------------------------------
       ALPHA                   (0, 0, 0, A)
       RED                     (R, 0, 0, 1)
       LUMINANCE               (L, L, L, 1)
       LUMINANCE_ALPHA         (L, L, L, A)
       RGB                     (R, G, B, 1)
       RGB8                    (R, G, B, 1)
       RGBA                    (R, G, B, A)
       RGBA8                   (R, G, B, A)
       BGRA_EXT                (R, G, B, A)
       BGRA8_EXT               (R, G, B, A)
       RGB_YCBCR_420V_CHROMIUM (R, G, B, 1)
       RGB_YCBCR_422_CHROMIUM  (R, G, B, 1)

    The format type of the destination texture is converted to that specified
    by <destType>.

    If <flipY> is true, vertically flip texture image data.

    If <unpackPremultiplyAlpha> and <unpackUnmultiplyAlpha> are true,
    no alpha processing occurs.  This is the equivalent of having neither flag
    set.

    When <sourceId> refers to a stream texture, the texture matrix will be
    applied as part of the copy operation.

    INVALID_OPERATION is generated if <internalFormat> is not one of the
    formats in Table 1.0.

    INVALID_OPERATION is generated if the internal format of <sourceId> is not
    one of formats in Table 1.1.

    INVALID_VALUE is generated if <sourceId> or <destId> are not valid texture
    objects.

    INVALID_ENUM is generated if <destTarget> is not one of the valid targets
    described above.

    INVALID_OPERATION is generated if the bound target of destination texture
    does not match <target>.

    INVALID_VALUE is generated if textures corresponding to <destId> have not
    been bound as TEXTURE_2D, TEXTURE_CUBE_MAP, or
    TEXTURE_RECTANGLE_ARB objects.

    INVALID_VALUE is generated if textures corresponding to <sourceId> have not
    been bound as TEXTURE_2D, TEXTURE_RECTANGLE_ARB or
    TEXTURE_EXTERNAL_OES objects.

    INVALID_VALUE is generated if <sourceLevel> is not 0 for ES 2.0, or if
    <sourceLevel> or <destLevel> is less than 0 for ES 3.0.

    INVALID_VALUE is generated if <sourceLevel> of the source texture is not
    defined.

    The command

        CopySubTextureCHROMIUM

    Copies the sub contents of texture referred to by <sourceId> to <destId>
    texture without redefining <destId> texture.

    See CopyTextureCHROMIUM for the interpretation of the <destTarget>,
    <sourceLevel>, <destLevel>, <flipY>, <premultiplyAlpha>, and
    <unmultiplyAlpha> arguments.

    <xoffset> and <yoffset> specify a texel offset in the x and y direction
    respectively within the destination texture.

    <x> and <y> specify specify a texel offset in the x and y direction
    respectively within the source texture.

    <width> specifies the width of the texture subimage.

    <height> specifies the width of the texture subimage.

    INVALID_VALUE is generated if either <sourceId> texture or <destId>
    texture is not defined.

    INVALID_OPERATION is generated if the internal format of <sourceId> or
    <destId> is not one of formats in Table 1.1.

    INVALID_OPERATION is generated if the destination texture array has not
    been defined.

    INVALID_VALUE is generated if <destId> texture is not bound as
    TEXTURE_2D or TEXTURE_RECTANGLE_ARB.

    INVALID_VALUE is generated if level 0 of the source texture or
    the destination texture is not defined.

    INVALID_VALUE is generated if (<xoffset> + <width>) > destWidth,
    or (<yoffset> + <height>) > destHeight.

    Table 1.0 Valid internal formats for CopyTextureCHROMIUM:

        <internalFormat>
        ---------------
        RGB
        RGBA
        RGB8
        RGBA8
        BGRA_EXT
        BGRA8_EXT
        SRGB_EXT
        SRGB_ALPHA_EXT
        R8
        R8UI
        RG8
        RG8UI
        SRGB8
        RGB565
        RGB8UI
        SRGB8_ALPHA8
        RGB5_A1
        RGBA4
        RGBA8UI
        RGB9_E5
        R16F
        R32F
        RG16F
        RG32F
        RGB16F
        RGB32F
        RGBA16F
        RGBA32F
        R11F_G11F_B10F

    Table 1.1 Valid source texture internal formats for CopyTextureCHROMIUM and
    source and destination formats for CopySubTextureCHROMIUM:

        internal format
        ---------------
        RED
        ALPHA
        LUMINANCE
        LUMINANCE_ALPHA
        RGB
        RGBA
        RGB8
        RGBA8
        BGRA_EXT
        BGRA8_EXT
        RGB_YCBCR_420V_CHROMIUM
        RGB_YCBCR_422_CHROMIUM

Dependencies on ARB_texture_rg

    If ARB_texture_rg is not supported:
     * delete any reference to the R8 format.

Dependencies on CHROMIUM_ycbcr_422_image

    If CHROMIUM_ycbcr_422_image is not supported:
     * delete any reference to the RGB_YCBCR_422_CHROMIUM format.

Errors

    None.

New Tokens

    None.

New State

    None.

Revision History

    8/1/2011    Documented the extension
    7/4/2013    Add a new parameter dest_type to glCopyTextureCHROMIUM()
    16/7/2014   Add TEXTURE_RECTANGLE_ARB as valid source_id target
    19/6/2015   Add arguments unpack_flip_y, unpack_premultiply_alpha, and
                unpack_unmultiply_alpha to both commands.
    4/1/2016    Removed the argument target.
    4/1/2016    Added TEXTURE_RECTANGLE_ARB as valid dest_id target.
    19/12/2016  Supported more ES 3.0 formats.
    18/1/2017   Supported source_level and dest_level.
    19/1/2017   Added TEXTURE_CUBE_MAP as valid dest_id target.
    24/3/2017   Clean up naming and move formats into tables.
