Name

    KHR_cl_event2

Name Strings

    EGL_KHR_cl_event2

Contributors

    Jon Leech, Khronos
    Alon Or-bach, Samsung Electronics
    Tom Cooksey, ARM

Contact

    Jon Leech (jon 'at' alumni.caltech.edu)

IP Status

    No known claims.

Notice

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

Status

    Complete.
    Approved by the EGL Working Group on December 4, 2013.

Version

    Version 5, December 4, 2013

Number

    EGL Extension #65

Dependencies

    EGL 1.4 and the EGL_KHR_fence_sync extension are required.

    This extension is written against the language added to EGL 1.2 by
    the EGL_KHR_fence_sync extension.

    An OpenCL implementation supporting sharing OpenCL event objects
    with EGL is required.

    Khronos recommends obsoleting and replacing implementations of
    EGL_KHR_cl_event with this extension as soon as possible.

Overview

    This extension allows creating an EGL sync object linked to an OpenCL
    event object, potentially improving efficiency of sharing images between
    the two APIs. The companion cl_khr_egl_event extension provides the
    complementary functionality of creating an OpenCL event object from an
    EGL sync object.

    This extension is functionally identical to EGL_KHR_cl_event, but is
    intended to replace that extension. It exists only to address an
    implementation issue on 64-bit platforms where passing OpenCL event
    handles in an EGLint attribute list value is impossible, because the
    implementations use a 32-bit type for EGLint.

    This extension also incorporates some required functionality from the
    EGL_KHR_fence_sync extension, similarly modified for 64-bit platforms.

New Types

    /*
     * EGLAttribKHR is a integer type used to pass arrays of attribute
     * name/value pairs which may include pointer and handle attribute
     * values.
     */
    #include <khrplatform.h>
    typedef intptr_t EGLAttribKHR;

    Event handles of type cl_event, defined in the OpenCL header files, may
    be included in the attribute list passed to eglCreateSync64KHR.

New Procedures and Functions

    EGLSyncKHR eglCreateSync64KHR(
                        EGLDisplay dpy,
                        EGLenum type,
                        const EGLAttribKHR *attrib_list);

