Name

    KHR_image_base

Name Strings

    EGL_KHR_image_base

Contributors

    Jeff Juliano
    Gary King
    Jon Leech
    Jonathan Grant
    Barthold Lichtenbelt
    Aaftab Munshi
    Acorn Pooley
    Chris Wynn

Contacts

    Jon Leech (jon 'at' alumni.caltech.edu)
    Gary King, NVIDIA Corporation (gking 'at' nvidia.com)

Notice

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

Status

    Complete. Functionality approved (as part of KHR_image) by the
    Khronos Board of Promoters on February 11, 2008.

    Split into KHR_image_base and KHR_image_pixmap approved by the
    Khronos Technical Working Group on November 19, 2008. Update to
    version 5 approved on December 10, 2008.

Version

    Version 8, August 27, 2014

Number

    EGL Extension #8

Dependencies

    EGL 1.2 is required.

    An EGL client API, such as OpenGL ES or OpenVG, is required.

    This extension is written against the wording of the EGL 1.2
    Specification.

Overview

    This extension defines a new EGL resource type that is suitable for
    sharing 2D arrays of image data between client APIs, the EGLImage.
    Although the intended purpose is sharing 2D image data, the
    underlying interface makes no assumptions about the format or
    purpose of the resource being shared, leaving those decisions to
    the application and associated client APIs.

Glossary

    EGLImage:  An opaque handle to a shared resource created by EGL
               client APIs, presumably a 2D array of image data

    EGLImage source:  An object or sub-object originally created in
               a client API (such as a mipmap level of a texture object
               in OpenGL-ES, or a VGImage in OpenVG) which is used as
               the <buffer> parameter in a call to eglCreateImageKHR.

    EGLImage target:  An object created in a client API (such as a
               texture object in OpenGL-ES or a VGImage in OpenVG)
               from a previously-created EGLImage

    EGLImage sibling: The set of all EGLImage targets (in all
               client API contexts) which are created from the
               same EGLImage object, and the EGLImage source resouce
               which was used to create that EGLImage.

    Orphaning:  The process of respecifying and/or deleting an EGLImage
               sibling resource (inside a client API context) which
               does not result in deallocation of the memory associated
               with the EGLImage or affect rendering results using other
               EGLImage siblings.

    Referencing:  The process of creating an EGLImage target resource
               (inside a client API context) from an EGLImage.

    Respecification: When the size, format, or other attributes of an
               EGLImage sibling are changed via client API calls such as
               gl*TexImage*. Respecification usually will result in
               orphaning the sibling. Note that changing the pixel values of
               the sibling (e.g. by rendering to it or by calling
               gl*TexSubImage*) does not constitute respecification.

New Types

    /*
     * EGLImageKHR is an object which can be used to create EGLImage
     * target resources (inside client APIs).
     */
    typedef void* EGLImageKHR;

New Procedures and Functions

    EGLImageKHR eglCreateImageKHR(
                            EGLDisplay dpy,
                            EGLContext ctx,
                            EGLenum target,
                            EGLClientBuffer buffer,
                            const EGLint *attrib_list)

    EGLBoolean eglDestroyImageKHR(
                            EGLDisplay dpy,
                            EGLImageKHR image)

New Tokens

    Returned by eglCreateImageKHR:

        EGL_NO_IMAGE_KHR                                     ((EGLImageKHR)0)

    Accepted as an attribute in the <attrib_list> parameter of
    eglCreateImageKHR:

        EGL_IMAGE_PRESERVED_KHR                              0x30D2

