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 concept of a "sync token" that can be passed
    to other clients to issue a "wait" command for synchronization. Generating a
    sync token inserts a fence into the command stream. This wait command will
    then guarantee that commands before the inserted fence are submitted before
    commands after the sync token wait.

    Combined with mailboxes from CHROMIUM_texture_mailbox, which are exported
    using CreateAndConsumeTextureCHROMIUM and imported using
    ProduceTextureDirectCHROMIUM commands, this allows clients across processes
    to synchronize resources.

Issues

    None

New Procedures and Functions

    The command

        void GenSyncTokenCHROMIUM(GLbyte *sync_token)

    inserts a fence into the current context's command stream and returns a
    <sync_token>. The <sync_token> can be passed and used by any context on the
    same server, including other context groups. The fence also implies an
    ordering barrier between contexts in the current scheduling group (stream).
    An INVALID_OPERATION error is generated if <sync_token> is NULL.

    <sync_token> returns a GL_SYNC_TOKEN_SIZE_CHROMIUM byte sized name.

    The command

        void GenUnverifiedSyncTokenCHROMIUM(GLbyte *sync_token)

    inserts a fence into the current context's command stream and returns a
    <sync_token>. The <sync_token> can be passed and used by any context on the
    same client (process), including other context groups. The fence also
    implies an ordering barrier between contexts in the current scheduling group
    (stream). However, to pass the <sync_token> to a context in another client
    (process), the <sync_token> must be verified using VerifySyncTokensCHROMIUM.
    An INVALID_OPERATION error is generated if <sync_token> is NULL.

    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 belong to the same client
    (process). If a sync token was generated by GenUnverifiedSyncTokenCHROMIUM
    and but isn't from the same client (process), 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> must be a sync token generated by GenSyncTokenCHROMIUM, or
    generated by GenUnverifiedSyncTokenCHROMIUM and from the same client
    (process). 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_OPERATION is generated if the <sync_token> parameter of
    WaitSyncTokenCHROMIUM or VerifySyncTokensCHROMIUM was generated using
    GenUnverifiedSyncTokenCHROMIUM but is not from the same client (process).

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.

    12/13/2017   Simplified functions GenSyncTokenCHROMIUM and
                 GenUnverifiedSyncTokenCHROMIUM to generate the fence
                 implicitly. Removed function InsertFenceSyncCHROMIUM.