New Tokens

    Accepted as attribute names in the <attrib_list> argument
    of eglCreateSync64KHR:

        EGL_CL_EVENT_HANDLE_KHR         0x309C

    Returned in <values> for eglGetSyncAttribKHR <attribute>
    EGL_SYNC_TYPE_KHR:

        EGL_SYNC_CL_EVENT_KHR           0x30FE

    Returned in <values> for eglGetSyncAttribKHR <attribute>
    EGL_SYNC_CONDITION_KHR:

        EGL_SYNC_CL_EVENT_COMPLETE_KHR  0x30FF

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

    Modify the language in section 3.8.1 (Sync Objects) starting at the
    sixth paragraph, describing commands to create sync objects:

    "The commands

        EGLSyncKHR eglCreateSync64KHR(
                        EGLDisplay dpy,
                        EGLenum type,
                        const EGLAttribKHR *attrib_list);

    and

        EGLSyncKHR eglCreateSyncKHR(
                        EGLDisplay dpy,
                        EGLenum type,
                        const EGLint *attrib_list);

    create a sync object ...

    ... When a fence sync object is created, eglCreateSyncKHR and
    eglCreateSync64KHR also insert a fence command into... "

    Add following the eigth paragraph (the paragraph beginning "<Fence sync
    objects> are created..."):

   "A <CL event sync object> reflects the status of a corresponding OpenCL
    event object to which the sync object is linked. This provides another
    method of coordinating sharing of images between EGL and OpenCL (see
    Chapter 9 of the OpenCL 1.0 Specification and the cl_khr_egl_sharing
    extension). Waiting on such a sync object is equivalent to waiting for
    completion of the linked CL event object.

    CL event sync objects may only be created using the command
    eglCreateSync64KHR, because they require an attribute which may not be
    representable in the attrib_list argument of eglCreateSyncKHR."

    Add following the description of fence sync objects (prior to the
    "Errors" section for eglCreateSyncKHR):

   "If <type> is EGL_SYNC_CL_EVENT_KHR, a CL event sync object is
    created. In this case <attrib_list> must contain the attribute
    EGL_CL_EVENT_HANDLE_KHR, set to a valid OpenCL event. Note that
    EGL_CL_EVENT_HANDLE_KHR is not a queriable property of a sync
    object. Attributes of the CL event sync objects are set as follows:

        Attribute Name          Initial Attribute Value(s)
        -------------           --------------------------
        EGL_SYNC_TYPE_KHR       EGL_SYNC_CL_EVENT_KHR
        EGL_SYNC_STATUS_KHR     Depends on status of <event>
        EGL_SYNC_CONDITION_KHR  EGL_SYNC_CL_EVENT_COMPLETE_KHR

    The status of such a sync object depends on <event>. When the status
    of <event> is CL_QUEUED, CL_SUBMITTED, or CL_RUNNING, the status of
    the linked sync object will be EGL_UNSIGNALED_KHR. When the status
    of <event> changes to CL_COMPLETE, the status of the linked sync
    object will become EGL_SIGNALED_KHR.

    Creating a linked sync object places a reference on the linked
    OpenCL event object. When the sync object is deleted, the reference
    will be removed from the event object.

    However, implementations are not required to validate the OpenCL
    event, and passing an invalid event handle in <attrib_list> may
    result in undefined behavior up to and including program
    termination."

    The command eglCreateSync64KHR must be used to create a CL event sync
    object[fn1].

    [fn1] If the implementation also supports the older EGL_KHR_cl_event
          extension, then eglCreateSyncKHR may also be used to create a CL
          event sync object. However, this use is not recommended because it
          is not portable to platforms where OpenCL event handles are larger
          than 32 bits."

    Modify the ninth and tenth paragraphs, starting "When the condition":

    "When the condition of the sync object is satisfied, the sync is
    signaled by the associated client API context, causing any
    eglClientWaitSyncKHR commands (see below) blocking on <sync> to unblock.

    The only condition supported for fence sync objects is
    EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR, which is satisfied by completion
    of the fence command corresponding to the sync object, and all preceding
    commands in the associated client API context's command stream. The sync
    object will not be signaled until all effects from these commands on the
    client API's internal and framebuffer state are fully realized. No other
    state is affected by execution of the fence command.

    Each client API which supports fence commands indicates this support
    in the form of a client API extension. If the GL_OES_EGL_sync
    extension is supported by OpenGL ES (either version 1.x or 2.0), a
    fence sync object may be created when the currently bound API is
    OpenGL ES. If the VG_KHR_EGL_sync extension is supported by OpenVG,
    a fence sync object may be created when the currently bound API is
    OpenVG.

    The only condition supported for CL event sync objects is
    EGL_SYNC_CL_EVENT_COMPLETE_KHR, which is satisfied when the status of
    the OpenCL event associated with the sync object changes to CL_COMPLETE."

    Add to the "Errors" section for eglCreateSyncKHR and eglCreateSync64KHR:

   "* If <type> is EGL_SYNC_CL_EVENT_KHR then

    ** If eglCreateSyncKHR was called, then EGL_NO_SYNC_KHR is returned and
       an EGL_BAD_ATTRIBUTE error is generated.

    ** If eglCreateSync64KHR was called and EGL_CL_EVENT_HANDLE_KHR is not
       specified in <attrib_list>, or its attribute value is not a valid
       OpenCL event handle returned by a call to clEnqueueReleaseGLObjects
       or clEnqueueReleaseEGLObjects, then EGL_NO_SYNC_KHR is returned and
       an EGL_BAD_ATTRIBUTE error is generated."

    Replace the EGL_SYNC_CONDITION_KHR row of table 3.cc with:

   "Attribute              Description                Supported Sync Objects
    -----------------      -----------------------    ----------------------
    EGL_SYNC_CONDITION_KHR Signaling condition        EGL_SYNC_FENCE_KHR or
                                                      EGL_SYNC_CL_EVENT_KHR

    Table 3.cc  Attributes Accepted by eglGetSyncAttribKHR Command"


    Replace the second paragraph describing eglDestroySync with:

   "If any eglClientWaitSyncKHR commands are blocking on <sync> when
    eglDestroySyncKHR is called, <sync> is flagged for deletion and will
    be deleted when the associated fence command or CL event object has
    completed, and <sync> is no longer blocking any eglClientWaitSyncKHR
    command. Otherwise, the sync object is destroyed immediately."

Sample Code

    None

Conformance Tests

    None yet

Issues

    Note that some issues from the EGL_KHR_cl_event and EGL_KHR_fence_sync
    extensions also apply to this extension, which incorporates
    functionality from both of those extensions while making it usable on a
    64-bit architecture. Issues specific to this extension are below.

    1) Why does this extension exist?

    The existence of this extension is an unfortunate necessity. Khronos did
    not define EGLint as a 64-bit type in the version of <khrplatform.h> we
    provided, assuming that vendors on those platforms would do so. By the
    time we discovered that not all vendors had done this, it was too late
    to fix, because ABI considerations made it impossible for those vendors
    to change to a 64-bit EGLint type. Our only option was to define new
    extensions and commands using a new attribute type, EGLAttribKHR, which
    is explicitly large enough to hold a pointer or handle.

    2) What is the relationship of this extension to EGL_KHR_cl_event?

    RESOLVED: The only functional difference is that the new
    eglCreateSync64KHR command must be used to create CL event sync objects.
    This is necessary because some 64-bit platforms define EGLint as a
    32-bit type, making it impossible to pass an arbitrary OpenCL event
    handle in the EGLint *attrib_list passed to eglCreateSyncKHR.

    3) How are pointer- and handle-sized attributes represented?

    RESOLVED: Using the new type EGLAttribKHR, which is explicitly defined
    as an integer type large enough to hold a pointer.

    EGLAttribKHR is defined as an alias of the ISO C intptr_t type, rather
    than using one of the explicitly-sized types from khrplatform.h.
    Requiring this means that khrplatform.h must make sure to include the
    appropriate header file (probably <stdint.h>) and that a C compiler
    supporting intptr_t must be used. In the past we were concerned about
    older C/C++ compilers, but this seems an acceptable choice in 2013.

    We could choose to use intptr_t as the base type of attribute lists,
    instead of the EGLAttribKHR alias. As Ian Romanick has pointed out
    passionately in ARB discussions, modern C compilers are required to
    support a well-defined set of scalar types. There is no requirement to
    use API-specific scalar types when explicitly defining a C API.

    However, there is some value in semantically tagging parameters with EGL
    types. Also, using 'intptr_t *attrib_list' would be cosmetically
    objectionable due to mixing EGL* and C native scalar types in EGL APIs.

    We probably want to wait until there's an EGL API compatibility break -
    a hypothetical "EGL 2.0" - before moving to native ISO C types in our
    interfaces.

    4) Why is the new fence sync creation function defined here, instead of
    in a separate EGL_KHR_fence_sync2 extension?

    RESOLVED: eglCreateSync64KHR is defined here because this is the only
    functionality requiring it, and we expect this extension to be a stopgap
    for 64-bit platforms until the time that EGL 1.5 is defined. The EGL 1.5
    core will presumably include only the EGLAttribKHR-based version of this
    command.

    If there are any new extensions using handle or pointer attributes in
    the meantime, they should copy the EGLAttribKHR and eglCreateSync64KHR
    language here as required. There is no harm in defining the same type or
    command in multiple extensions, so long as the definitions are
    compatible.

    5) Why is the new command called eglCreateSync64KHR?

    UNRESOLVED: For consistency with OpenGL, which has '64'-suffixed
    commands for representing 64-bit integers and arbitrary offsets into GPU
    memory. If we ever support EGL on 128-bit platforms this would be a
    silly naming convention, but that time is probably many decades away and
    by then EGL 1.5 should be defined and widely supported. The name
    eglCreateSync2KHR was originally suggested.

    6) Why is there no command for querying EGLAttribKHR attributes from
    sync objects?

    RESOLVED: Because the only sync attribute which requires the extra bits
    in an EGLAttribKHR type is EGL_CL_EVENT_HANDLE_KHR, which is not
    queryable. Sync attributes which are queryable will all fit into the
    EGLint returned by eglGetSyncAttribKHR.

    NOTE: It's unfortunate that this name is used, since it uses the
    "AttribKHR" name for command returning EGLints. In EGL 1.5 we should use
    a different name for the query.

    7) Does this extension replace EGL_KHR_fence_sync and EGL_KHR_cl_event?

    RESOLVED: It does not replace EGL_KHR_fence_sync, but extends it to
    support creation of a new type of sync object, the CL event sync object.

    RESOLVED: It is intended to replace EGL_KHR_cl_event; this extension
    must be used for OpenCL interop on 64-bit platforms, and we hope all
    vendors will implement it even on 32-bit platforms, for maximum code
    portability.

Revision History

    Version 5, 20130/12/04 (Jon Leech) - minor cleanup for public release.

    Version 4, 20130/10/16 (Jon Leech) - add Dependencies and Overview text
    noting that this extension obsoletes and should replace
    EGL_KHR_cl_event.

    Version 3, 20130/10/15 (Jon Leech) - change type of EGLAttribKHR from
    uintptr to intptr (Bug 11027).

    Version 2, 20130/10/12 (Jon Leech) - merge EGL_KHR_fence_sync2 with this
    extension, change the naming scheme, define EGLAttribKHR as uintptr_t,
    and add a new issues list.

    Version 1, 2010/10/02 (Tom Cooksey) - initial version based on
    EGL_KHR_cl_event and adding 64-bit EGLAttrKHR variants.