Additions to Chapter 2 of the EGL 1.2 Specification (EGL Operation)

    Add a new section "EGLImages" after section 2.4:

    "2.5 EGLImages

    As described in section 2.4, EGL allows contexts of the same client
    API type to share significant amounts of state (such as OpenGL-ES
    texture objects and OpenVG paths); however, in some cases it may
    be desirable to share state between client APIs - an example would be
    using a previously-rendered OpenVG image as an OpenGL-ES texture
    object.

    In order to facilitate these more complicated use-cases, EGL is capable
    of creating EGL resources that can be shared between contexts of
    different client APIs (called "EGLImages") from client API resources
    such as texel arrays in OpenGL-ES texture objects or OpenVG VGImages
    (collectively, the resources that are used to create EGLImages are
    referred to as "EGLImage sources").

    The EGL client APIs each provide mechanisms for creating appropriate
    resource types (such as complete texture arrays or OpenVG VGImages) from
    EGLImages through a API-specific mechanisms.  Collectively, resources
    which are created from EGLImages within client APIs are referred to as
    "EGLImage targets."  Each EGLImage may have multiple associated EGLImage
    targets.  Collectively, the EGLImage source and EGLImage targets
    associated with an EGLImage object are referred to as "EGLImage
    siblings."

    2.5.1  EGLImage Specification

    The command

        EGLImageKHR eglCreateImageKHR(
                                EGLDisplay dpy,
                                EGLContext ctx,
                                EGLenum target,
                                EGLClientBuffer buffer,
                                const EGLint *attrib_list)

    is used to create an EGLImage from an existing image resource <buffer>.
    <dpy> specifies the EGL display used for this operation.
    <ctx> specifies the EGL client API context
    used for this operation, or EGL_NO_CONTEXT if a client API context is not
    required.  <target> specifies the type of resource being used as the
    EGLImage source (examples include two-dimensional textures in OpenGL ES
    contexts and VGImage objects in OpenVG contexts).  <buffer> is the name
    (or handle) of a resource to be used as the EGLImage source, cast into the
    type EGLClientBuffer.  <attrib_list> is an list of attribute-value pairs
    which is used to select sub-sections of <buffer> for use as the EGLImage
    source, such as mipmap levels for OpenGL ES texture map resources, as well as
    behavioral options, such as whether to preserve pixel data during creation. If
    <attrib_list> is non-NULL, the last attribute specified in the list must
    be EGL_NONE.

    The resource specified by <dpy>, <ctx>, <target>, <buffer>, and
    <attrib_list> must not itself be an EGLImage sibling, or bound to an EGL
    PBuffer resource (eglBindTexImage, eglCreatePbufferFromClientBuffer).

    Values accepted for <target> are listed in Table aaa, below(fn1).
        (fn1) No values are defined by this extension. All functionality
        to create EGLImages from other types of resources, such as
        native pixmaps, GL textures, and VGImages, is layered in other
        extensions.

      +-------------------------+--------------------------------------------+
      |  <target>               |  Notes                                     |
      +-------------------------+--------------------------------------------+
      +-------------------------+--------------------------------------------+
       Table aaa.  Legal values for eglCreateImageKHR <target> parameter

    Attribute names accepted in <attrib_list> are shown in Table bbb,
    together with the <target> for which each attribute name is valid, and
    the default value used for each attribute if it is not included in
    <attrib_list>.

      +-------------------------+----------------------+-----------+---------------+
      | Attribute               | Description          | Valid     | Default Value |
      |                         |                      | <target>s |               |
      +-------------------------+----------------------+-----------+---------------+
      | EGL_NONE                | Marks the end of the | All       | N/A           |
      |                         | attribute-value list |           |               |
      | EGL_IMAGE_PRESERVED_KHR | Whether to preserve  | All       | EGL_FALSE     |
      |                         | pixel data           |           |               |
      +-------------------------+----------------------+-----------+---------------+
       Table bbb.  Legal attributes for eglCreateImageKHR <attrib_list> parameter

    This command returns an EGLImageKHR object corresponding to the image
    data specified by <dpy>, <ctx>, <target>, <buffer> and <attrib_list> which
    may be referenced by client API operations, or EGL_NO_IMAGE_KHR in the
    event of an error.

    If the value of attribute EGL_IMAGE_PRESERVED_KHR is EGL_FALSE (the
    default), then all pixel data values associated with <buffer> will be
    undefined after eglCreateImageKHR returns.

    If the value of attribute EGL_IMAGE_PRESERVED_KHR is EGL_TRUE, then all
    pixel data values associated with <buffer> are preserved.

    Errors

        If eglCreateImageKHR fails, EGL_NO_IMAGE_KHR will be returned, the
        contents of <buffer> will be unaffected, and one of the following
        errors will be generated:

       * If <dpy> is not the handle of a valid EGLDisplay object, the error
         EGL_BAD_DISPLAY is generated.

       * If <ctx> is neither the handle of a valid EGLContext object on
         <dpy> nor EGL_NO_CONTEXT, the error EGL_BAD_CONTEXT is
         generated.

       * If <target> is not one of the values in Table aaa, the error
         EGL_BAD_PARAMETER is generated.

       * If an attribute specified in <attrib_list> is not one of the
         attributes listed in Table bbb, the error EGL_BAD_PARAMETER is
         generated.

       * If an attribute specified in <attrib_list> is not a valid attribute
         for <target>, as shown in Table bbb, the error EGL_BAD_MATCH is
         generated.

       * If the resource specified by <dpy>, <ctx>, <target>, <buffer> and
         <attrib_list> has an off-screen buffer bound to it (e.g., by a
         previous call to eglBindTexImage), the error EGL_BAD_ACCESS is
         generated.

       * If the resource specified by <dpy>, <ctx>, <target>, <buffer> and
         <attrib_list> is bound to an off-screen buffer (e.g., by a previous
         call to eglCreatePbufferFromClientBuffer), the error
         EGL_BAD_ACCESS is generated.

       * If the resource specified by <dpy>, <ctx>, <target>, <buffer> and
         <attrib_list> is itself an EGLImage sibling, the error
         EGL_BAD_ACCESS is generated.

       * If insufficient memory is available to complete the specified
         operation, the error EGL_BAD_ALLOC is generated.

       * If the call to eglCreateImageKHR fails for multiple reasons, the
         generated error must be appropriate for one of the reasons,
         although the specific error returned is undefined.

       * If the value specified in <attrib_list> for EGL_IMAGE_PRESERVED_KHR
         is EGL_TRUE, and an EGLImageKHR handle cannot be created from the
         specified resource such that the pixel data values in <buffer> are
         preserved, the error EGL_BAD_ACCESS is generated.

    Note that the success or failure of eglCreateImageKHR should not affect
    the ability to use <buffer> in its original API context (or context
    share group) (although the pixel data values will be undefined if
    EGL_IMAGE_PRESERVED_KHR is not EGL_TRUE).

    2.5.2  Lifetime and Usage of EGLImages

    Once an EGLImage is created from an EGLImage source, the memory associated
    with the EGLImage source will remain allocated (and all EGLImage siblings
    in all client API contexts will be useable) as long as either of the
    following conditions is true:
      A)  Any EGLImage siblings exist in any client API context
      B)  The EGLImage object exists inside EGL

    The semantics for specifying, deleting and using EGLImage siblings are
    client API-specific, and are described in the appropriate API
    specifications.

    If an application specifies an EGLImage sibling as the destination for
    rendering and/or pixel download operations (e.g., as an OpenGL-ES
    framebuffer object, glTexSubImage2D, etc.), the modified image results
    will be observed by all EGLImage siblings in all client API contexts.
    If multiple client API contexts access EGLImage sibling resources
    simultaneously, with one or more context modifying the image data,
    rendering results in all contexts accessing EGLImage siblings are
    undefined.

    Respecification and/or deletion of any EGLImage sibling (i.e., both
    EGLImage source and EGLImage target resources) inside a client API
    context (e.g., by issuing a subsequent call to
    gl{Copy,Compressed}TexImage, glDeleteTextures, with the EGLImage
    sibling resource as the target of the operation) affects only that
    client API context and other contexts within its share group.  The
    specific semantics for this behavior are defined by each client API,
    and generally results in orphaning of the EGLImage, and may also
    include allocation of additional memory for the respecified resource
    and/or copying of the EGLImage pixel data.

    Operations inside EGL or any client API context which may affect the
    lifetime of an EGLImage (or the memory allocated for the EGLImage),
    such as respecifying and/or deleting an EGLImage sibling inside a
    client API context, must be atomic.

    Applications may create client API resources from an EGLImageKHR using
    client API extensions outside the scope of this document (such as
    GL_OES_EGL_image, which creates OpenGL ES texture and renderbuffer
    objects). If the EGLImageKHR used to create the client resource was
    created with the EGL_IMAGE_PRESERVED_KHR attribute set to EGL_TRUE, then
    the pixel data values associated with the image will be preserved after
    creating the client resource; otherwise, the pixel data values will be
    undefined. If the EGLImageKHR was created with the
    EGL_IMAGE_PRESERVED_KHR attribute set to EGL_TRUE, and EGL is unable to
    create the client resource without modifying the pixel values, then
    creation will fail and the pixel data values will be preserved.

    The command

        EGLBoolean eglDestroyImageKHR(
                            EGLDisplay dpy,
                            EGLImageKHR image)

    is used to destroy the specified EGLImageKHR object <image>.  Once
    destroyed, <image> may not be used to create any additional EGLImage
    target resources within any client API contexts, although existing
    EGLImage siblings may continue to be used.  EGL_TRUE is returned
    if DestroyImageKHR succeeds, EGL_FALSE indicates failure.

       * If <dpy> is not the handle of a valid EGLDisplay object, the error
         EGL_BAD_DISPLAY is generated.

       * If <image> is not a valid EGLImageKHR object created with respect
         to <dpy>, the error EGL_BAD_PARAMETER is generated."

    Add a new error to the list at the bottom of Section 3.5.3 (Binding
    Off-Screen Rendering Surfaces to Client Buffers):

       "* If the buffers contained in <buffer> consist of any EGLImage
          siblings, an EGL_BAD_ACCESS error is generated."

