Name

    ANDROID_native_fence_sync

Name Strings

    EGL_ANDROID_native_fence_sync

Contributors

    Jamie Gennis

Contact

    Jamie Gennis, Google Inc. (jgennis 'at' google.com)

Status

    Draft.

Version

    Version 3, September 4, 2012

Number

    EGL Extension #XXX

Dependencies

    Requires EGL 1.1

    This extension is written against the wording of the EGL 1.2 Specification

    EGL_KHR_fence_sync is required.

Overview

    This extension enables the creation of EGL fence sync objects that are
    associated with a native synchronization fence object that is referenced
    using a file descriptor.  These EGL fence sync objects have nearly
    identical semantics to those defined by the KHR_fence_sync extension,
    except that they have an additional attribute storing the file descriptor
    referring to the native fence object.

    This extension assumes the existence of a native fence synchronization
    object that behaves similarly to an EGL fence sync object.  These native
    objects must have a signal status like that of an EGLSyncKHR object that
    indicates whether the fence has ever been signaled.  Once signaled the
    native object's signal status may not change again.

New Types

    None.

New Procedures and Functions

    EGLint eglDupNativeFenceFDANDROID(
                        EGLDisplay dpy,
                        EGLSyncKHR);

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_NATIVE_FENCE_ANDROID          0x3144

    Accepted by the <attrib_list> parameter of eglCreateSyncKHR:

    EGL_SYNC_NATIVE_FENCE_FD_ANDROID       0x3145

    Accepted by the <attrib_list> parameter of eglCreateSyncKHR, and returned
    by eglDupNativeFenceFDANDROID in the event of an error:

    EGL_NO_NATIVE_FENCE_FD_ANDROID         -1

    Returned in <value> when eglGetSyncAttribKHR is called with <attribute>
    EGL_SYNC_CONDITION_KHR:

    EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID 0x3146

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

    Add the following after the sixth paragraph of Section 3.8.1 (Sync
    Objects), added by KHR_fence_sync

    "If <type> is EGL_SYNC_NATIVE_FENCE_ANDROID, an EGL native fence sync
    object is created. In this case the EGL_SYNC_NATIVE_FENCE_FD_ANDROID
    attribute may optionally be specified. If this attribute is specified, it
    must be set to either a file descriptor that refers to a native fence
    object or to the value EGL_NO_NATIVE_FENCE_FD_ANDROID.

    The default values for the EGL native fence sync object attributes are as
    follows:

      Attribute Name                     Initial Attribute Value(s)
      ---------------                    --------------------------
      EGL_SYNC_TYPE_KHR                  EGL_SYNC_NATIVE_FENCE_ANDROID
      EGL_SYNC_STATUS_KHR                EGL_UNSIGNALED_KHR
      EGL_SYNC_CONDITION_KHR             EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR
      EGL_SYNC_NATIVE_FENCE_FD_ANDROID   EGL_NO_NATIVE_FENCE_FD_ANDROID

    If the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute is not
    EGL_NO_NATIVE_FENCE_FD_ANDROID then the EGL_SYNC_CONDITION_KHR attribute is
    set to EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID and the EGL_SYNC_STATUS_KHR
    attribute is set to reflect the signal status of the native fence object.
    Additionally, the EGL implementation assumes ownership of the file
    descriptor, so the caller must not use it after calling eglCreateSyncKHR."

    Modify Section 3.8.1 (Sync Objects), added by KHR_fence_sync, starting at
    the seventh paragraph

    "When a fence sync object is created or when an EGL native fence sync
    object is created with the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute set
    to EGL_NO_NATIVE_FENCE_FD_ANDROID, eglCreateSyncKHR also inserts a fence
    command into the command stream of the bound client API's current context
    (i.e., the context returned by eglGetCurrentContext), and associates it
    with the newly created sync object.

    After associating the fence command with an EGL native fence sync object,
    the next Flush() operation performed by the current client API causes a
    new native fence object to be created, and the
    EGL_SYNC_NATIVE_FENCE_ANDROID attribute of the EGL native fence object is
    set to a file descriptor that refers to the new native fence object. This
    new native fence object is signaled when the EGL native fence sync object
    is signaled.

    When the condition of the sync object is satisfied by the fence command,
    the sync is signaled by the associated client API context, causing any
    eglClientWaitSyncKHR commands (see below) blocking on <sync> to unblock.
    If the sync object is an EGL native fence sync object then the native
    fence object is also signaled when the condition is satisfied. The
    EGL_SYNC_PRIOR_COMMANDS_COMPLETE_KHR condition 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.

    The EGL_SYNC_NATIVE_FENCE_SIGNALED_ANDROID condition is satisfied by the
    signaling of the native fence object referred to by the
    EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute. When this happens any
    eglClientWaitSyncKHR commands blocking on <sync> unblock."

    Modify the list of eglCreateSyncKHR errors in Section 3.8.1 (Sync Objects),
    added by KHR_fence_sync

    "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 <type> is EGL_SYNC_FENCE_KHR and <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 <type> is EGL_SYNC_NATIVE_FENCE_ANDROID and <attrib_list> contains
        an attribute other than EGL_SYNC_NATIVE_FENCE_FD_ANDROID,
        EGL_NO_SYNC_KHR is returned and an EGL_BAD_ATTRIBUTE error is
        generated.
      * If <type> is not a supported type of sync object,
        EGL_NO_SYNC_KHR is returned and an EGL_BAD_ATTRIBUTE error is
        generated.
      * If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_NATIVE_FENCE_ANDROID and
        no context is current for the bound API (i.e., eglGetCurrentContext
        returns EGL_NO_CONTEXT), EGL_NO_SYNC_KHR is returned and an
        EGL_BAD_MATCH error is generated.
      * If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_NATIVE_FENCE_ANDROID and
        <dpy> does not match the EGLDisplay of the currently bound context for
        the currently bound client API (the EGLDisplay returned by
        eglGetCurrentDisplay()) then EGL_NO_SYNC_KHR is returned and an
        EGL_BAD_MATCH error is generated.
      * If <type> is EGL_SYNC_FENCE_KHR or EGL_SYNC_NATIVE_FENCE_ANDROID and
        the currently bound client API does not support the client API
        extension indicating it can place fence commands, then EGL_NO_SYNC_KHR
        is returned and an EGL_BAD_MATCH error is generated."

    Modify table 3.cc in Section 3.8.1 (Sync Objects), added by KHR_fence_sync

    "
    Attribute                          Description                Supported Sync Objects
    -----------------                  -----------------------    ----------------------
    EGL_SYNC_TYPE_KHR                  Type of the sync object    All
    EGL_SYNC_STATUS_KHR                Status of the sync object  All
    EGL_SYNC_CONDITION_KHR             Signaling condition        EGL_SYNC_FENCE_KHR and
                                                                  EGL_SYNC_NATIVE_FENCE_ANDROID only
    "

    Modify the second paragraph description of eglDestroySyncKHR in Section
    3.8.1 (Sync Objects), added by KHR_fence_sync

    "If no errors are generated, EGL_TRUE is returned, and <sync> will no
    longer be the handle of a valid sync object.  Additionally, if <sync> is an
    EGL native fence sync object and the EGL_SYNC_NATIVE_FENCE_FD_ANDROID
    attribute is not EGL_NO_NATIVE_FENCE_FD_ANDROID then that file descriptor
    is closed."

    Add the following after the last paragraph of Section 3.8.1 (Sync
    Objects), added by KHR_fence_sync

    The command

        EGLint eglDupNativeFenceFDANDROID(
                            EGLDisplay dpy,
                            EGLSyncKHR sync);

    duplicates the file descriptor stored in the
    EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute of an EGL native fence sync
    object and returns the new file descriptor.

    Errors
    ------

      * If <sync> is not a valid sync object for <dpy>,
        EGL_NO_NATIVE_FENCE_FD_ANDROID is returned and an EGL_BAD_PARAMETER
        error is generated.
      * If the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute of <sync> is
        EGL_NO_NATIVE_FENCE_FD_ANDROID, EGL_NO_NATIVE_FENCE_FD_ANDROID is
        returned and an EGL_BAD_PARAMETER error is generated.
      * If <dpy> does not match the display passed to eglCreateSyncKHR
        when <sync> was created, the behaviour is undefined."

