Name

    CHROMIUM_sync_point

Name Strings

    GL_CHROMIUM_sync_point

Version

    Last Modifed Date: November 20, 2015

Dependencies

    OpenGL ES 2.0 is required.

Overview

    This extension allows a client to order operations between contexts.

    This extension introduces the concepts of "fence sync" and "sync token".
    An inserted fence sync represents a position in the command stream of a
    context. Sync tokens are generated from fence syncs and allow another
    context to issue a "wait" command on the sync token. This wait command
    will then guarantee that commands before the inserted fence sync are
    submitted before commands after the sync token wait.

    This extension implements a small subset of ARB_sync, with weaker
    guarantees. In particular it doesn't ensure commands are actually executed
    by the server, it only guarantees submission order.

    It does however guarantee operation order with respect to
    CreateAndConsumeTextureCHROMIUM and ProduceTextureCHROMIUM from
    CHROMIUM_texture_mailbox, if present.

Issues

    None

New Procedures and Functions

    The command

        uint64 InsertFenceSyncCHROMIUM()

    inserts a fence sync in the current command stream. The fence sync is
    signaled when previous commands have been submitted to the server, or when
    the context is destroyed, whichever happens first. The fence sync name is
    only visible for the current context. The returned fence sync name cannot
    be waited upon directly, but once the command is flushed to the server,
    it can be converted to a sync token using GenSyncTokenCHROMIUM, which is
    waitable.

    The command

        void GenSyncTokenCHROMIUM(uint64 fence_sync, GLbyte *sync_token)

    converts <fence_sync> which is only visible to the current context to a
    sync token which may be waited upon by any contexts on the same server.
    The <fence_sync> command must be flushed before this function may be
    called, otherwise an INVALID_OPERATION error is generated. The use of
    ShallowFlushCHROMIUM is enough for the command to be flushed to the
    server. The generated <sync_token> must be generated on the same context
    as when InsertFenceSyncCHROMIUM was called. The <sync_token> can be passed
    and used by any context on the same server, including other context groups.

    <sync_token> returns a GL_SYNC_TOKEN_SIZE_CHROMIUM byte sized name.

    The command

        void GenUnverifiedSyncTokenCHROMIUM(uint64 fence_sync,
                                            GLbyte *sync_token)

    converts <fence_sync>, which is only visible to the current context, to a
    sync token, which may be waited upon by a context which only needs flush
    order guarantee with respect to the fence sync context. For example, if
    the two contexts are on the same channel but on different streams, flush
    order guarantee is enough to guarantee that the server will receive the
    release command before the wait command. The <fence_sync> command must be
    flushed or separated by an ordering barrier before this function may be
    called, otherwise an INVALID_OPERATION error is generated. For chromium
    specific flushes and ordering barriers, see ShallowFlushCHROMIUM and
    OrderingBarrierCHROMIUM. The generated <sync_token> must be generated on
    the same context as when InsertFenceSyncCHROMIUM was called.

    The command

        void VerifySyncTokensCHROMIUM(GLbyte **sync_tokens, GLsizei count)

    verifies array <sync_tokens> of length <count> and ensures that these
    sync tokens have all been verified. The generated sync token did not have
    to be generated from the same context but it must be from a context which
    flush order guarantee is enough to guarantee order. For example, contexts
    which live on the same channel may verify sync tokens for one another.
    If a sync token was generated by GenUnverifiedSyncTokenCHROMIUM and the
    corresponding context is unable to verify it, an INVALID_OPERATION error
    is generated. Sync tokens which have already been verified are ignored, if
    all sync tokens were already verified then nothing will be done.

    The command

        void WaitSyncTokenCHROMIUM(const GLbyte *sync_token)

    causes the current context to stop submitting commands until the specified
    fence sync becomes signaled. This is implemented as a server-side wait.
    <sync_token> is a sync token generated by GenSyncTokenCHROMIUM. If
    <sync_token> was generated by GenUnverifiedSyncTokenCHROMIUM and the
    corresponding fence sync context required more than just flush ordering
    to guarantee synchronization, an INVALID_OPERATION error is generated. If
    <sync_token> isn't a valid sync token returned by GenSyncTokenCHROMIUM or
    GenUnverifiedSyncTokenCHROMIUM, the result is undefined.

New Tokens

    The size of a sync token name in bytes.

        GL_SYNC_TOKEN_SIZE_CHROMIUM                        24

Errors

    INVALID_VALUE is generated if the <sync_token> parameter of
    GenSyncTokenCHROMIUM or GenUnverifiedSyncTokenCHROMIUM is NULL.

    INVALID_VALUE is generated if the <fence_sync> parameter of
    GenSyncTokenCHROMIUM or GenUnverifiedSyncTokenCHROMIUM is not a
    valid local fence sync name.

    INVALID_OPERATION is generated if the <fence_sync> parameter of
    GenSyncTokenCHROMIUM or has not been flushed to the server.

    INVALID_OPERATION is generated if the <fence_sync> parameter of
    GenUnverifiedSyncTokenCHROMIUM or has not been flushed to the server
    or queued to be flushed using an ordering barrier.

    INVALID_OPERATION is generated if the <sync_token> parameter of
    WaitSyncTokenCHROMIUM or VerifySyncTokensCHROMIUM was generated using
    GenUnverifiedSyncTokenCHROMIUM, but the two contexts must be synchronized
    with more than just flush order.

New State

    None.

Revision History

    2/25/2013    Documented the extension

    9/8/2015     Modified functions InsertFenceSyncCHROMIUM,
    GenSyncTokenCHROMIUM, and WaitSyncTokenCHROMIUM.

    10/12/2015   Added function GenUnverifiedSyncTokenCHROMIUM.

    11/24/2015   Clarified that GenUnverifiedSyncTokenCHROMIUM only needs an
    ordering barrier and added proper error values.

    11/25/2015   Added function VerifySyncTokensCHROMIUM.
