OES_EGL_image

Name

OES_EGL_image

Name Strings

GL_OES_EGL_image

Contributors

Gary King
Acorn Pooley
Jon Leech

Contacts

Gary King, NVIDIA Corporation (gking 'at' nvidia.com)

Notice

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

Approved by the Khronos OpenKODE Working Group in January, 2007
as part of OpenKODE 1.0 Provisional.

Version

April 23, 2015 (version 8)

Number

OpenGL ES Extension #23

Dependencies

Requires OpenGL-ES 1.1 or OpenGL-ES 2.0.

Requires EGL 1.2 and either the EGL_OES_image or EGL_OES_image_base
extensions.

The EGL_KHR_gl_texture_2D_image, EGL_KHR_gl_texture_cubemap_image,
EGL_KHR_gl_texture_3D_image, EGL_KHR_gl_renderbuffer_image, and
EGL_KHR_vg_parent_image extensions provide additional functionality
layered on EGL_OES_image_base and related to this extension

OES_framebuffer_object affects the wording of this specification

This extension is written based on the wording of the OpenGL 2.0
Specification and the EXT_framebuffer_object extension.

Overview

This extension provides a mechanism for creating texture and
renderbuffer objects sharing storage with specified EGLImage objects
(such objects are referred to as "EGLImage targets").

The companion EGL_KHR_image_base and EGL_KHR_image extensions
provide the definition and rationale for EGLImage objects.

Other EGL extensions, such as EGL_KHR_gl_texture_2D_image,
EGL_KHR_gl_texture_cubemap_image, EGL_KHR_gl_texture_3D_image,
EGL_KHR_gl_renderbuffer_image, and EGL_KHR_vg_parent_image, define
the related functionality of creating EGLImage objects from
"EGLImage sources" such as OpenGL ES texture or renderbuffers or
OpenVG VGImage objects.

EGL extension specifications are located in the EGL Registry at

    http://www.khronos.org/registry/egl/

Glossary

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

New Types

/*
 * GLeglImageOES is an opaque handle to an EGLImage
 */
typedef void* GLeglImageOES;

New Procedures and Functions

void EGLImageTargetTexture2DOES(enum target, eglImageOES image)

void EGLImageTargetRenderbufferStorageOES(enum target,
                                          eglImageOES image)

New Tokens

 None.

Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)

- (3.8.2, p. 160)  Insert the following text after the end of the
  first paragraph (before the discussion of {Copy}TexSubImage):

"Another way of specifying two-dimensional texture images is to
reference them from existing EGLImage objects.  Images specified
this way will be EGLImage siblings with the original EGLImage
source and any other EGLImage targets.

The command

    void EGLImageTargetTexture2DOES(enum target, eglImageOES image);

defines an entire two-dimensional texture array.  All properties
of the texture images (including width, height, format, border, mipmap
levels of detail, and image data) are taken from the specified
eglImageOES <image>, rather than from the client or the framebuffer.
Any existing image arrays associated with any mipmap levels in the texture
object are freed (as if TexImage was called for each, with an image of
zero size).  As a result of this referencing operation, all of the pixel
data in the <buffer> used as the EGLImage source resource (i.e., the
<buffer> parameter passed to the CreateImageOES command that returned
<image>) will become undefined.

Currently, <target> must be TEXTURE_2D.  <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 an application later respecifies any image
array in the texture object (through mechanisms such as calls to
TexImage2D and/or GenerateMipmapOES, or setting the
SGIS_GENERATE_MIPMAP parameter to TRUE), implementations should allocate
additional space for all specified (and respecified) image arrays,
and copy any existing image data to the newly (re)specified texture
object (as if TexImage was called for every level-of-detail in the
texture object).  The respecified texture object will not be an
EGLImage target.

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 <image> does not refer to a valid eglImageOES object, the error
INVALID_VALUE is generated.

If <target> is not TEXTURE_2D, the error INVALID_ENUM is generated.

Additions to the EXT_framebuffer_object extension

- (4.4.2.1) Add the following text at the end of section 4.4.2.1
  (Renderbuffer Objects)

The command

    void EGLImageTargetRenderbufferStorageOES(enum target,
                                              eglImageOES image)

