| 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. |