Name

    OES_EGL_image_external

Name Strings

    GL_OES_EGL_image_external

Contributors

    Acorn Pooley
    David Garcia
    Bruce Merry
    Aske Simon Christensen
    Mark Callow
    Tom Olson
    Jon Leech
    Maurice Ribble

Contacts

    Acorn Pooley, NVIDIA Corporation (apooley 'at' nvidia.com)

Notice

    Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL ES Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Ratified by Khronos Promoters, 10 December 2010
    Approved by the OpenGL ES Working Group, 15 September 2010

Version

    April 6, 2018 (version 25)

Number

    OpenGL ES Extension #87

Dependencies

    Requires OpenGL ES 1.1 or OpenGL ES 2.0.

    Requires EGL 1.2

    Requires either the EGL_KHR_image_base or the EGL_KHR_image extension

    This extension is written based on the wording of the OpenGL ES 2.0
    specification, the OpenGL ES Shading Language version 1.0, and the
    EGL_KHR_image_base extension.  On an OpenGL ES 2.0 implementation, ignore
    sections which are added only to the OpenGL ES 1.1 specification.

    This extension is also written based on the wording of the OpenGL ES 1.1
    specification.  On an OpenGL ES 1.X implementation, ignore sections which
    are added only to the OpenGL ES 2.0 or OpenGL ES Shading Language
    specification.  Also ignore all mention of MAX_VERTEX_TEXTURE_IMAGE_UNITS,
    and MAX_COMBINED_TEXTURE_IMAGE_UNITS.

    This extension borrows concepts and function names from the
    GL_OES_EGL_image extension.  This extension is compatible with, but does
    not require, the GL_OES_EGL_image extension.

Overview

    This extension provides a mechanism for creating EGLImage texture targets
    from EGLImages.  This extension defines a new texture target,
    TEXTURE_EXTERNAL_OES.  This texture target can only be specified using an
    EGLImage.  There is no support for most of the functions that manipulate
    other texture targets (e.g. you cannot use gl*Tex*Image*() functions with
    TEXTURE_EXTERNAL_OES).  Also, TEXTURE_EXTERNAL_OES targets never have more
    than a single LOD level.  Because of these restrictions, it is possible to
    bind EGLImages which have internal formats not otherwise supported by
    OpenGL ES.  For example some implementations may allow EGLImages with
    planar or interleaved YUV data to be GLES texture target siblings.  It is
    up to the implementation exactly what formats are accepted.

Glossary

    Please see the EGL_OES_image_base specification for a list of terms
    used by this specification.

New Types

    /*
     * GLeglImageOES is an opaque handle to an EGLImage
     * Note: GLeglImageOES is also defined in GL_OES_EGL_image
     */
    typedef void* GLeglImageOES;

    /* (OpenGL ES 2.x only)
     * New sampler type allowed by the OpenGL ES Shading Language when
     *      #extension GL_OES_EGL_image_external
     * is used.
     */
    samplerExternalOES

New Procedures and Functions

    /* Note: EGLImageTargetTexture2DOES is also defined in GL_OES_EGL_image */
    void EGLImageTargetTexture2DOES(enum target, eglImageOES image)

New Tokens

     Accepted as a target in the <target> parameter of BindTexture and
     EGLImageTargetTexture2DOES:

        TEXTURE_EXTERNAL_OES                                0x8D65

    (OpenGL ES 2.x only) Returned in the <type> parameter of GetActiveUniform:
        SAMPLER_EXTERNAL_OES                                0x8D66

    Accepted as the <pname> parameter of GetBooleanv, GetIntegerv,
    GetFloatv, and GetFixedv:
        TEXTURE_BINDING_EXTERNAL_OES                        0x8D67

    Accepted as <value> in GetTexParameter*() queries:
        REQUIRED_TEXTURE_IMAGE_UNITS_OES                    0x8D68