Issues

    1.  What resource types should be supported by this extension?

        RESOLVED:  This specification is designed to support the
        sharing of two-dimensional image resources between client APIs,
        as these resources are a fundamental component of all modern
        graphics APIs.

        Other resources types (e.g., buffer objects) will not be directly
        supported by this specification, due to a variety of reasons:

            a.  An absense of use cases for this functionality
            b.  Handling the semantics for some of these resources
                (e.g., glMapBuffer) would significantly complicate
                and delay this specification.
            c.  A desire to address the image-sharing use cases
                as quickly as possible.

        Should additional resource-sharing functionality be desired
        in the future, the framework provided by this specification
        should be extendable to handle more general resource
        sharing.

    2.  Should this specification address client API-specific resources
        (OpenGL texture maps, OpenVG VGImages), or should that
        functionality be provided by layered extensions?

        SUGGESTION: Use layered extensions, even for for sharing image
        data with native rendering APIs (the EGL_KHR_image_pixmap
        extension).

        There are two major arguments for using layered extensions:

          1.  The two client APIs which are defined at the time of this
              specification (OpenVG, OpenGL ES) may not always be
              deployed on a device; many devices may choose to implement
              just one of these two APIs.  However, even single-API
              devices may benefit from the ability to share image data
              with native rendering APIs (provided in this specification)
              or with the OpenMAX API.

          2.  OpenGL ES defines a number of optional resource types
              (cubemaps, renderbuffers, volumetric textures) which this
              framework should support; however, implementations may not.
              By layering each of these resource types in individual
              extensions, implementations which are limited to just the
              core OpenGL ES 1.1 (or OpenGL ES 2.0) features will not
              need to add EGLImage enumerant support for unsupported
              resource types.

        The original EGL_KHR_image extension included native pixmap
        functionality. We have now split the abstract base functionality
        (the egl{Create,Destroy}ImageKHR APIs) from the native pixmap
        functionality, and redefined EGL_KHR_image as the combination of
        EGL_KHR_image_base and EGL_KHR_image_pixmap.

    3.  Should attributes (width, height, format, etc.) for EGLImages
        be queriable?

        SUGGESTION:  No.  Given the wealth of attributes that we would
        need to specify all possible EGLImages (and possible
        memory layout optimizations performed by implementations), we
        can dramatically simplify the API without loss of key
        functionality by making EGLImages opaque and allowing
        implementations to make the correct decisions internally.

    4.  Should this specification allow the creation of EGLImages from
        client API resources which are themselves EGLImage targets?

        RESOLVED:  No.  This can make memory garbage collection and
        reference counting more difficult, with no practical benefit.
        Instead, generate an error if an application attempts to
        create an EGLImage from an EGLImage target resource.

    5.  Should this specification allow multiple EGLImages to be created
        from the same EGLImage source resource?

        RESOLVED:  No.  The resource <buffer> specified to
        eglCreateImageKHR may include multiple sub-objects; examples are
        mipmapped images and cubemaps in the OpenGL-ES API.  However, the
        EGLImage source is defined as the specific sub-object that is defined
        by: <ctx>, <target>, <buffer>, and <attrib_list>.  This sub-object must
        not be an EGLImage sibling (either EGLImage source or EGLImage target)
        when eglCreateImageKHR is called; however, other sub-objects in
        <buffer> may be EGLImage siblings.  This allows applications to share
        individual cubemap faces, or individual mipmap levels of detail across
        all of the supported APIs.

        Note that the EGLImage source and any EGLImage target resources
        will still be EGLImage siblings, even if the EGLImage object
        is destroyed by a call to DestroyImageKHR.

    6.  If an EGLImage sibling is respecified (or deleted), what
        should happen to the EGLImage and any other EGLImage
        siblings?

        RESOLVED:  The principle of least surprise would dictate that
        respecification and/or deletion of a resource in one client API
        should not adversely affect operation in other client APIs
        (such as introducing errors).

        Applying this to EGLImages, respecification and/or deletion
        of one EGLImage sibling should not respecify/delete other
        EGLImage siblings.  Each client API will be responsible for
        defining appropriate semantics to meet this restriction;
        however, example behaviors may include one or more of:
        allocating additional memory for the respecified resource,
        deleting the EGLImage sibling resource without deallocating
        the associated memory ("orphaning") and/or copying the
        existing EGLImage pixel data to an alternate memory location.

        The memory associated with EGLImage objects should remain
        allocated as long as any EGLImage sibling resources exist
        in any client API context.

    7.  Should this specification address synchronization issues
        when multiple client API contexts simultaneously access EGLImage
        sibling resources?

        RESOLVED:  No.  Including error-producing lock and synchronization
        semantics would introduce additional (undesirable) validation
        overhead in numerous common operations (e.g., glBindTexture,
        glDrawArrays, etc.).  Rather than burdening implementations (and
        applications) with this overhead, a separate synchronization
        mechanism should be exposed to applications.

    8.  Should eglCreatePbufferFromClientBuffer accept buffer parameters
        which are EGLImage siblings?

        RESOLVED:  No.  Allowing this behavior creates very complex
        circular dependency possibilities (CreateImage / DeriveImage /
        CreatePbufferFromClientBuffer / BindTexImage /
        CreateImage / ...) with no practical benefit.  Therefore,
        attempting to create a Pbuffer from a client buffer which
        is an EGLImage sibling should generate an error.

    9.  Should CreateImage accept client buffers which are bound to
        Pbuffers (through eglBindTexImage)?

        RESOLVED:  No, for the same reasons listed in Issue 8.

    10. Should implementations be allowed to modify the pixel data in the
        EGLImage source buffers specified to eglCreateImageKHR?

        SUGGESTION:  By allowing previously-existing image data to become
        undefined after calls to eglCreateImageKHR, implementations are able
        to perform any necessary reallocations required for cross-API
        buffer compatibility (and/or performance), without requiring
        copy-aside functionality.  Because applications are able to
        respecify the pixel data through mechanisms such as vgSubImage
        and glTexSubImage, no use-cases are restricted by this.

        Therefore, the current suggestion is to allow implementations
        to leave pixel data undefined after calls to eglCreateImageKHR
        functions.  The current spec revision has been written in
        this way.

    11. What is the correct mechanism for specifying the EGLImage source
        resources used to create an EGLImage object?

        RESOLVED:  Three different mechanisms were discussed while
        defining this extension:

            A)  Providing resource-specific creation functions, such as
                eglCreateImage2DKHR, eglCreateImage3DKHR, etc.

            B)  Providing a single creation function which returns a
                "NULL" EGLImage object, and requiring client APIs to
                define additional functions which would allow client API
                resources to be "bound" to the EGLImage object.

            C)  Provide a single resource creation function, and use
                an attribute-value list with attributes specific to the
                "target" image resource.

        Initial specifications were written using Option (A); however,
        it was believed that this structure would result in an increase
        in the number of entry points over time as additional client APIs
        and client API resource targets were added.  Furthermore, reuse
        of these functions was resulting in cases where parameters were
        required to have modal behavior: a 2D image creation function
        was required to have a mipmap level of detail parameter for
        OpenGL ES texture maps, but this same parameter would need to be
        0 for OpenVG.

        Option (B) provided some nice characteristics: as client APIs
        continue to evolve, any extensions needed to allow EGLImage
        creation could be isolated in the individual client API, rather
        than necessitating an EGL extension.  However, the creation of
        "NULL" images created additional semantic complexity and error
        conditions (e.g., attempting to derive an EGLImage target from a
        "NULL" image), and every client API would need to provide a
        function for every unique resource type; instead of one common
        API function for pixmap, OpenGL 2D textures, and OpenVG VGImages,
        three would be required.

        This specification is written using Option (C).  There is a
        single CreateImage function, with a <target> parameter defining
        the EGLImage source type, and an attribute-value list allowing
        for additional selection of resource sub-sections.  This
        maximizes entry-point reuse, and minimizes the number of
        redundant parameters an application may be required to send.
        This framework allows for layered extensions to be easily
        written, so little churn is expected as client APIs evolve.

    12. Should a context be explicitly provided to eglCreateImageKHR,
        or should the context be deduced from the current thread's
        bound API?

        SUGGESTION:  For clarity (both in usage and spec language), the
        context containing the EGLImage source should be provided by the
        application, rather than inferring the context from EGL state.

    13. Why does this extension define a new EGL object type, rather
        than using the existing EGLSurface objects?

        RESOLVED:  Although controversial, the creation of a new,
        opaque image object type removes several fundamental problems
        with the EGLSurface (and Pbuffer) API:

            1)  The tight compatibility requirements of EGLSurfaces
                and EGLConfigs necessitated applications creating
                (and calling MakeCurrent) for every unique pixel
                format used during rendering.  This has already caused
                noticeable performance problems in OpenGL-ES (and
                desktop OpenGL), and is the primary reason that
                framebuffer objects were created.

            2)  Application use-cases are centered around sharing of
                color image data, although unique "sundry" buffers
                (such as depth, stencil and alpha mask) may be used
                in each client API.

            3)  Extending the CreatePbuffer interface to support fully-
                specifying all possible buffer attributes in all client
                APIs will become unwieldy, particularly as new EGL
                client APIs and pixel formats are introduced.

        The EGLImage proposal addresses all three of these restrictions:

        1) is addressed by placing the burden of framebuffer management
        inside the client API, and allowing EGLImages to be accessed
        inside client APIs using an appropriate resource type (such
        as OpenGL-ES renderbuffers).  This follows the example provided
        by the GL_OES_framebuffer_object specification.

        2) is addressed by defining EGLImages to be "trivial" two-
        dimensional arrays of pixel data.  Implementations may choose
        to support creation of EGLImages from any type of pixel data,
        and the association of multiple EGLImages and/or sundry
        buffers into a single framebuffer is the responsibility of the
        application and client API, using a mechanism such as
        GL_OES_framebuffer_object.

        3) is addressed by defining EGLImages as opaque and
        non-queriable.  Although this introduces potential portability
        problems (addressed separately in issue 15), it avoids the
        ever-expanding problem of defining buffer compatibility as the
        cartesian product of all possible buffer attributes.

    14. Since referencing EGLImages is the responsibility of the client
        API, and may fail for implementation-dependent reasons,
        doesn't this result in a potential portability problem?

        UNRESOLVED:  Yes, this portability problem (where referencing
        succeeds on one platform but generates errors on a different
        one) is very similar to the implementation-dependent
        failure introduced in the EXT_framebuffer_object specification,
        discussed (at length) in Issues (12), (37), (46), (48) and (61)
        of that specification.  Similar to that specification, this
        specification should include some "minimum requirements"
        language for EGLImage creation and referencing.

        Since there are numerous references to an upcoming
        "format restriction" API in the EXT_framebuffer_object
        specification, it may be valuable to wait until that API is
        defined before attempting to define a similar API for
        EGLImages.

    15. Should creation of an EGLImage from an EGLImage source
        introduce the possibility for errors in the EGLImage source's
        owning context?

        RESOLVED:  No; although image data may be undefined (issue 11),
        the (successful or unsuccessful) creation of an EGLImage should
        not introduce additional error conditions in the EGLImage
        source's owning context.  Text added to the end of section
        2.5.1 describing this.

    16. Is it reasonable to require that when a preserved EGLImage is
        used by layered extensions to create client API siblings of that
        image, pixel data values are preserved?

        UNRESOLVED: There are at least two extensions that reference
        EGLImages to create EGLImage targets, VG_KHR_EGL_image and
        GL_OES_EGL_image.

        Each of these extensions makes provision for failing the creation of
        the EGLImage target due to "an implementation-dependent reason".
        This could include that the pixel data has been marked as preserved,
        and that the implementation is not able to create the EGLImage
        target without causing the pixel data of the original EGLImage
        source <buffer> to become undefined.

        Issue 14 of EGL_KHR_image also discusses the consequences of failure
        for implementation-dependent reasons. This implies that all
        extensions for referencing an EGLImage need to make provision for
        implementation-dependent failure.

        PROPOSED: Yes, this is reasonable. We should add "EGL_KHR_image_base
        affects the behavior of this extension" sections to the ES and VG
        extensions. Implementations can continue to export EGL_KHR_image if
        they are unable to support preserved image functionality.

    17. Do EGLImage Target creation extensions such as VG_KHR_EGL_image and
        GL_OES_EGL_image also need to be extended?

        UNRESOLVED: The problem here is that both these extensions
        explicitly state that pixel data becomes undefined when they
        reference an EGLImage to create an EGLImage target.

        One solution would be to allow this extension to do the defining on
        behalf of these extensions. For example, the VG_KHR_EGL_image
        extension on its own leaves the status of the pixel data undefined,
        but when VG_KHR_EGL_image is combined with this extension, then the
        status becomes defined (by this extension).

        When combined with the reasons given in Issue 1, this means it is
        possible to leave EGLImage Target creation extensions unchanged.

        PROPOSED: Yes, augment these extensions as described in issue 16.

    18. Is it reasonable for developers to want to preserve pixel data upon
        creation of EGLImage and EGLImage targets?

        RESOLVED: Yes. This is necessary for composition implementations
        using EGLImages as an encapsulation mechanism for moving data
        between producer application, composition API, and composition
        implementation(s).

    19. Should we really change the default value of EGL_IMAGE_PRESERVED_KHR
        when EGL_KHR_image is supported?

        RESOLVED: No. This is a subtle and hard to diagnose source of
        errors, and the only way to write a portable app would still be
        to explicitly specify the attribute value. By making the default
        value FALSE no matter which of the two extension(s) are
        supported, compatibility with EGL_KHR_image is preserved, and
        apps must explicitly ask for preservation if they need it.

    20. Why is EGL_NO_DISPLAY not supported as the <dpy> argument for
        creating and destroying images, unlike the original version of the
        EGL_KHR_image specification?

        RESOLVED: There are no defined use cases for this at present, so
        there is no way to legally pass in EGL_NO_DISPLAY. If in the future,
        a layered extension allows creation of images not associated with
        any display, this behavior can be reintroduced.


