Name

    ANGLE_iosurface_client_buffer

Name Strings

    EGL_ANGLE_iosurface_client_buffer

Contributors

    Corentin Wallez
    Geoff Lang

Contacts

    Corentin Wallez, Google Inc. (cwallez 'at' google.com)

Status

    Draft

Version

    Version 1, Dec 6, 2017

Number

    EGL Extension #??

Dependencies

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

Overview

    This extension allows creating EGL surfaces from IOSurface objects.

New Types

    None

New Procedures and Functions

    None

New Tokens

    Accepted in the <buftype> parameter of eglCreatePbufferFromClientBuffer:

        EGL_IOSURFACE_ANGLE            0x3454
        EGL_IOSURFACE_PLANE_ANGLE      0x345A
        EGL_TEXTURE_RECTANGLE_ANGLE    0x345B
        EGL_TEXTURE_TYPE_ANGLE         0x345C
        EGL_TEXTURE_INTERNAL_FORMAT_ANGLE 0x345D

Additions to Chapter 3 of the EGL 1.4 Specification (EGL Functions and Errors)

    Replace the last sentence of paragraph 1 of Section 3.5.3 with the
    following text.
    "Currently, the only client API resources which may be bound in this
    fashion are OpenVG VGImage objects and IOSurface objects."

    Replace the third paragraph of Section 3.5.3 with the following text.
    "<buftype> specifies the type of buffer to be bound. The only allowed values
    of <buftype> are EGL_OPENVG_IMAGE and EGL_IOSURFACE_ANGLE".

    Append the following text to the fourth paragraph of Section 3.5.3.
    "When <buftype> is EGL_IOSURFACE_ANGLE, <buffer> must be a valid IOSurface
    object case into the type EGLClientBuffer."

    Append to the end of Section 3.5.3.
    "When <buftype> is EGL_IOSURFACE_ANGLE, <attrib_list> must contain all the
    following attributes under the following constraints otherwise
    EGL_BAD_PARAMETER is generated:
      - EGL_TEXTURE_FORMAT, EGL_TEXTURE_TYPE_ANGLE, and
    EGL_TEXTURE_INTERNAL_FORMAT_ANGLE followed by OpenGL enums for texture
    formats, texture types, and texture internal format respectively.
      - EGL_WIDTH with a value between 1 and the width of <buffer>.
      - EGL_HEIGHT with a value between 1 and the width of <buffer>.
      - EGL_TEXTURE_TARGET with a value of EGL_TEXTURE_RECTANGLE_ANGLE
      - EGL_IOSURFACE_PLANE_ANGLE with a value between 0 and the number of
    planes of <buffer> (exclusive).

    In addition the EGL_TEXTURE_FORMAT, EGL_TEXTURE_TYPE_ANGLE and
    EGL_TEXTURE_INTERNAL_FORMAT_ANGLE attributes must be one of the
    combinations listed in table egl.iosurface.formats or an
    EGL_BAD_PARAMETER is generated. The combination must also be a valid
    combinations for glTexImage2D or EGL_BAD_PARAMETER is generated."

    ---------------------------------------------------------------------------
    Texture Format    Texture Type                    Texture Internal Format
    ---------------------------------------------------------------------------
    GL_RED            GL_UNSIGNED_BYTE                GL_RED
    GL_RED            GL_UNSIGNED_SHORT               GL_R16UI
    GL_RG             GL_UNSIGNED_BYTE                GL_RG
    GL_BGRA           GL_UNSIGNED_INT_8_8_8_8_REV     GL_RGBA
    GL_BGRA           GL_UNSIGNED_INT_8_8_8_8_REV     GL_RGBA
    GL_BGRA           GL_UNSIGNED_INT_8_8_8_8_REV     GL_RGBA
    GL_RGBA           GL_HALF_FLOAT                   GL_RGBA
    ---------------------------------------------------------------------------
    Table egl.iosurface.formats - Valid combinations of format, type and
    internal format for IOSurface-backed pbuffers.
    ---------------------------------------------------------------------------

    Append to the end of Section 3.5.3.
    "When a pbuffer is created with type EGL_IOSURFACE_ANGLE, the contents
    of the associcated IOSurface object are undefined while the pbuffer is
    bound to a client texture."

    Append to the list of errors generated by eglMakeCurrent in Section 3.7.3:
    "  - If either draw or read are pbuffers created with
    eglCreatePbufferFromClientBuffer with <buftype> set to EGL_IOSURFACE_ANGLE,
    an EGL_BAD_SURFACE is generated."

Issues

    There are no issues, please move on.

Revision History

    Version 1, 2017/12/06 - first draft.
