Name

    OES_EGL_image_external_essl3

Name Strings

    GL_OES_EGL_image_external_essl3

Contributors

    Jan-Harald Fredriksen, ARM (jan-harald.fredriksen 'at' arm.com)
    James Helferty, NVIDIA (jhelferty 'at' nvidia.com)
    Mark Callow, ArtSpark Holdings Inc (callow.mark 'a' artspark.co.jp)

    Contributors to GL_OES_EGL_image_external.

Contacts

    Jan-Harald Fredriksen, ARM (jan-harald.fredriksen 'at' arm.com)

Notice

    Copyright (c) 2014-2015 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

    Complete.
    Approved by the OpenGL ES Working Group.
    Ratified by the Khronos Board of Promoters on January 23, 2015.

Version

    January 29, 2016 (version 10)

Number

    OpenGL ES Extension #220

Dependencies

    Requires OpenGL ES 3.0 and ESSL 3.0.
    Requires EGL 1.2
    Requires either the EGL_KHR_image_base or the EGL_KHR_image extension.
    Requires OES_EGL_image_external.

    This extension is written based on the wording of the OpenGL ES 3.0.3
    specification, the OpenGL ES Shading Language version 3.0 rev4, and the
    OES_EGL_image_external extension.

    This extension interacts with OpenGL ES 3.1.

    This extension interacts with GL_EXT_gpu_shader5 and GL_OES_gpu_shader5.

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

Overview

    OES_EGL_image_external provides a mechanism for creating EGLImage texture
    targets from EGLImages, but only specified language interactions for the
    OpenGL ES Shading Language version 1.0. This extension adds support for
    versions 3.x of the OpenGL ES Shading Language.

Glossary

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

New Types

     * New sampler type allowed by the OpenGL ES Shading Language when
     *      #extension GL_OES_EGL_image_external_essl3
     * is used.
     */
    samplerExternalOES

New Procedures and Functions

    None.

New Tokens

    None.

Changes to section 3.8.2 ("Sampler Objects") of the OpenGL ES 3.0.3 specification

    - Add to the description BindSampler:

        "If state is present in a sampler object bound to a texture unit that
         would have been rejected by a call to TexParameter* for the texture
         bound to that unit, the behavior of the implementation is as if the
         texture were incomplete. For example, if TEXTURE_WRAP_S or
         TEXTURE_WRAP_T is set to anything but CLAMP_TO_EDGE on the sampler
         object bound to a texture unit and the texture bound to that unit is
         an external texture, the texture will be considered incomplete.

         Sampler object state which does not affect sampling for the type of
         texture bound to a texture unit, such as TEXTURE_WRAP_R for an external
         texture, does not affect completeness."

Changes to section 3.7.14 ("External Textures") of the OES_EGL_image_external
specification

        "It is an INVALID_OPERATION error to set the TEXTURE_BASE_LEVEL
         to a value other than zero."

[[Only if OpenGL ES 3.1 is supported]]
Changes to section 8.22 ("Texture Image Loads and Stores") of the
OpenGL ES 3.1 specification

    On p. 196 in the errors section for BindImageTexture, replace the
    last error with the following:

        "An INVALID_OPERATION error is generated if <texture> is neither the
         name of an immutable texture object, nor the name of an external
         texture object.

    Add to table 8.26 "Mapping of image load, store..."

        Texture target               face/
                                   i  j  k  layer
        -------------------------- -- -- -- -----
        TEXTURE_EXTERNAL_OES       x  y  -  -

Changes to section 3.7 ("Keywords") of the OpenGL ES Shading Language
specification

    - Add to the list of keywords:

        "samplerExternalOES"

Changes to section 4.1 ("Basic Types") of the OpenGL ES Shading Language
specification

    - Add to the list of Floating Point Sampler Types (opaque):

        "samplerExternalOES   a handle for accessing an external 2D texture"

    - Add a paragraph at the end of the section:

        "The samplerExternalOES type is optional and must be enabled by

         #extension GL_OES_EGL_image_external_essl3 : enable"

Changes to section 4.5.4 ("Default Precision Qualifiers") of the OpenGL ES
Shading Language specification

    - Add the following paragraph:

      "All languages have the following predeclared globally scoped default
       precision statements:

        precision lowp samplerExternalOES;"

