Name

    ANDROID_create_native_client_buffer

Name Strings

    EGL_ANDROID_create_native_client_buffer

Contributors

    Craig Donner

Contact

    Craig Donner, Google Inc. (cdonner 'at' google.com)

Status

    Draft

Version

    Version 1, January 19, 2016

Number

    EGL Extension #XXX

Dependencies

    Requires EGL 1.2.

    EGL_ANDROID_image_native_buffer and EGL_KHR_image_base are required.

    This extension is written against the wording of the EGL 1.2
    Specification as modified by EGL_KHR_image_base and
    EGL_ANDROID_image_native_buffer.

Overview

    This extension allows creating an EGLClientBuffer backed by an Android
    window buffer (struct ANativeWindowBuffer) which can be later used to
    create an EGLImage.

New Types

    None.

New Procedures and Functions

EGLClientBuffer eglCreateNativeClientBufferANDROID(
                        const EGLint *attrib_list)

New Tokens

    EGL_NATIVE_BUFFER_USAGE_ANDROID 0x3143
    EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID 0x00000001
    EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID 0x00000002
    EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID 0x00000004

Changes to Chapter 3 of the EGL 1.2 Specification (EGL Functions and Errors)

    Add the following to section 2.5.1 "EGLImage Specification" (as modified by
    the EGL_KHR_image_base and EGL_ANDROID_image_native_buffer specifications),
    below the description of eglCreateImageKHR:

   "The command

        EGLClientBuffer eglCreateNativeClientBufferANDROID(
                                const EGLint *attrib_list)

    may be used to create an EGLClientBuffer backed by an ANativeWindowBuffer
    struct. EGL implementations must guarantee that the lifetime of the
    returned EGLClientBuffer is at least as long as the EGLImage(s) it is bound
    to, following the lifetime semantics described below in section 2.5.2; the
    EGLClientBuffer must be destroyed no earlier than when all of its associated
    EGLImages are destroyed by eglDestroyImageKHR. <attrib_list> is a list of
    attribute-value pairs which is used to specify the dimensions, format, and
    usage of the underlying buffer structure. If <attrib_list> is non-NULL, the
    last attribute specified in the list must be EGL_NONE.

    Attribute names accepted in <attrib_list> are shown in Table aaa,
    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          | Default Value |
      |                                 |                      |               |
      +---------------------------------+----------------------+---------------+
      | EGL_NONE                        | Marks the end of the | N/A           |
      |                                 | attribute-value list |               |
      | EGL_WIDTH                       | The width of the     | 0             |
      |                                 | buffer data          |               |
      | EGL_HEIGHT                      | The height of the    | 0             |
      |                                 | buffer data          |               |
      | EGL_RED_SIZE                    | The bits of Red in   | 0             |
      |                                 | the color buffer     |               |
      | EGL_GREEN_SIZE                  | The bits of Green in | 0             |
      |                                 | the color buffer     |               |
      | EGL_BLUE_SIZE                   | The bits of Blue in  | 0             |
      |                                 | the color buffer     |               |
      | EGL_ALPHA_SIZE                  | The bits of Alpha in | 0             |
      |                                 | the color buffer     |               |
      |                                 | buffer data          |               |
      | EGL_NATIVE_BUFFER_USAGE_ANDROID | The usage bits of    | 0             |
      |                                 | the buffer data      |               |
      +---------------------------------+----------------------+---------------+
       Table aaa.  Legal attributes for eglCreateNativeClientBufferANDROID
       <attrib_list> parameter.

    The maximum width and height may depend on the amount of available memory,
    which may also depend on the format and usage flags. The values of
    EGL_RED_SIZE, EGL_GREEN_SIZE, and EGL_BLUE_SIZE must be non-zero and
    correspond to a valid pixel format for the implementation. If EGL_ALPHA_SIZE
    is non-zero then the combination of all four sizes must correspond to a
    valid pixel format for the implementation. The
    EGL_NATIVE_BUFFER_USAGE_ANDROID flag may include any of the following bits:

        EGL_NATIVE_BUFFER_USAGE_PROTECTED_BIT_ANDROID: Indicates that the
        created buffer must have a hardware-protected path to external display
        sink. If a hardware-protected path is not available, then either don't
        composite only this buffer (preferred) to the external sink, or (less
        desirable) do not route the entire composition to the external sink.

        EGL_NATIVE_BUFFER_USAGE_RENDERBUFFER_BIT_ANDROID: The buffer will be
        used to create a color-renderable texture.

        EGL_NATIVE_BUFFER_USAGE_TEXTURE_BIT_ANDROID: The buffer will be used to
        create a filterable texture.

    Errors

        If eglCreateNativeClientBufferANDROID fails, NULL will be returned, no
        memory will be allocated, and one of the following errors will be
        generated:

       * If the value of EGL_WIDTH or EGL_HEIGHT is not positive, the error
         EGL_BAD_PARAMETER is generated.

       * If the combination of the values of EGL_RED_SIZE, EGL_GREEN_SIZE,
         EGL_BLUE_SIZE, and EGL_ALPHA_SIZE is not a valid pixel format for the
         EGL implementation, the error EGL_BAD_PARAMETER is generated.

       * If the value of EGL_NATIVE_BUFFER_ANDROID is not a valid combination
         of gralloc usage flags for the EGL implementation, or is incompatible
         with the value of EGL_FORMAT, the error EGL_BAD_PARAMETER is
         Generated.

Issues

    1. Should this extension define what combinations of formats and usage flags
    EGL implementations are required to support?

    RESOLVED: Partially.

    The set of valid color combinations is implementation-specific and may
    depend on additional EGL extensions, but generally RGB565 and RGBA888 should
    be supported. The particular valid combinations for a given Android version
    and implementation should be documented by that version.

    2. Should there be an eglDestroyNativeClientBufferANDROID to destroy the
    client buffers created by this extension?

    RESOLVED: No.

    A destroy function would add several complications:

        a) ANativeWindowBuffer is a reference counted object, may be used
           outside of EGL.
        b) The same buffer may back multiple EGLImages, though this usage may
           result in undefined behavior.
        c) The interactions between the lifetimes of EGLImages and their
           EGLClientBuffers would become needlessly complex.

    Because ANativeWindowBuffer is a reference counted object, implementations
    of this extension should ensure the buffer has a lifetime at least as long
    as a generated EGLImage (via EGL_ANDROID_image_native_buffer). The simplest
    method is to increment the reference count of the buffer in
    eglCreateImagKHR, and then decrement it in eglDestroyImageKHR. This should
    ensure proper lifetime semantics.

Revision History

#2 (Craig Donner, April 15, 2016)
    - Set color formats and usage bits explicitly using additional attributes,
    and add value for new token EGL_NATIVE_BUFFER_USAGE_ANDROID.

#1 (Craig Donner, January 19, 2016)
    - Initial draft.
