Name

   CHROMIUM_sync_control

Name Strings

   EGL_CHROMIUM_sync_control

Contact

   Stéphane Marchesin, Google (marcheu 'at' google.com)

Status

   Draft.

Version

   Version 3, 2020-01-23

   Based on GLX_OML_sync_control Revision 6.0

Number

   ???

Dependencies

   The extension is written against the EGL 1.2 Specification, although it
   should work on other versions of these specifications. This extension
   also requires an operating system which supports CLOCK_MONOTONIC.

Overview

   This extension provides counters which let applications know about the
   timing of the last vertical retrace. By looking at the system clock, as
   well as the refresh rate of the monitor, this should enable applications
   to predict the position of future retraces so as to schedule an optimal
   workload.

   This extension incorporates the use of three counters that provide
   the necessary synchronization. The Unadjusted System Time (or UST)
   is the 64-bit CLOCK_MONOTONIC clock; in particular this lets the
   application schedule future vertical retraces by querying this clock.
   The graphics Media Stream Counter (or graphics MSC) is a counter
   that is unique to the graphics subsystem and increments for each
   vertical retrace that occurs. The Swap Buffer Counter (SBC) is an
   attribute of an EGLSurface and is incremented each time a swap
   buffer action is performed on the associated surface.

   The use of these three counters allows the application to
   synchronize graphics rendering to vertical retraces and/or swap
   buffer actions. For example, by querying the synchronization values for
   a given surface, the application can accurately predict the timing for
   the next vertical retraces and schedule rendering accordingly.

Issues

   None.

IP Status

   No known issues.

New Procedures and Functions

   Bool eglGetSyncValuesCHROMIUM(EGLDisplay dpy,
                                 EGLSurface surface,
                                 int64_t* ust,
                                 int64_t* msc,
                                 int64_t* sbc)

   Bool eglGetMscRateCHROMIUM(EGLDisplay* dpy,
                              EGLSurface surface,
                              int32_t* numerator,
                              int32_t* denominator)


New Tokens

   None

Additions to the EGL 1.3 Specification

   eglGetSyncValuesCHROMIUM returns the current UST/MSC/SBC triple. A UST
   timestamp is obtained each time the graphics MSC is incremented.
   If this value does not reflect the value of the UST at the time the
   first scan line of the display begins passing through the video
   output port, it will be adjusted by the graphics driver to do so
   prior to being returned by any of the functions defined by this
   extension.

   This UST timestamp, together with the current graphics MSC and the
   current SBC, comprise the current UST/MSC/SBC triple. The UST,
   graphics MSC, and SBC values are not part of the render context
   state. These values cannot be pushed or popped. The graphics MSC
   value is initialized to 0 when the graphics device is initialized.
   The SBC is per-surface state and is initialized to 0 when the
   EGLSurface data structure is initialized.

   The SBC value is incremented by the graphics driver at the completion
   of each buffer swap (e.g., the pixel copy has been completed or the
   hardware register that swaps memory banks has been written). For pixel
   formats that do not contain a back buffer, the SBC will always be
   returned as 0.

   The graphics MSC value is incremented once for each screen refresh.
   For a non-interlaced display, this means that the graphics MSC value
   is incremented for each frame. For an interlaced display, it means
   that it will be incremented for each field. For a multi-monitor
   system, the monitor used to determine MSC is the one where the surface
   is located. If the surface spans multiple monitors, the monitor used
   to determine MSC is the one with the biggest coverage in pixels.

   eglGetMscRateCHROMIUM returns the rate at which the MSC will be incremented
   for the display associated with <hdc>. The rate is expressed in Hertz
   as <numerator> / <denominator>. If the MSC rate in Hertz is an
   integer, then <denominator> will be 1 and <numerator> will be
   the MSC rate.

   The functions eglGetSyncValuesCHROMIUM, and eglGetMscRateCHROMIUM will
   return TRUE if the function completed successfully, FALSE otherwise.

   Each time eglSwapBuffer succeeds, the SBC will be increased within a
   finite time period.

Errors

   The functions eglGetSyncValuesCHROMIUM, and eglGetMscRateCHROMIUM will
   return FALSE if there is no current EGLContext.


New State

   Get Value                 Get Command            Type    Initial Value
   ---------                 -----------            ----    -------------
     [UST]             eglGetSyncValuesCHROMIUM      Z      unspecified
     [MSC]             eglGetSyncValuesCHROMIUM      Z                  0
     [SBC]             eglGetSyncValuesCHROMIUM      Z                  0

New Implementation Dependent State

   None

Revision History

    Version 3, 2020-01-23 (Jonah Ryan-Davis)
       - Add the function eglGetMscRateCHROMIUM based on glXGetMscRateOML from
         GLX_OML_sync_control revision 6.0.

    Version 2, 2015-05-05 (Chad Versace)
       - Rename to EGL_CHROMIUM_sync_control from EGL_CHROMIUM_get_sync_values.
         EGL_CHROMIUM_sync_control is the de facto extension name because all
         users query that extension string.

    Version 1, 2014-08-15 (Stéphane Marchesin)
       - Initial draft, based on GLX_OML_sync_control revision 6.0.