Additions to Chapter 3 of the OpenGL 1.1 or OpenGL 2.0 Specification

    - For OpenGL ES 2.0 add a new section: "3.7.14 External Textures," which
    follows section "3.7.13 Texture Objects."  For OpenGL ES 1.1 add a new
    section after section "3.7.11 Texture Objects."

        "3.7.14 External Textures

        External textures cannot be used with TexImage2D, TexSubImage2D,
        CompressedTexImage2D, CompressedTexSubImage2D, CopyTexImage2D, or
        CopyTexSubImage2D, and an INVALID_ENUM error will be generated if this
        is attempted.  Their default min filter is LINEAR.  It is an
        INVALID_ENUM error to set the min filter value to anything other than
        LINEAR or NEAREST.  The default s and t wrap modes are CLAMP_TO_EDGE
        and it is an INVALID_ENUM error to set the wrap mode to any other
        value.  (For OpenGL ES 1.x only: The texture parameter GENERATE_MIPMAP
        is always FALSE, and setting it to any other value generates an
        INVALID_ENUM error.  (For OpenGL ES 2.x only: Calling GenerateMipmaps
        with <target> set to TEXTURE_EXTERNAL_OES results in an INVALID_ENUM.)

        The command

            void EGLImageTargetTexture2DOES(enum target, eglImageOES image);

        with <target> set to TEXTURE_EXTERNAL_OES defines the currently bound
        external texture object to be a target sibling of <image>.  The width,
        height, format, type, internalformat, border, and image data are all
        determined based on the specified eglImageOES <image>.  Any sibling
        previously associated with this external texture object is deleted.

        A EGLImageTargetTexture2DOES() call with <target> set to
        TEXTURE_EXTERNAL_OES will not modify the pixel data values in the
        EGLImage.

        <image> must be the handle of a valid EGLImage resource, cast into the
        type eglImageOES.

        Assuming no errors are generated in EGLImageTargetTexture2DOES, the
        newly specified texture object will be an EGLImage target of the
        specified eglImageOES.

        If the GL is unable to specify a texture object using the supplied
        eglImageOES <image> (if, for example, <image> refers to a multisampled
        eglImageOES), the error INVALID_OPERATION is generated.

        If <target> is not TEXTURE_EXTERNAL_OES, the error INVALID_ENUM is
        generated.  (Note: if GL_OES_EGL_image is supported then <target> may
        also be TEXTURE_2D).

        Sampling an external texture which is not associated with any EGLImage
        sibling will return a sample value of (0,0,0,1).

        Each TEXTURE_EXTERNAL_OES texture object may require up to 3 texture
        image units for each texture unit to which it is bound.  The number of
        texture image units required by a bound texture object can be queried
        using GetTexParameteriv() with <target> set to the texture target in
        question, <value> set to REQUIRED_TEXTURE_IMAGE_UNITS_OES, and
        ActiveTexture set to the texture unit to which the texture object is
        bound.  When <target> is set to TEXTURE_EXTERNAL_OES this value will
        be between 1 and 3 (inclusive).  For other valid texture targets this
        value will always be 1.  Note that, when a TEXTURE_EXTERNAL_OES
        texture object is bound, the number of texture image units required by
        a single texture unit may be 1, 2, or 3, while for other texture
        objects each texture unit requires exactly 1 texture image unit.

        (For OpenGL ES 1.x only) DrawArrays and DrawElements will fail and
        generate an INVALID_OPERATION error if the number of texture image
        units required is greater than the number available.  The number of
        required texture image units is equal to the sum of the requirements
        for each enabled texture unit.  For each texture unit the requirement
        is the value returned by GetTexParameteriv() when <value> is set to
        REQUIRED_TEXTURE_IMAGE_UNITS_OES, <target> is set to the target which
        is enabled, and ActiveTexture has been set to the texture unit in
        question.

        (For OpenGL ES 2.x only) DrawArrays and DrawElements will fail and
        generate an INVALID_OPERATION error if the number of texture image
        units required is greater than the number available.  The number of
        required texture image units for each stage (fragment or vertex) is
        equal to the sum of the requirements for each sampler referenced by
        the stage.  A sampler is considered referenced if its location
        (returned by GetUniformLocation) is not -1.  For each referenced
        sampler the requirement is the value returned by GetTexParameteriv()
        when <value> is set to REQUIRED_TEXTURE_IMAGE_UNITS_OES, <target> is
        set to the target corresponding to the sampler type, and ActiveTexture
        has been set to the texture unit corresponding to the value of the
        sampler uniform.  The condition can be detected by calling Validate.

        (For OpenGL ES 2.x only) A shader that uses external texture samplers
        may require some number of hidden uniform variables to implement the
        conversion from YUV to RGB, and this may reduce the amount of space
        available for uniforms defined by the shader program.  This may cause
        a shader program which was working to stop working when a different
        external texture is used (i.e. when Uniform1i or BindTexture is
        called).  If there are not enough uniforms available then calls to
        DrawArrays or DrawElements will fail and generate an INVALID_OPERATION
        error.  This condition can be detected by calling ValidateProgram.

        Sampling an external texture which has been modified since it was
        bound will return samples which may correspond to image values either
        before, during, or after the modification.  Binding (or re-binding if
        already bound) an external texture by calling BindTexture after all
        modifications are complete guarantees that sampling done in future
        draw calls will return values corresponding to the values in the
        buffer at or after the time that BindTexture is called.  (Note that
        calling BindTexture after calling commands that modify the EGLImage
        may not be sufficient to ensure that the modifications are complete;
        additional synchronization (for example eglWaitAPI, eglWaitNative,
        glFinish, vgFinish, or eglWaitSyncKHR, etc) may be required following
        the call initiating modifications, to ensure they have taken effect on
        the texture, before the call to BindTexture is made.)

        Sampling an external texture will return an RGBA vector in the same
        colorspace as the source image.  If the source image is stored in YUV
        (or some other basis) then the YUV values will be transformed to RGB
        values. (But these RGB values will be in the same colorspace as the
        original image.  Colorspace here includes the linear or non-linear
        encoding of the samples. For example, if the original image is in the
        sRGB color space then the RGB value returned by the sampler will also
        be sRGB, and if the original image is stored in ITU-R Rec. 601 YV12
        then the RGB value returned by the sampler will be an RGB value in the
        ITU-R Rec. 601 colorspace.) The parameters of the transformation
        from one basis (e.g.  YUV) to RGB (color conversion matrix, sampling
        offsets, etc) are taken from the EGLImage which is associated with the
        external texture.  The implementation may choose to do this
        transformation when the external texture is sampled, when the external
        texture is bound, or any other time so long as the effect is the same.
        It is undefined whether texture filtering occurs before or after the
        transformation to RGB.

        If the EGLImage associated with the external texture contains alpha
        values then the value of the alpha component returned is taken from
        the image; otherwise the alpha component is 1.0.

Changes to section "2.10.4 Shader Variables" of the OpenGL ES 2.0
specification (ignore for OpenGL ES 1.x)

    - In the subsection "Uniform Variables" paragraph 13, last sentence, add

        "SAMPLER_EXTERNAL_OES"
    to the list of types that can be returned.

Changes to section "2.10.5 Shader Execution" of the OpenGL ES 2.0
specification (ignore for OpenGL ES 1.x)

    - In the subsection "Validation", add to the bullet points in the second
      paragraph:

        "- the number of texture image units required is greater than
           the number available (see REQUIRED_TEXTURE_IMAGE_UNITS_OES,
           MAX_COMBINED_TEXTURE_IMAGE_UNITS, MAX_VERTEX_TEXTURE_IMAGE_UNITS,
           and MAX_TEXTURE_IMAGE_UNITS).

        - the number of uniforms required to implement the shader program is
           greater than the number available."

Changes to section "3.7.5 Texture Parameters" of the OpenGL ES 1.1 specification

    - Add to the end of the section a new paragraph:

            "When <target> is TEXTURE_EXTERNAL_OES only NEAREST and LINEAR are
        accepted as TEXTURE_MIN_FILTER, only CLAMP_TO_EDGE is accepted as
        TEXTURE_WRAP_S and TEXTURE_WRAP_T, and only FALSE is accepted as
        GENERATE_MIPMAP.  Attempting to set other values for
        TEXTURE_MIN_FILTER, TEXTURE_WRAP_S, TEXTURE_WRAP_T, or GENERATE_MIPMAP
        will result in an INVALID_ENUM error.

Changes to section "3.7.4 Texture Parameters" of the OpenGL ES 2.0 Specification

    - Add to the end of the section a new paragraph:

            "When <target> is TEXTURE_EXTERNAL_OES only NEAREST and LINEAR are
        accepted as TEXTURE_MIN_FILTER and only CLAMP_TO_EDGE is accepted as
        TEXTURE_WRAP_S and TEXTURE_WRAP_T.  Attempting to set other values for
        TEXTURE_MIN_FILTER, TEXTURE_WRAP_S, or TEXTURE_WRAP_T will result in
        an INVALID_ENUM error.

Changes to section "3.7.10 Texture State" of the OpenGL ES 1.1 Specification
and section "3.7.12 Texture State" of the OpenGL ES 2.0 Specification

    - Add an additional sentence at the end of the section:

            "In the initial state of a TEXTURE_EXTERNAL_OES texture object,
        the value assigned to TEXTURE_MIN_FILTER and TEXTURE_MAG_FILTER is
        LINEAR, and the s and t wrap modes are both set to
        CLAMP_TO_EDGE."

Changes to section "3.7.11 Mipmap Generation" of the OpenGL ES 2.0 Specification
(ignore for OpenGL ES 1.x)

    - Add two additional paragraphs to the end of the section:

            "When <target> is set to TEXTURE_EXTERNAL_OES, GenerateMipmap
        always fails and generates an INVALID_ENUM error."

Changes to section "3.7.11 Texture Objects" of the OpenGL ES 1.1 specification
(ignore for OpenGL ES 2.x)

    - Modify this section as follows: (changed lines marked with *, and added
      lines are marked with +)

*           "In addition to the default textures TEXTURE_2D and
*       TEXTURE_EXTERNAL_OES, named two-dimensional and external texture
        objects can be created and operated upon.  The name space for texture
        objects is the unsigned integers, with zero reserved by the GL.

            A texture object is created by binding an unused name to
*       TEXTURE_2D or TEXTURE_EXTERNAL_OES. The binding is effected by calling
               void BindTexture( enum target, uint texture );
*       with target set to the desired texture target and texture set to the
        unused name. The resulting texture object is a new state vector,
        comprising all the state values listed in section 3.7.10, set to the
+       same initial values. If the new texture object is bound to TEXTURE_2D
+       or TEXTURE_EXTERNAL_OES it is and remains a two-dimensional or
+       external texture respectively until it is deleted.

            BindTexture may also be used to bind an existing texture object to
*       TEXTURE_2D or TEXTURE_EXTERNAL_OES. If the bind is successful no
        change is made to the state of the bound texture object, and any
        previous binding to target is broken.

            While a texture object is bound, GL operations on the target to
        which it is bound affect the bound object, and queries of the target
        to which it is bound return state from the bound object. If texture
        mapping is enabled, the state of the bound texture object directs the
        texturing operation.

*       In the initial state, TEXTURE_2D and TEXTURE_EXTERNAL_OES have
*       two-dimensional and external texture state vectors respectively
*       associated with them.  In order that access to these initial textures
*       not be lost, they are treated as texture objects all of whose names
*       are 0. The initial two-dimensional and external texture are therefore
*       operated upon, queried, and applied as TEXTURE_2D or
*       TEXTURE_EXTERNAL_OES respectively while 0 is bound to the
*       corresponding targets.

            Texture objects are deleted by calling
               void DeleteTextures( sizei n, uint *textures );
        textures contains n names of texture objects to be deleted. After a
        texture object is deleted, it has no contents, and its name is again
        unused. If a texture that is currently bound to the target TEXTURE_2D
*       or TEXTURE_EXTERNAL_OES is deleted, it is as though BindTexture had
        been executed with the same target and texture zero. Unused names in
        textures are silently ignored, as is the value zero.

            The command
               void GenTextures( sizei n, uint *textures );
        returns n previously unused texture object names in textures. These
        names are marked as used, for the purposes of GenTextures only, but
        they acquire texture state only when they are first bound, just as if
        they were unused.

            The texture object name space, including the initial texture
        object, is shared among all texture units. A texture object may be
        bound to more than one texture unit simultaneously. After a texture
        object is bound, any GL operations on that target object affect any
        other texture units to which the same texture object is bound.

            Texture binding is affected by the setting of the state
        ACTIVE_TEXTURE.

            If a texture object is deleted, it is as if all texture units which
        are bound to that texture object are rebound to texture object zero.

Changes to section "3.7.13 Texture Objects" of the OpenGL ES 2.0 specification
(ignore for OpenGL ES 1.x)

    - Modify this section as follows: (changed lines marked with *, and added
      lines are marked with +)

*           "In addition to the default textures TEXTURE_2D, TEXTURE_CUBE_MAP,
*       and TEXTURE_EXTERNAL_OES, named two-dimensional, cube map, and
        external texture objects can be created and operated upon.  The name
        space for texture objects is the unsigned integers, with zero reserved
        by the GL.

            A texture object is created by binding an unused name to
*       TEXTURE_2D, TEXTURE_CUBE_MAP, or TEXTURE_EXTERNAL_OES. The binding is
        effected by calling
               void BindTexture( enum target, uint texture );
        with target set to the desired texture target and texture set to the
        unused name. The resulting texture object is a new state vector,
        comprising all the state values listed in section 3.7.12, set to the
        same initial values. If the new texture object is bound to TEXTURE_2D,
*       TEXTURE_CUBE_MAP, or TEXTURE_EXTERNAL_OES it is and remains a
*       two-dimensional, cube map, or external texture respectively until it
        is deleted.

            BindTexture may also be used to bind an existing texture object to
*       either TEXTURE_2D, TEXTURE_CUBE_MAP, or TEXTURE_EXTERNAL_OES. The error
        INVALID_OPERATION is generated if an attempt is made to bind a texture
*       object of different target than the specified target. If the bind is
        successful no change is made to the state of the bound texture object,
        and any previous binding to target is broken.

            While a texture object is bound, GL operations on the target to
        which it is bound affect the bound object, and queries of the target to
        which it is bound return state from the bound object. If texture
        mapping is enabled, the state of the bound texture object directs the
        texturing operation.

*           In the initial state, TEXTURE_2D, TEXTURE_CUBE_MAP, and
*       TEXTURE_EXTERNAL_OES have two-dimensional, cube map, and external
        texture state vectors respectively associated with them.  In order
        that access to these initial textures not be lost, they are treated as
        texture objects all of whose names are 0. The initial two-dimensional,
*       cube map, and external texture are therefore operated upon, queried,
*       and applied as TEXTURE_2D, TEXTURE_CUBE_MAP, or TEXTURE_EXTERNAL_OES
        respectively while 0 is bound to the corresponding targets.

            Texture objects are deleted by calling
               void DeleteTextures( sizei n, uint *textures );
        textures contains n names of texture objects to be deleted. After a
        texture object is deleted, it has no contents or dimensionality, and
        its name is again unused. If a texture that is currently bound to one
*       of the targets TEXTURE_2D, TEXTURE_CUBE_MAP, or TEXTURE_EXTERNAL_OES
        is deleted, it is as though BindTexture had been executed with the
        same target and texture zero.  Unused names in textures are silently
        ignored, as is the value zero.

            The command
               void GenTextures( sizei n, uint *textures );
        returns n previously unused texture object names in textures. These
        names are marked as used, for the purposes of GenTextures only, but
        they acquire texture state only when they are first bound, just as if
        they were unused.

            The texture object name space, including the initial texture
        object, is shared among all texture units. A texture object may be
        bound to more than one texture unit simultaneously. After a texture
        object is bound, any GL operations on that target object affect any
        other texture units to which the same texture object is bound.

            Texture binding is affected by the setting of the state
        ACTIVE_TEXTURE.

            If a texture object is deleted, it is as if all texture units which
        are bound to that texture object are rebound to texture object zero.

Changes to section "3.7.13 Texture Application" of the OpenGL ES 1.1
specification (ignore for OpenGL ES 2.x)

    - Replace the first sentence of the first paragraph with:

            "Texturing is enabled or disabled using the generic Enable and
        Disable commands, with the symbolic constant TEXTURE_2D or
        TEXTURE_EXTERNAL_OES to enable or disable texturing with the
        TEXTURE_2D or TEXTURE_EXTERNAL_OES texture target, respectively.  If
        TEXTURE_EXTERNAL_OES is enabled it takes precedence over TEXTURE_2D,
        TEXTURE_CUBE_MAP_OES, TEXTURE_RECTANGLE_ARB, and
        TEXTURE_RECTANGLE_NV."

Changes to section "3.8.2 Shader Execution" of the OpenGL ES 2.0
specification (ignore for OpenGL ES 1.x)

    - Add to the end of the last paragraph of the subsection "Texture Access"

        "The REQUIRED_TEXTURE_IMAGE_UNITS_OES parameter can change based on the
        number of external textures which are currently bound (see section
        3.7.14)."

Changes to section "6.1.3 Enumerated Queries" of the OpenGL ES 1.1 specification

    - Change:
        "...TEXTURE_2D..."
      to
        "...TEXTURE_2D or TEXTURE_EXTERNAL..."
      in the last paragraph.

Changes to section "6.1.3 Enumerated Queries" of the OpenGL ES 2.0 specification

    - Change:
        "...TEXTURE_2D or TEXTURE_CUBE_MAP..."
      to
        "...TEXTURE_2D, TEXTURE_CUBE_MAP, or TEXTURE_EXTERNAL..."
      in the second paragraph.


Changes to section "6.2 State Tables" of the OpenGL ES 1.1 specification

    - Add to "Table 6.13 Textures (state per texture unit and binding point)"

        +-------------------+-------+-------------+-------+------------------+
        | TEXTURE_BINDING_- | 8*xZ+ | GetIntegerv | 0     | Texture object   |
        |   EXTERNAL_OES    |       |             |       | bound to         |
        |                   |       |             |       | TEXTURE_-        |
        |                   |       |             |       |    EXTERNAL_OES  |
        +-------------------+-------+-------------+-------+------------------+
        | TEXTURE_-         | 2*xB  | IsEnabled   | False | True if external |
        |   EXTERNAL_OES    |       |             |       | texturing is     |
        |                   |       |             |       | enabled          |
        +-------------------+-------+-------------+---+----------------------+

    - Add to "Table 6.14 Textures (state per texture object)"

        +--------------------+-------+-----------------+---+----------------+
        | REQUIRED_TEXTURE_- | n*xZ3 | GetTexParameter | 1 | Number of      |
        |   IMAGE_UNITS_OES  |       |                 |   | texture image  |
        |                    |       |                 |   | units required |
        |                    |       |                 |   |    by texture  |
        +--------------------+-------+-----------------+---+----------------+

Changes to section "6.2 State Tables" of the OpenGL ES 2.0 specification

    - Add to "Table 6.7 Textures (state per texture unit and binding point)"

        +-------------------+-------+-------------+-------+------------------+
        | TEXTURE_BINDING_- | 8*xZ+ | GetIntegerv | 0     | Texture object   |
        |   EXTERNAL_OES    |       |             |       | bound to         |
        |                   |       |             |       | TEXTURE_-        |
        |                   |       |             |       |    EXTERNAL_OES  |
        +-------------------+-------+-------------+-------+------------------+

    - Add to "Table 6.8 Textures (state per texture object)"

        +--------------------+-------+-----------------+---+----------------+
        | REQUIRED_TEXTURE_- | n*xZ3 | GetTexParameter | 1 | Number of      |
        |   IMAGE_UNITS_OES  |       |                 |   | texture image  |
        |                    |       |                 |   | units required |
        |                    |       |                 |   |    by texture  |
        +--------------------+-------+-----------------+---+----------------+

Changes to section 3.7 of the OpenGL ES Shading Language specification

    - Add to the list of keywords:

        "samplerExternalOES"

Changes to section 4.1 of the OpenGL ES Shading Language specification

    - Add to the list of basic types:

        "samplerExternalOES   a handle for accessing an external texture"

Changes to section 4.5.3 of the OpenGL ES Shading Language specification

    - Add to the list of "vertex language has the following predeclared
    globally scoped default precision statements:"

        "precision lowp samplerExternalOES;"

    - Add to the list of "fragment language has the following predeclared
    globally scoped default precision statements:"

        "precision lowp samplerExternalOES;"

Changes to section 8.7 of the OpenGL ES Shading Language specification

    - Add to the table the following sampler functions:

        "vec4 texture2D(
                    samplerExternalOES sampler,
                    vec2 coord)
        vec4 texture2DProj(
                    samplerExternalOES sampler,
                    vec3 coord)
        vec4 texture2DProj(
                    samplerExternalOES sampler,
                    vec4 coord)"