Revision History

#8  (Jon Leech, August 27, 2014)
    - Remove leftover comment saying that inapplicable attributes are
      ignored (Bug 12585).

#7  (Jon Leech, June 12, 2013)
    - Add a column to table bbb specifying which <target>s attributes are
      valid for, and a generic error if an attribute doesn't match <target>
      (Bug 10151).

#6  (Jon Leech, December 1, 2010)
    - Clarify wording of EGL_BAD_CONTEXT error.

#5  (Jon Leech, December 10, 2008)
    - Change definition of EGL_NO_IMAGE_KHR to 0 (appropriately cast)
      instead of a reference to an extern implementation-defined
      variable.

#4  (Jon Leech, November 25, 2008)
    - Simplify error conditions for eglDestroyImage.

#3  (Jon Leech, November 12, 2008)
    - Added glossary entry for Respecification, updated description of
      behavior with preserved images per suggestions from Acorn, and added
      issue 20 regarding removal of EGL_NO_DISPLAY as a valid <dpy>.

#2  (Jon Leech, October 22, 2008)
    - Change default value of EGL_IMAGE_PRESERVED_KHR to EGL_FALSE.
      Update issue 19.

#1  (Jon Leech, October 21, 2008)
    - Split abstract functionality from EGL_KHR_image into this extension,
      and merged preserved image functionality from
      EGL_SYMBIAN_image_preserved.