Changes to section 8.8 ("Texture Lookup Functions") of the OpenGL ES Shading
Language specification

    - Add to the table the following sampler functions:

      "highp ivec2 textureSize(samplerExternalOES sampler, int lod)
       vec4 texture(samplerExternalOES sampler, vec2 P [, float bias] )
       vec4 textureProj(samplerExternalOES sampler, vec3 P [, float bias] )
       vec4 textureProj(samplerExternalOES sampler, vec4 P [, float bias])
       vec4 texelFetch(samplerExternalOES sampler, ivec2 P, int lod)"

Changes to section 9 ("Shading Language Grammar") of the OpenGL ES Shading
Language specification

    - Add to token list:

        "SAMPLEREXTERNAL"

    - Add following "type_specifier_no_array:"

        "SAMPLEREXTERNAL"

Changes to section 11 ("Counting of Inputs and Outputs") of the OpenGL ES
Shading Language specification

    - Add a paragraph at the end

        "Part of the storage may be reserved by an implementation for its own
         use e.g. for conversion of external textures. This reduces the number
         of uniforms available to the shader. The size of this reduction is
         undefined but should be minimized.

Dependencies on OpenGL ES 3.1 and ESSL 3.10

    All texture built-in functions added in ESSL 3.10 are excluded from this
    extension per Issue 4. This extension is expected to work without
    modification for ESSL 3.10.

    If OpenGL ES 3.1 is not supported, ignore changes to section 8.22 since
    image load store is not supported.

Interactions with EXT_gpu_shader5 and OES_gpu_shader5

    If either of these extensions is supported, add the following paragraph
    to the end of section 4.1.7.1 ("Samplers") of the ESSL 3.10 specification:

        "When aggregated into arrays within a shader, external samplers can
         only be indexed with a constant integral expression. All other sampler
         types can only be indexed with a dynamically uniform integral
         expression, otherwise results are undefined."