establishes the data storage, format, and dimensions of a
renderbuffer object's image, using the parameters and storage
associated with the eglImageOES <image>.  Assuming no errors
are generated in this process, the resulting renderbuffer
will be an EGLImage target of the specifed eglImageOES <image>.
The renderbuffer will remain an EGLImage target until it is
deleted or respecified by a call to
{Reference}RenderbufferStorageOES.  As a result of this referencing
operation, all of the pixel data in the <buffer> used as the
EGLImage source resource (i.e., the <buffer> parameter passed to
the CreateImageOES command that returned <image>) will become
undefined.

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

If the GL is unable to create a renderbuffer using the specified
eglImageOES, the error INVALID_OPERATION is generated.  If <image>
does not refer to a valid eglImageOES object, the error
INVALID_VALUE is generated.

Issues

1.  What happens if an application tries to specify a new mipmap
    level (or respecify an existing mipmap level) for a texture
    object that was originally specified using
    EGLImageTargetTexture2D (e.g., by subsequent calls to
    {Copy}TexImage, GenerateMipmapOES, and/or setting the
    texture's GENERATE_MIPMAP_SGIS parameter to TRUE) ?

    RESOLVED:  If the application respecifies any properties of
    an EGLImage target texture, the GL should allocate additional
    memory for the respecified object, copying any data from
    previously-specified levels (including those in the EGLImage
    source).  The respecified texture object will not be an
    EGLImage target, potentially orphaning the EGLImage.

2.  What happens if multiple texture or renderbuffer objects, which
    are each EGLImage siblings, are attached to multiple attachment
    points of a framebuffer object?

    RESOLVED:  There are several possibilities for handling this
    situation, listed below.  The primary goal for any solution
    should be minimizing the required run-time error checking &
    validation, since determining that two objects refer to the same
    parent resource is a complex operation.

     i.   Generate an error if a context share group attempts to create
          two EGLImage siblings (either source or target) .

          This limits error checking to just EGLImageTargetTexture /
          EGLImageTargetRenderbufferStorage, which should be infrequent
          calls, particularly during run-time.  However, some potentially
          valuable use cases are restricted with this approach, such
          as referencing 2D texture objects from cube map EGLImage sources
          in the same context share group.

     ii.  Add a new clause to the framebuffer completeness test that
          disallows multiple EGLImage siblings being attached to the
          same framebuffer object.

          This would be in the spirit of the OES_framebuffer_object
          extension and does not limit any valuable use cases; however,
          it has the potential to significantly increase runtime
          overhead, given the complexity of this completeness check
          and the potential frequency that framebuffer completeness
          may need to be checked.

     iii. Leave the rendering results undefined, but require that
          behavior be limited to undefined rendering results (i.e.,
          the application and/or system may not crash as a result
          of this operation).

          This solution allows implementations the opportunity to have
          virtually no additional run-time validation overhead, nor
          are any valuable use cases restricted.  Implementations
          may consider framebuffer objects which contain multiple
          EGLImage siblings as incomplete framebuffers if necessary to
          ensure application & system stability.

    SUGGESTION:  Solution (iii).  The only reasonable well-defined
    behavior for this type of API usage is an error; however, given
    the potential for the error check to noticeably increase validation
    overhead, leaving this behavior undefined seems like the best
    choice.

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

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

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

    UNRESOLVED:  One of the problems with allowing the referencing
    functions to result in undefined pixel data is that the EGLImage
    source object may be part of a larger image structure (such as
    an array of mipmap levels-of-detail, or cube map faces).  While we
    can specify that the pixel data in the EGLImage become undefined
    quite easily, specifying that the pixel data in other images become
    undefined is more difficult.  So, with that discussion, the following
    options were considered:

      i.   Specify that the pixel data in the EGLImage, and other image
           arrays associated with the EGLImage source, become undefined
           as a result of referencing.

      ii.  Specify that only the pixel data in the EGLImage becomes
           undefined; any data in other image arrays associated with the
           EGLImage source must not be affected by the referencing
           operation.

      iii. Specify that the pixel data in the EGLImage is unaffected as
           a result of the referencing operation.

    Option (i) gives the greatest flexibility (and potentially ease-
    of implementation) to implementers, which should may result in
    implementations exporting a larger number of compatible configurations
    than the other, stricter options.  Additionally, for well-behaved
    applications (i.e., applications which perform all resource creation
    and referencing prior to use), making the image data undefined will
    not have any adverse side effects.

    Option (ii) provides option (i)'s benefits if the EGLImage source
    is a trivial image (i.e., no additional mipmap levels-of-detail,
    3D texture slices, etc.); however, some implementations may be
    required to implement potentially-expensive copy operations to support
    complex EGLImage source images.

    Option (iii) is the strictest, and may significantly impede
    implementers' ability to expose compatible configurations.

    Weighing the benefits (increased configuration compatibility and ease-
    / performance- of implementation) versus the costs (specification
    ugliness), the specification has currently selected option (i),
    favoring compatibility and performance.


5.  What should the entry point for referencing 2D textures be named?

    UNRESOLVED:  Unfortunately, OpenGL is not particularly consistent
    with texture naming conventions.  However, most texture function
    names have followed the convention of using a verb- or adjective-
    specifier followed by the object type, e.g. : CopyTexImage,
    CompressedTexImage, DrawPixels, etc.

    Therefore, this issue can be broken into two sub-issues: naming
    the verb or adjective and naming the object type.

    The following options were considered for the verb or adjective:
      a1)  Reference / Referenced
      a2)  EGLImageTarget

    Reference (a1) is the verb for creating EGLImage targets from
    EGLImages (defined in the EGL_OES_image specification), but
    "Reference<blah>" might confuse some developers, since the
    direction of the verb sounds backwards.

    Therefore, option (a2) has been selected, since the newly-
    specified texture object will be an EGLImage target.

    And the following options were considered for the object type:
      b1)  TexImage
      b2)  Texture
      b3)  TextureObject

    (b1) follows the convention used by other texture specification
    functions; however, unlike {Copy,Compressed}TexImage, which
    specify only a single mipmap level-of-detail, the referencing
    entry point respecifies all image arrays in the texture object.

    (b2) and (b3) address the issues with (b1).  The OpenGL
    specification interchangeably uses "texture" and "texture object"
    to refer to the entire collection of image arrays, so either
    choice seems reasonable.  For brevity, (b2) has been used
    in this specification.

    Note, though, that eglBindTexImage also respecifies all image
    arrays in the texture object, but it does not change the
    TexImage suffix.

    Another option would be to treat the referencing function as an
    attachment, rather than a specification, in which case a more
    appropriate name would follow the convention used in the
    OES_framebuffer_object extension, such as Texture2DeglImageOES.