Changes to section 9 of the OpenGL ES Shading Language specification

    - Add to token list:

        "SAMPLEREXTERNAL"

    - Add following "type_specifier_no_prec:"

        "SAMPLEREXTERNAL"

Changes to section "A.7 Counting of Varyings and Uniforms" of the OpenGL ES
Shading Language specification

    - Change the first sentence of the last paragraph to

        "Part of the storage may be reserved by an implementation for its own
        use e.g. for computation of transcendental functions or conversion of
        external textures."


Issues

    1.  What happens when GenerateMipmaps() is called with <target> set to
        TEXTURE_EXTERNAL_OES?

        Possible options:

        A) Fail (INVALID_ENUM)
        B) Generate the mipmaps and copy them into the TEXTURE_2D target.

        Option B could be useful and should not be difficult to implement.
        What happens when the texture is NPOT and GenerateMipmaps() is called?

        Ben Bowman and David Garcia have indicated they prefer A.  No other
        strong opinions yet.

        RESOLVED: A (fail)

    2.  Should the wrap mode of an external texture be allowed to be anything
        other than CLAMP_TO_EDGE?

        RESOLVED: no

    3.  What about portability problems introduced by allowing implementation-
        dependent failures?

        This is the same issue described in Issue 14 of the
        EGL_OES_image specification.  Like the resolution for that issue,
        this specification should include some minimum requirements, but
        leave the larger portability problem unresolved at the moment.

        RESOLVED: This and other (EGL_KHR_image_uses and EGL_KHR_il_image)
        extensions attempt to minimize this problem by allowing EGL to pick
        EGLImage attributes which will work in various situations.  However it
        is not possible to guarantee that every usecase will work on every
        platform.

    4.  Should EGLImageTargetTexture2DOES result in undefined pixel data,
        as with calls to eglCreateImageOES?

        See also issue 4 of GL_OES_EGL_image

        Comment from Aske:
        In the description for EGLImageTargetTexture2DOES, it says: "As a
        result of this operation all pixel data in <image> will become
        undefined." Why is this? I would imagine one would want to take an
        existing EGL image containing image data and bind it as an external
        texture, possibly multiple times, to use it for rendering. I have read
        through issue 4 of OES_EGL_image, and it seems the concern here is
        what happens when the image is (potentially) modified from OpenGL ES.
        Since external images cannot be modified from OpenGL ES, I would guess
        the same issues do not apply here.

        Comment from Acorn:
        Another potential issue is that the memory for the EGLImage may
        have to be reallocated in order to be compatible with GLES (e.g. GLES
        may have more strict alignment or other requirements).  However, the
        implementation can fail (or do a copy) if this is the case.  If the
        EGL_KHR_image_uses extension is used to specify that the EGLImage will
        be used as a GLES external texture then this should not be an issue
        because EGL will be able to allocate the memory correctly in the first
        place.

        RESOLVED: pixel data will not become undefined when
        EGLImageTargetTexture2DOES() is used with an external texture target.

    5.  What happens if the texture is bound while the associated EGLImage is
        being modified.

        Some implementations may need to color convert the data
        after it has been generated.  A solution to this is to state that the
        texels become undefined if the external texture is bound while the
        underlying texels are modified.  This way any color conversion can be
        done (e.g. to a second buffer) when the texture is bound.

        Options:
        A) require the texture be unbound while the EGLImage is being modified
        B) Require the texture to be bound (or re-bound if already bound)
            between modification and use (i.e. after modification and before
            used as a texture).
        C) No requirement.

        RESOLVED: B

    6.  How can current generation hardware support planar YUV EGLImage formats?

        GLES 2.0 hardware can perform color conversion by inserting
        extra instructions into the shader program.  However, planar textures
        require 2 or 3 surfaces to be read in order to sample a single texture.
        One solution is to increase the number of texture image units required
        by a texture object which is associated with such an EGLImage.

        RESOLVED: allow the implementation to set the number of texture
        image units required by each texture object.  Allow the app to query
        this with REQUIRED_TEXTURE_IMAGE_UNITS_OES.  Have drawing commands
        fail (INVALID_OPERATION) when the number of texture image units
        required by all enabled/referenced texture units exceeds the
        implementation limit (which can be queried with
        MAX_COMBINED_TEXTURE_IMAGE_UNITS, MAX_VERTEX_TEXTURE_IMAGE_UNITS, and
        MAX_TEXTURE_IMAGE_UNITS)

        See also issue 10.

    7.  Should there be new texture sampling functions for samplerExternalOES
        or is it OK to use the existing 2D sampler functions.

        RESOLVED: Use existing 2D sampler functions.

    8.  If an EGLImage associated with an external texture does not contain an
        alpha channel, should the alpha be 1 or undefined.

        From an app point of view, 1 probably makes more sense.
        However, if the texture is in a RGBA format and there is garbage in
        the A channel, it may be difficult for implementations to return 1.
        An implementation may have to recompile the shader to force the alpha
        channel to 1.

        RESOLVED: alpha is defined to be 1 in this case.

    9.  How should the color conversion be described.

        Options:

        A) State that the color values are transformed to a linear colorspace
        and represented as RGB values in that space.  This may be difficult
        for implementations since it may require nonlinear transformations
        (e.g. gamma decoding).  It is also problematic because usually many
        more bits are required to represent a value in a linear colorspace
        than in a gamma encoded colorspace.

        B) State that the color is transformed to RGB but in the same
        colorspace as the source image (i.e. no gamma encode or decode).

        RESOLVED: Option B.

    10. How does the implementation indicate which texture samplers and/or
        texture units are not available when one or more external textures are
        bound.

        See discussion on GLES email list around Feb 23 with
        subject "RE: [OpenGL-ES] IL/ES interaction: YUV texture extension
        proposal"

        Proposals:

        A) The MAX_COMBINED_TEXTURE_IMAGE_UNITS,
        MAX_VERTEX_TEXTURE_IMAGE_UNITS, and MAX_TEXTURE_IMAGE_UNITS parameters
        change to reflect the current state.

        B) New queries AVAILABLE_COMBINED_TEXTURE_IMAGE_UNITS,
        AVAILABLE_VERTEX_TEXTURE_IMAGE_UNITS, and
        AVAILABLE_TEXTURE_IMAGE_UNITS indicate current state, while
        MAX_COMBINED_TEXTURE_IMAGE_UNITS, MAX_VERTEX_TEXTURE_IMAGE_UNITS, and
        MAX_TEXTURE_IMAGE_UNITS remain constant and indicate the state when no
        external textures are bound.

        C) Query for number of required texture image units per texture
        object.  Draw calls fail with INVALID_OPERATION if the current
        requirements for texture image units exceeds the number available.

        RESOLVED: C

    11. What happens when glUniform1i() sets a sampler to a value that is
        larger than the number of available texture units?

        NOTE: This issue no longer affects this extension.  See issue 10 for
        different issue related to texture *image* units.

        This is really a GLES2 spec issue.  See
            khronos bug 3702
            https://cvs.khronos.org/bugzilla/show_bug.cgi?id=3702
            http://www.khronos.org/members/login/list_archives/arb-glsl/
                                                          0705/msg00010.html
            http://www.khronos.org/members/login/list_archives/opengl_es/
                                                          0902/msg00148.html

        RESOLVED: The issue is not resolved, but it no longer applies
        directly to this extension.  Further discussion should be in bug 3702.

    12. What happens at draw time when the current state requires more texture
        units than the implementation can support?

        RESOLVED:  The precedent, from (desktop) OpenGL, is to fail in
        glValidate, and to fail in any draw call with an INVALID_OPERATION
        error.  Behavior described in this extension will match that
        precedent.

    13. How can this be conformance tested?

        In the native code, add a function which takes as a
        parameter an array of pixels.  The function returns an EGLImage which
        contains the pixels in some unspecified format.  A test can call this
        function, call glEGLImageTargetTexture2DOES() to associate it with an
        external texture, and render using this texture, and read back the
        framebuffer to confirm that the result is the expected result.

        Note1: since the format is unknown and unknowable, possibly only the
        high bit of each component (RGB) should be tested.  It may be
        sufficient to pass a single pixel (or single bit for each of R, G, an
        B) and then create the EGLImage with every pixel in the image set to
        that same value.

        Note2: It might be a good idea to have an extra parameter, int index,
        which allows the function to be implemented several different ways.
        The test could be run several times, with index set to 0, 1, 2, ...
        until the function returns EGL_NO_IMAGE.  This way the function could
        generate EGLImages with various formats.  For example when index is 0
        it could call OMX IL to generate a YUV planar EGLImage, when index is
        1 it could call OMX AL to generate a YUV interleaved EGLImage, and
        when index is 2 it could call into VG to generate an RGB EGLImage.
        The meaning of each index would be up to the implementation.  A simple
        implementation might return an EGLImage when index=0 and return
        EGL_NO_IMAGE otherwise.

        Additional suggestion from Jon Leech:
        The suggested conformance test in issue 13 is intentionally so vague
        on precision (1 bit/component) that the conversion language seems even
        less meaningful. The RGB bits that come out of texture sampling would
        need have almost no relationship to what went in. ISTM the supplier of
        the EGLImage knows the precision of it, and that information could be
        provided to the test to put on tighter constraints.

        RESOLVED: As described above.

    14. Can the number of uniforms required by a shader change when switching
        from one external texture to another, and therefore cause the shader
        to fail?  For example, imagine a program does this:
            glLinkProgram(prog); // successful link
            sampler = glGetUniformLocation(prog, "myExtSampler");
            glUniform1i(sampler, 1);
            glActiveTexture(GL_TEXTURE1);
            glBindTexture(GL_TEXTURE_EXTERNAL, myTex1_rgb);
            glDrawArrays(); // draw successfully

            glBindTexture(GL_TEXTURE_EXTERNAL, myTex2_yuv);
            glDrawArrays();  // Can this fail???
        Is it acceptable for an implementation to fail the second
        glDrawArrays() call because myTex2_yuv is a yuv image and requires
        more uniforms to implement a color conversion matrix than myTex1_rgb
        which is an rgb image and does not require any conversion matrix?

        Note that this situation will only occur on implementation which will
        recompile the shader based on the color conversion required.

        Options:

        A) No, the implementation is not allowed to fail.  When the program is
        linked the implementation must verify that there are enough uniforms
        to implement the program for any flavor of external texture.  If the
        implementation does not provide enough uniforms for the program to
        work with any external texture that the implementation supports, then
        the implementation must fail at link time.

        B) Yes, the implementation may fail in glDrawArrays or glDrawElements
        if the number of uniforms required by the program exceeds those
        available.  This means that a call to glUniform1i() or glBindTexture()
        can cause a shader program that used to work to stop working.  (Note
        that this is possible anyway since the new external texture may use
        more texture image units than the old external texture (independent of
        the number of uniforms). But that can be detected by the application
        by querying REQUIRED_TEXTURE_IMAGE_UNITS_OES)

        RESOLVED: choice B.

    15. How should filtering of non-RGB formats be specified.

        Options:

        A) filtering occurs before transformation to RGB.
        B) filtering occurs after transformation to RGB.
        C) undefined (up to the implementation)

        RESOLVED: C

