Name

    NV_stream_sync

Name Strings

    EGL_NV_stream_sync

Contributors

    Acorn Pooley
    Marcus Lorentzon

Contacts

    Ian Stewart, NVIDIA  (istewart 'at' nvidia.com)

Status

    Complete

Version

    Version 6, June 5, 2012

Number

    EGL Extension #56

Dependencies

    Requires EGL 1.2.
    Requires EGL_KHR_stream extension
    Requires EGL_KHR_reusable_sync

    This extension is written based on the wording of the EGL 1.2
    specification.

Overview

    This extension defines a new type of reusable sync object.  This
    sync object will be signaled each time a new image frame becomes
    available in an EGLStream for the consumer to consume.

New functions

    EGLSyncKHR eglCreateStreamSyncNV(
        EGLDisplay   dpy,
        EGLStreamKHR stream,
        EGLenum type,
        const EGLint *attrib_list);

New Tokens

    Accepted by the <type> parameter of eglCreateSyncKHR, and returned
    in <value> when eglGetSyncAttribKHR is called with <attribute>
    EGL_SYNC_TYPE_KHR:

    EGL_SYNC_NEW_FRAME_NV                   0x321F


Add a new paragraph to section "3.8.1  Sync Objects" in the
EGL_KHR_reusable_sync extension, just before the paragraph that
mentions the eglClientWaitSyncKHR function:

    The command

        EGLSyncKHR eglCreateStreamSyncNV(
            EGLDisplay   dpy,
            EGLStreamKHR stream,
            EGLenum type,
            const EGLint *attrib_list);

    creates a sync object of the specified <type> associated with the
    specified display <dpy> and the specified EGLStream <stream>, and
    returns a handle to the new object.  <attrib_list> is an
    attribute-value list specifying other attributes of the sync
    object, terminated by an attribute entry EGL_NONE.  Attributes not
    specified in the list will be assigned their default values.  The
    state of <stream> must not be EGL_STREAM_STATE_CREATED_KHR or
    EGL_STREAM_STATE_DISCONNECTED_KHR.

    If <type> is EGL_SYNC_NEW_FRAME_NV, a stream-new-frame reusable
    sync object is created. In this case <attrib_list> must be NULL or
    empty (containing only EGL_NONE).  Attributes of the reusable
    stream-new-frame sync object are set as follows:

      Attribute Name         Initial Attribute Value(s)
      ---------------        --------------------------
      EGL_SYNC_TYPE_KHR      EGL_SYNC_NEW_FRAME_NV
      EGL_SYNC_STATUS_KHR    EGL_UNSIGNALED_KHR

    Any time the state of <stream> transitions to
    EGL_STREAM_STATE_NEW_FRAME_AVAILABLE_KHR (from any other state),
    the returned stream-new-frame reusable sync object is signaled.
    (This effectively means the sync object will become signaled
    whenever the producer inserts a new image frame into the
    EGLStream.)

    EGL does not automatically unsignal the stream-new-frame reusable
    sync object.  Generally applications will want to unsignal the
    sync object after it has been signaled so that the availability
    of the next frame can
    be detected.

    Errors
    ------

      * If <dpy> is not the name of a valid, initialized EGLDisplay,
        EGL_NO_SYNC_KHR is returned and an EGL_BAD_DISPLAY error is
        generated.
      * If <attrib_list> is neither NULL nor empty (containing only
        EGL_NONE), EGL_NO_SYNC_KHR is returned and an EGL_BAD_ATTRIBUTE
        error is generated.
      * If <stream> is not a valid EGLStream created for <dpy>,
        EGL_NO_SYNC_KHR is returned and an EGL_BAD_STREAM error is
        generated.
      * If <stream>'s state is EGL_STREAM_STATE_CREATED_KHR or
        EGL_STREAM_STATE_DISCONNECTED_KHR then EGL_NO_SYNC_KHR is
        returned and an EGL_BAD_ACCESS error is generated.
      * If a sync object of <type> has already been created for
        <stream> (and not destroyed), EGL_NO_SYNC_KHR is returned and
        an EGL_BAD_ACCESS error is generated.
      * If <type> is not a supported type of stream sync object,
        EGL_NO_SYNC_KHR is returned and an EGL_BAD_ATTRIBUTE error is
        generated.

Issues
    1.  Is this extension useful, or does the built in blocking
        behavior of the consumer described by the
        EGL_NV_stream_consumer_gltexture extension render this
        un-useful?

        RESOLVED: Yes. It is useful to have a thread waiting on the
        signal.

    2.  Does EGL automatically unsignal the sync object?

        RESOLVED: No.  After the sync object has been signaled, it is
        up to the application to unsignal it before waiting on it
        again.  It is important to check for the availability of
        another frame by querying EGL_PRODUCER_FRAME_KHR after
        unsignaling the sync object and before waiting on the sync
        object to prevent a race condition.  This can be done using
        the following code:

            void ConsumeFrames(EGLDisplay dpy, EGLStreamKHR stream)
            {
                EGLuint64KHR last_frame = 0;
                EGLuint64KHR new_frame = 0;
                EGLSyncKHR sync;
                
                sync = eglCreateStreamSyncNV(dpy, 
                                              stream, 
                                              EGL_SYNC_NEW_FRAME_NV, 
                                              0);

                for(;;) {
                    eglSignalSyncKHR(dpy, sync, EGL_UNSIGNALED_KHR);
                    eglQueryStreamu64KHR(dpy, 
                                         stream, 
                                         EGL_PRODUCER_FRAME_KHR, 
                                         &new_frame);
                    if (new_frame != last_frame) {
                        last_frame = new_frame;
                        ConsumeNewFrame(stream);
                    } else {
                        eglClientWaitSyncKHR(dpy, sync, 0, EGL_FOREVER_KHR);
                    }
                }
            }

Revision History

    #7 (July 10, 2013) Jon Leech
        - Fix spelling of 'signalled' -> 'signaled' and assign extension
          number for publication.

    #6 (June 5, 2012) Acorn Pooley
        - Add error if stream is in state EGL_STREAM_STATE_CREATED_KHR
          or EGL_STREAM_STATE_DISCONNECTED_KHR when sync is created.

    #5 (September 30, 2011) Acorn Pooley
        - Change eglCreateStreamSyncKHR to eglCreateStreamSyncNV

    #4 (September 28, 2011) Acorn Pooley
        - Add issue 2
        - Fix return type of eglCreateStreamSyncNV

    #3 (September 27, 2011) Acorn Pooley
        - Assign enum values (bug 8064)

    #2 (July 6, 2011) Acorn Pooley
        - Rename EGL_KHR_image_stream to EGL_KHR_stream

    #1  (June 30, 2011) Acorn Pooley
        - Initial draft

