Name

    EXT_client_sync

Name Strings

    EGL_EXT_client_sync

Contributors

    Daniel Kartch

Contacts

    Daniel Kartch, NVIDIA Corporation (dkartch 'at' nvidia.com)

Status

    Complete

Version

    Version 2, April 20, 2018

Number

    EGL Extension #129

Extension type

    EGL display extension

Dependencies

    Requires EGL_EXT_sync_reuse

Overview

    The EGL_KHR_reusable_sync extension defines an EGL_SYNC_REUSABLE_KHR
    EGLSync type which is signaled and unsignaled by client events. The
    EGL_EXT_sync_reuse extension allows all EGLSyncs to become reusable.
    The signaling behavior associated with EGL_SYNC_REUSABLE_KHR is
    still desirable, but the name becomes misleading if all EGLSyncs can
    be reused. This extension defines an EGLSync type with equivalent
    behavior, separating the signaling mechanism from the reusability.

New Procedures and Functions

    EGLBoolean eglClientSignalSyncEXT(
                        EGLDisplay dpy,
                        EGLSync sync,
                        const EGLAttrib *attrib_list);

New Types

    None

New Tokens

    Accepted by the <type> parameter of eglCreateSync, and returned
    in <value> when eglGetSyncAttrib is called with <attribute>
    EGL_SYNC_TYPE:

    EGL_SYNC_CLIENT_EXT                   0x3364

    Returned in <value> when eglGetSyncAttrib is called with attribute
    EGL_SYNC_CONDITION:

    EGL_SYNC_CLIENT_SIGNAL_EXT            0x3365

Add to the list of sync object decriptions in 3.8.1 Sync Objects

    A <client sync object> reflects the readiness of some client-side
    state. Sync objects of this type are not visible to API contexts and
    may not be used with eglWaitSync. They may be waited for with
    eglClientWaitSync or polled with eglGetSyncAttrib as other sync
    types.

Add to the end of 3.8.1 Sync Objects

    The command

        EGLBoolean eglClientSignalSyncEXT(EGLDisplay dpy, EGLSync sync,
            const EGLAttrib *attrib_list);

    may be called to switch sync objects which support it to the
    signaled state. Currently only sync objects with type
    EGL_SYNC_CLIENT_EXT provide this support. The attribute list may be
    used to provide additional information to the signaling operation,
    as defined for the sync type.

    Errors

        eglClientSignalSyncEXT returns EGL_FALSE on failure, and has no
        effect on <sync>.
        If <dpy> is not the name of a valid, initialized EGLDisplay, an
        EGL_BAD_DISPLAY error is generated.
        If <sync> is not a valid sync object associated with <dpy>, an
        EGL_BAD_PARAMETER error is generated.
        If <attrib_list> contains an attribute name not defined for the
        type of <sync>, an EGL_BAD_ATTRIBUTE error is generated.
        If <sync>'s type does not support this direct signaling, an
        EGL_BAD_ACCESS error is generated.

Insert new subsection in 3.8.1 Sync Objects

    3.8.1.x Creating and Signaling Client Sync Objects

    If type is EGL_SYNC_CLIENT_EXT, a client sync object is created. The
    EGL_SYNC_STATUS attribute may be specified as either EGL_UNSIGNALED
    or EGL_SIGNALED, and will default to EGL_UNSIGNALED. No other
    attributes may be specified for a client sync object. The value of
    EGL_SYNC_CONDITION will be set to EGL_SYNC_CLIENT_SIGNAL_EXT.

    A client sync object in the unsignaled state will switch to the
    signaled state when eglClientSignalSyncEXT is called. No attributes
    are supported for signaling a sync object of this type. Signaling a
    client sync object which is already in the signaled state will have
    no effect.

    A client sync object which is in the signaled state may be switched
    back to the unsignaled state with eglUnsignalSyncEXT. No attributes
    are supported for unsignaling a sync object of this type.

Add to the error list for eglWaitSync in 3.8.1.3 Waiting for Sync
Objects

    If <sync> is of type EGL_SYNC_CLIENT_EXT, an EGL_BAD_ACCESS error is
    generated.

Issues

    None

Revision History

    #2 (April 20, 2018) Daniel Kartch
       - Renamed to EXT
       - Fixed missing attrib_list in New Functions section
       - Eliminated condition as an allowed attribute at creation. This
         is inconsistent with other sync extensions, and there is no
         need to make it configurable at this time. Future extensions
         can make the condition configurable if desired.

    #1 (Feburary 22, 2018) Daniel Kartch
       - Initial draft as XXX