Issues

    1. Should EGLSyncKHR objects that wrap native fence objects use the
    EGL_SYNC_FENCE_KHR type?

    RESOLVED: A new sync object type will be added.

    We don't want to require all EGL fence sync objects to wrap native fence
    objects, so we need some way to tell the EGL implementation at sync object
    creation whether the sync object should support querying the native fence
    FD attribute. We could do this with either a new sync object type or with a
    boolean attribute. It might be nice to pick up future signaling conditions
    that might be added for fence sync objects, but there may be things that
    get added that don't make sense in the context of native fence objects.

    2. Who is responsible for dup'ing the native fence file descriptors?

    RESOLVED: Whenever a file descriptor is passed into or returned from an
    EGL call in this extension, ownership of that file descriptor is
    transfered. The recipient of the file descriptor must close it when it is
    no longer needed, and the provider of the file descriptor must dup it
    before providing it if they require continued use of the native fence.

    3. Can the EGL_SYNC_NATIVE_FENCE_FD_ANDROID attribute be queried?

    RESOLVED: No.

    Returning the file descriptor owned by the EGL implementation would
    violate the file descriptor ownership rule described in issue #2. Having
    eglGetSyncAttribKHR return a different (dup'd) file descriptor each time
    it's called seems wrong, so a new function was added to explicitly dup the
    file descriptor.

    That said, the attribute is useful both as a way to pass an existing file
    descriptor to eglCreateSyncKHR and as a way to describe the subsequent
    behavior of EGL native fence sync objects, so it is left as an attribute
    for which the value cannot be queried.

Revision History

#3 (Jamie Gennis, September 4, 2012)
    - Reworded the extension to refer to "native fence" objects rather than
    "Android fence" objects.
    - Added a paragraph to the overview that describes assumptions about the
    native fence sync objects.

#2 (Jamie Gennis, July 23, 2012)
    - Changed the file descriptor ownership transferring behavior.
    - Added the eglDupAndroidFenceFDANDROID function.
    - Removed EGL_SYNC_NATIVE_FENCE_FD_ANDROID from the table of gettable
    attributes.
    - Added language specifying that a native Android fence is created at the
    flush following the creation of an EGL Android fence sync object that is
    not passed an existing native fence.

#1 (Jamie Gennis, May 29, 2012)
    - Initial draft.