Dependencies on EGL_OES_image_base and EGL 1.1

    If either EGL 1.1 or the EGL_OES_image extension is not supported, all
    discussion of EGLImages should be ignored, and any calls to
    EGLImageTargetTexture2DOES should generate the error INVALID_OPERATION.

Dependencies on GL_OES_EGL_image

    If GL_OES_EGL_image is supported then change the text in both extensions
    to allow either TEXTURE_2D or TEXTURE_EXTERNAL_OES to be passed as the
    <target> parameter to EGLImageTargetTexture2DOES().  When <target> is
    TEXTURE_2D, behavior of EGLImageTargetTexture2DOES() is as described in
    the GL_OES_EGL_image spec.  When <target> is TEXTURE_EXTERNAL_OES,
    behavior of EGLImageTargetTexture2DOES() is as described in this spec.

Revision History

    #25 - (April 6, 2018) H1Gdev
        Fix typo.
    #24 - (April 23, 2015) Jon Leech)
        - Fix typo EGLImageTargetTexImage2DOES -> EGLImageTargetTexture2DOES
          (Bug 8114). Improve description of supported queries for new
          tokens (Bug 8118).
    #23 - (July 19, 2012) Acorn Pooley
        - fix extension name from OES_EGL_image_external to
           GL_OES_EGL_image_external
    #22 - (Dec 17, 2010) Acorn Pooley
        status to ratified.
    #21 - (Sept. 29, 2010) Maurice Ribble
        Update token numbers and updated status to approved.
    #20 - (April 2, 2009) Acorn Pooley
        Rename GL_OES_egl_image_external to GL_OES_EGL_image_external to be
        consistant with GL_OES_EGL_image.
    #19 - (March 31, 2009) Acorn Pooley
        Minor fixes
    #18 - (March 30, 2009) Acorn Pooley
        Fix inconsistancy
    #17 - (March 25, 2009) Acorn Pooley
        Resolved issue 4 (and some others)
    #16 - (March 16, 2009) Acorn Pooley
        Augment issue 13
    #15 - (March 13, 2009) Acorn Pooley
        fix dependancy section
        resolve issue 14 and fix text
    #14 - (March 9, 2009) Acorn Pooley
        Fix colorspace comments.  Issue 9 is resolved.
    #13 - (March 6, 2009) Acorn Pooley
        Mark issue 6, 10, and 11 resolved.
        Add issue 15.
    #12 - (March 4, 2009) Acorn Pooley
        Fix wording of uniform stuff.
    #11 - (March 4, 2009) Acorn Pooley
        Add issues 13, 14.
        Add comments about extra uniforms required by external texture
        samplers.
        Allow external textures to work with default object 0.
        Correct colorspace language.
    #10 - (March 3, 2009) Acorn Pooley
        Remove stale reference to MAX_TEXTURE_IMAGE_UNITS.  Add fix to OpenGL
        ES 2.0 section 2.10.5 (from bruce).  Add contributors. Clarify
        "texture unit" vs "texture image unit".  Fix typos.
    #9 - (February 26, 2009) Acorn Pooley
        Clarify sync further.  Add issue 12.  Change "too many texture units"
        behavior.
    #8 - (February 26, 2009) Acorn Pooley
        Clarify sync requirements (i.e. that EGLImage does not do sync)
    #7 - (February 25, 2009) Acorn Pooley
        Relax binding requirement - see issue 5
    #6 - (February 25, 2009) Acorn Pooley
        Add TEXTURE_BINDING_EXTERNAL_OES.  Add texture state notes.  Modify
        colorspace conversion to be a linear function.
    #5 - (February 24, 2009) Acorn Pooley
        Disable GenerateMipmaps.  Add issues 10 & 11.
    #4 - (February 23, 2009) Acorn Pooley
        Modify the "Texture Parameters" section in ES 1 and 2 specs
    #3 - (February 20, 2009) Acorn Pooley
        Clarify the reduction in number of texture units.
    #2 - (February 20, 2009) Acorn Pooley
        Fix some errors.  replace textureExternal* sampler functions with
        existing sampler2D* functions.  Add issue 7,8,9.  Fix spelling.
    #1 - (February 9, 2009) Original draft