6.  What should the entry point for referencing renderbuffers be named?

    UNRESOLVED:  There are far fewer conventions for renderbuffer
    function names than there are for textures, so the naming for
    this function should use whichever convention is selected
    to resolve Issue 5.  Given the current selections in that issue,
    EGLImageTargetRenderbufferStorage is being used.

Dependencies on EGL_KHR_image, EGL_KHR_image_base, and EGL 1.2

If EGL 1.2 is not supported, or if neither the EGL_OES_image nor
EGL_OES_image_base extensions is supported, all discussion of
EGLImages should be ignored, and any calls to either
EGLImageTargetTexture2DOES or EGLImageTargetRenderbufferStorageOES
should generate the error INVALID_OPERATION.

Dependencies on OES_framebuffer_object

If the OES_framebuffer_object extension is not supported, all
discussion of renderbuffers should be ignored, and all calls to
EGLImageTargetRenderbufferStorageOES should generate the error
INVALID_OPERATION.

Revision History

#8 (April 23, 2015, Jon Leech)
   - Fix typo EGLImageTargetTexImage2DOES -> EGLImageTargetTexture2DOES
     (Bug 8114).

#7 (April 17, 2014, Jon Leech)
   - Add missing error for invalid <image> parameter to
     EGLImageTargetTexture2DOES (Bug 5164).

#6 (April 1, 2009, Acorn Pooley, Jon Leech)
   - Fix dependancy typo. Mention EGL_KHR_image_base. Correct
     spelling of EGL_KHR_image and refer to alternate
     EGL_KHR_image_base. Correct dependency on EGL from 1.1 to 1.2.
     Change filename in the registry to correspond to capitalization
     of the extension string. Don't update the version number
     further until all internal edits are completed.

#5 (April 1, 2009, Jon Leech)
   - Added more overview pointing to companion EGL extensions.

#4 (April 22, 2007, Jon Leech)
   - Added updated 'Status' to reflect OpenKODE 1.0 Provisional.

#3  (December 14, 2006)
   - Changed requirement to egl 1.2 to include EGLClientBuffer type.

#2  (October 20, 2006)
   - Reworded phrasing describing undefined pixel data as a
     result of EGLImageTarget* commands

#1 - Original Release