Name

    NV_cuda_event

Name Strings

    EGL_NV_cuda_event

Contributors

    Debalina Bhattacharjee
    Michael Chock
    James Jones
    Daniel Kartch

Contact

    Michael Chock (mchock 'at' nvidia.com)

Status

    Complete

Version

    Version 2, June 28, 2018

Number

    EGL Extension #75

Extension Type

    EGL display extension

Dependencies

    This extension is written against the language of EGL 1.5 and the
    EGL_EXT_sync_reuse extension.

    Either EGL_KHR_fence_sync and the EGLAttrib type or EGL 1.5 are
    required.

    This extension interacts with, but does not require,
    EGL_EXT_sync_reuse.

    This extension interacts with EGL_NV_device_cuda.

Overview

    This extension allows creating an EGL sync object linked to a CUDA
    event object, potentially improving efficiency of sharing images and
    compute results between the two APIs.

IP Status

    No known claims.

New Types

    A pointer to type cudaEvent_t, defined in the CUDA header files, may
    be included in the attribute list passed to eglCreateSync.

New Procedures and Functions

    None.

New Tokens

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

        EGL_CUDA_EVENT_HANDLE_NV        0x323B

    Returned in <values> for eglGetSyncAttrib <attribute>
    EGL_SYNC_TYPE:

        EGL_SYNC_CUDA_EVENT_NV          0x323C

    Returned in <values> for eglGetSyncAttrib <attribute>
    EGL_SYNC_CONDITION:

        EGL_SYNC_CUDA_EVENT_COMPLETE_NV 0x323D

Add to section 3.8.1 (Sync Objects) of the EGL 1.5 specification, after
the sixth paragraph:

    Likewise, a <CUDA event sync object> reflects the status of a
    corresponding CUDA object. Waiting on this type of sync object is
    equivalent to waiting for completion of the corresponding linked
    CUDA event object.

Add a new section following section 3.8.1.2 (Creating and Signaling
OpenCL Event Sync Objects):

    Section 3.8.1.X Creating and Signaling CUDA Event Sync Objects

    If <type> is EGL_SYNC_CUDA_EVENT_NV, a CUDA event sync object is
    created. The <attrib_list> may contain the attribute
    EGL_CUDA_EVENT_HANDLE_NV, set to a pointer to a cudaEvent_t object.
    If it does not contain this attribute, the sync object will start in
    the signaled state, and an event attribute must be provided the
    first time eglUnsignalSyncEXT is called. Otherwise, a call to
    eglUnsignalSyncEXT may replace this event attribute or leave it
    unspecified, causing the previous object to be reused.

    A cudaEvent_t object provided to eglCreateSync or eglUnsignalSyncEXT
    must be properly initialized and recorded by the CUDA API (using
    cudaEventCreate and cudaEventRecord), and the CUDA device
    used to create the event must correspond to <dpy>[fn1]. Note that
    EGL_CUDA_EVENT_HANDLE_NV is not a queryable property of a sync
    object.

    [fn1] If EGL_NV_device_cuda is supported, it is sufficient that the
          CUDA device used to create the CUDA event matches the
          EGL_CUDA_DEVICE_NV attribute of <dpy>'s underlying EGL
          device.

    Attributes of the CUDA event sync object are set as follows:

        Attribute Name          Initial Attribute Value(s)
        -------------           --------------------------
        EGL_SYNC_TYPE           EGL_SYNC_CUDA_EVENT_NV
        EGL_SYNC_STATUS         Depends on status of <event>
        EGL_SYNC_CONDITION      EGL_SYNC_CUDA_EVENT_COMPLETE_NV

    If an <event> is linked to the sync object, the status of this type
    of sync object depends on the state of <event> evaluated at the time
    of the most recent call to eglCreateSync or eglUnsignalSyncEXT. If
    all device work preceding the most recent call to cudaEventRecord on
    the event has not yet completed, the status of the linked sync
    object will be EGL_UNSIGNALED. If all such work has completed, the
    status of the linked sync object will be EGL_SIGNALED. Calling
    cudaEventRecord to modify an event has no effect on the sync object
    while its status is EGL_UNSIGNALED, but will have an effect if the
    event is reevaluated at a subsequent eglUnsignalSyncEXT call.

    The only condition supported for CUDA event sync objects is
    EGL_SYNC_CUDA_EVENT_COMPLETE_NV. It is satisfied when all device
    work prior to the most recent call to cudaEventRecord at sync
    unsignaling time has completed.

If EGL_EXT_sync_reuse is not present, then change the second sentence of
3.8.1.X above to "The <attrib_list> must contain ..." and omit the
remaining sentences in the paragraph. Omit all references to
eglUnsignalSyncEXT.

In 3.8.1 (Sync Objects), if EGL_EXT_sync_reuse is present, then add the
following to the error list for eglUnsignalSyncEXT. Otherwise add it to
the error list for eglCreateSync:

    If <type> is EGL_SYNC_CUDA_EVENT_NV and a EGL_CUDA_EVENT_HANDLE_NV
    is not linked to the sync object, then an EGL_BAD_ATTRIBUTE error is
    generated. If its attribute value is not a valid CUDA event pointer
    or has not been initialized as described above, then
    EGL_BAD_ATTRIBUTE may be generated, but the results are undefined
    and may include program termination.

Modify the third paragraph of section 3.8.1.4 (Querying Sync Object
Attributes):

    If any eglClientWaitSync or eglWaitSync commands are blocking on
    <sync> when eglDestroySync is called, <sync> is flagged for deletion
    and will be deleted when the associated fence command, OpenCL event
    object, or CUDA event object has completed, and <sync> is no longer
    blocking any such egl*WaitSync command. Otherwise, the sync object
    is destroyed immediately.

Replace the EGL_SYNC_CONDITION row of table 3.9 with:

    Attribute           Description              Supported Sync Objects
    ------------------  -----------------------  ----------------------
    EGL_SYNC_CONDITION  Signaling condition      EGL_SYNC_FENCE,
                                                 EGL_SYNC_CL_EVENT, or
                                                 EGL_SYNC_CUDA_EVENT_NV

    Table 3.9  Attributes Accepted by eglGetSyncAttrib


Interactions with EGL versions prior to 1.5

    This extension may be used with earlier versions of EGL, provided
    that the EGL_KHR_fence_sync extension is supported. In this case,
    replace all references to sync functions and tokens with
    corresponding KHR-suffixed versions (e.g., replace eglCreateSync
    with eglCreateSyncKHR).

    Additionally, this extension may be used with the 64-bit types and
    functions added to EGL_KHR_fence_sync introduced by
    EGL_KHR_cl_event2 (EGLAttribKHR and eglCreateSync64KHR). Support
    for OpenCL events is not required.

Issues

    None

Revision History

    Version 2, 2018/06/28 (Daniel Kartch)
        - Rewritten to clearly define interactions with
          EGL_EXT_sync_reuse, without requiring it
        - Fixed incorrect CUDA function name
        - Fixed table spacing

    Version 1, 2014/06/20 (Michael Chock)
        - initial version.