Issues

    1.  Why is this functionality not added as an interaction to the
        OES_EGL_image_external extension as in interaction with ESSL 3.x?

        RESOLVED.

        Since the built-in texture functions in ESSL were modified going from
        ESSL 1.0 to 3.x, the original extension does not trivially apply to
        ESSL 3.x.

        There are also many shipping implementations of OES_EGL_image_external
        extension that have chosen to not extend support to ESSL 3.x. If we
        were to amend the original extension, there would be no way for
        applications to determine whether a particular implementation supported
        the language extension for ESSL 3.x or not.

    2.  Should this extension require OES_EGL_image_external?

        RESOLVED: Yes.

        This extension currently depends on OES_EGL_image_external to define the
        API extensions. This also implies that an implementation cannot choose
        to support this extension for ESSL 3.x only.

    3.  What should this extension be called?

        RESOLVED: OES_EGL_image_external_essl3

    4.  Should built-in functions beyond ESSL1 compatibility be supported in
        ESSL 3.x shaders?

        RESOLVED: Yes.

        It seems useful to add some of these. The ESSL 3.x built-ins that are
        only useful for mipmapped textures are excluded since external textures
        cannot be mipmapped. The ESSL 3.x built-ins that require offsets are
        excluded since it is not clear how these should work with sub-sampled
        YUV formats.

        Required for ESSL1 feature compatibility:
        - texture
        - textureProj (two versions)

        Also included in this extension:
        - textureSize
        - texelFetch

        Excluded from this extension:
        - textureLod
        - textureLodOffset
        - textureProjLod
        - textureProjLodOffset
        - textureGrad
        - textureGradOffset
        - textureProjGrad
        - textureProjGradOffset
        - textureOffset
        - texelFetchOffset
        - textureProjOffset
        - textureGather [for ESSL 3.10]
        - textureGatherOffset [for ESSL 3.10]

    5.  Should external integer textures be supported in ESSL 3.x shaders?

        RESOLVED: No.

        The built-in functions added for ESSL1 always return floating point
        values, but that's in part because OpenGL ES 2.0 did not support
        integer textures. For ESSL 3.x, we could allow the same return values
        for external textures as for regular 2D textures. This would require
        adding new sampler types, such as samplerExternaliOES and
        samplerExternaluOES. Since there is no obvious use-case for external
        integer textures these are not added by this extension.

    6.  What token should be used to enable this extension in ESSL 3.x?

        RESOLVED: GL_OES_EGL_image_external_essl3

        The alternatives are a) reuse the GL_OES_image_external token (this
        should not cause problems since the original extension did not apply
        to ESSL 3.x), b) use the name of this extension. Option b) is chosen
        since there is no clear benefit to reusing the old name.

    7.  What is the interaction with separate sampler objects?

        RESOLVED: The texture is incomplete if the sampler object state is
                  not compatible with the sampler state.

        The OES_EGL_image_external specifies that the only supported min filter
        modes for external textures is LINEAR or NEAREST and that the only
        valid s and t wrap mode is CLAMP_TO_EDGE. TexParameter* will generate
        errors if these are called while an external texture is bound. In ES3.x
        it is possible to attach a sampler object that has any wrap mode and
        min filter. In this case, the external texture will be treated as
        incomplete if the sampler object state is incompatible with such
        textures.

        Sampler state that affects completeness of external textures:
         - TEXTURE_MIN_FILTER
         - TEXTURE_WRAP_S
         - TEXTURE_WRAP_T

        Sampler state that has no additional constraints for external textures:
         - TEXTURE_MAG_FILTER

        Sampler state that does not affect external textures, and thus have
        no impact on completeness or behavior:
         - TEXTURE_WRAP_R       (3D or 2Darray for external textures)
         - TEXTURE_COMPARE_MODE (no shadow sampler for external textures)
         - TEXTURE_COMPARE_FUNC (no shadow sampler for external textures)
         - TEXTURE_MIN_LOD      (no mipmapping for external textures)
         - TEXTURE_MAX_LOD      (no mipmapping for external textures)

    8.  What is the interaction with the texture base level?

        RESOLVED: The base level must be zero for external textures.

        External textures do not support mipmap filtering. It is consistent
        with the behavior for 2D multisampled textures in ES3.1 to make it an
        error to specify a base level other than zero for external textures.

        This error is not specified in GL_OES_EGL_image_external so adding an
        error may break existing applications using that extension (in ESSL 1.x)
        in combination with OpenGL ES 3.x if they set the base level to any
        other value.

    9.  What formats are supported?

        This is implementation defined. GL_OES_EGL_image_external does not
        require any specific formats, and this extension does not change
        that. On a given implementation, it is expected that the same set
        of formats is supported in all shader stages.

    10. Should image / load store be supported? And, if so, how?

        RESOLVED: Yes, in a limited form.

        Allowing image / load store on external textures enables compute
        shaders to write to these textures.

        A limited set of use-cases is enabled by making glBindImageTexture
        accept external textures. Shaders can access such external textures
        using the existing <image2D> sampler type.

        Since the image format must be specified by the shader, no additional
        format conversion is done for external textures accessed via image
        load/store. This implies that the shader author must know the format of
        the external texture in order to do useful work. Also, only the image
        formats already supported by image load store are available (i.e, there
        is no automatic conversion to, for example, YUV formats.)

Revision History

    #10 - (Jan 29, 2016) Fixed typo in issue 10. 
    #9 - (Apr 10, 2015) Clarified issue 10. Specified default precision for
                        samplerExternalOES as lowp for all shader stages.
    #8 - (Feb 6, 2015) Fixed typo in return value of textureSize (vec2->ivec2)
    #7 - (Oct 15, 2014) Resolved issue 10. Added interaction with EXT_gpu_shader5.
    #6 - (Oct 10, 2014) Added issue 10 and its tentative resolution.
    #5 - (Sep 25, 2014) Updated resolution of issue 7.
                        Added issues 8 and 9.
                        Converted to OES.
    #4 - (Sep 24, 2014) Added issue 7 with proposed resolution.
    #3 - (Jul 30, 2014) Excluded textureGather from this extension.
    #2 - (Jul 30, 2014) Updated based feedback. Tentatively resolved issues.
                        Added issue 6.
    #1 - (Jul 15, 2014) Original draft.
