Name

    CHROMIUM_copy_texture

Name Strings

    GL_CHROMIUM_copy_texture

Version

    Last Modifed Date: July 16, 2014

Dependencies

    OpenGL ES 2.0 is required.

    CHROMIUM_flipy affects the definition of this extension.
    EXT_texture_format_BGRA8888 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, while respecting the pixel-storage modifiers
    UNPACK_FLIP_Y_CHROMIUM, GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM and
    GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM.

    If GL_UNPACK_PREMULTIPLY_ALPHA_CHROMIUM and
    GL_UNPACK_UNPREMULTIPLY_ALPHA_CHROMIUM are enabled.  Then no alpha
    processing occurs.  This is the equivalent of having neither flag set.

    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 glCopyTextureCHROMIUM (GLenum target, GLenum source_id,
                                GLenum dest_id, GLint level,
                                GLint internal_format, GLenum dest_type)

    Copies the contents of texture referred to by <source_id> to texture
    <dest_id>.

    Texture level 0 is copied from the source image to level <level> of the
    destination texture. The level parameter must be 0 at present.

    The internal format of the destination texture is converted to that
    specified by <internal_format>. Must be one of the following symbolic
    constants: GL_RGB, GL_RGBA
    The internal format of <source_id> texture must be one of the following
    symbolic constants: GL_ALPHA, GL_LUMINANCE, GL_LUMINANCE_ALPHA, GL_RGB,
    GL_RGBA, GL_BGRA_EXT
    When <source_id> texture doens't contain a superset of the component
    required by <internal_format>, fill the components by following rules.

                   source format          color components
             =================================================
                   GL_ALPHA               (0, 0, 0, A)
                   GL_LUMINANCE           (L, L, L, 1)
                   GL_LUMINANCE_ALPHA     (L, L, L, A)
                   GL_RGB                 (R, G, B, 1)
                   GL_RGBA                (R, G, B, A)
                   GL_BGRA_EXT            (R, G, B, A)

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

    <target> uses the same parameters as TexImage2D.

    INVALID_OPERATION is generated if <internal_format> is not one of the valid formats
    described above.

    INVALID_OPERATION is generated if the internal format of <source_id> is not one of
    formats from the table above.

    INVALID_VALUE is generated if <target> is not GL_TEXTURE_2D.

    INVALID_VALUE is generated if <source_id> or <dest_id> are not valid texture
    objects.

    INVALID_VALUE is generated if textures corresponding to <dest_id> have not
    been bound as GL_TEXTURE_2D object.

    INVALID_VALUE is generated if textures corresponding to <source_id> have not
    been bound as GL_TEXTURE_2D, GL_TEXTURE_RECTANGLE_ARB or
    GL_TEXTURE_EXTERNAL_OES objects.

    INVALID_VALUE is generated if <level> is not a valid level of the
    destination texture, or if level 0 of the source texture is not defined.

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 GL_TEXTURE_RECTANGLE_ARB as valid source_id target.
