Name

    OML_sync_control

Name Strings

    WGL_OML_sync_control

Contact

    Randi Rost, 3Dlabs (rost 'at' 3dlabs.com)

Status

    Complete. Approved by the Khronos SIG on July 19, 2001.

Version

    Last Modified Date: 07/23/2001   Revision: 17.0

Number

    242

Dependencies

    The extension is written against the OpenGL 1.2.1 Specification
    although it should work on any previous OpenGL specification.

    WGL_ARB_extensions_string is required.

Overview

    This extension provides the control necessary to ensure
    synchronization between events on the graphics card (such as
    vertical retrace) and other parts of the system. It provides support
    for applications with real-time rendering requirements by providing
    precise synchronization between graphics and streaming video or
    audio.

    This extension incorporates the use of three counters that provide
    the necessary synchronization. The Unadjusted System Time (or UST)
    is a 64-bit monotonically increasing counter that is available
    throughout the system. UST is not a resource that is controlled
    by OpenGL, so it is not defined further as part of this extension.
    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 a
    per-window value that is incremented each time a swap buffer
    action is performed on the window.

    The use of these three counters allows the application to
    synchronize graphics rendering to vertical retraces and/or swap
    buffer actions, and to synchronize other activities in the system
    (such as streaming video or audio) to vertical retraces and/or
    swap buffer actions.

    Functions are provided to allow an application to detect when an
    MSC or SBC has reached a certain value. This function will block
    until the specified value has been reached. Applications that want
    to continue other processing while waiting are expected to call
    these blocking functions from a thread that is separate from the
    main processing thread(s) of the application.

    This extension carefully defines the observable order in which
    things occur in order to allow implementations to perform
    optimizations and avoid artifacts such as tearing, while at the
    same time providing a framework for consistent behavior from the
    point of view of an application.

Issues

    None.

IP Status

    No known issues.

New Procedures and Functions

    BOOL wglGetSyncValuesOML(HDC hdc, INT64 *ust, INT64 *msc, INT64 *sbc)

    BOOL wglGetMscRateOML(HDC hdc, INT32 *numerator, INT32 *denominator)

    INT64 wglSwapBuffersMscOML(HDC hdc, INT64 target_msc, INT64 divisor,
			       INT64 remainder)

    INT64 wglSwapLayerBuffersMscOML(HDC hdc, INT fuPlanes, INT64 target_msc,
				    INT64 divisor, INT64 remainder)

    BOOL wglWaitForMscOML(HDC hdc, INT64 target_msc, INT64 divisor,
			  INT64 remainder, INT64 *ust, INT64 *msc,
			  INT64 *sbc)

    BOOL wglWaitForSbcOML(HDC hdc, INT64 target_sbc, INT64 *ust, INT64 *msc,
			  INT64 *sbc)

New Tokens

    None

Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization)

    None

Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment
Operations and the Framebuffer)

    None

Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions)

    None

Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and
State Requests)

    None

Additions to the WGL Specification

    wglGetSyncValuesOML 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-window state and is initialized to 0 when the window
    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 Windows
    associates with <hdc> (i.e., the primary monitor).

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

    wglSwapBuffersMscOML has the same functionality as SwapBuffers,
    except for the following. The swap indicated by a call to
    wglSwapBuffersMscOML does not perform an implicit glFlush. The
    indicated swap will not occur until all prior rendering commands
    affecting the buffer have been completed. Once prior rendering
    commands have been completed, if the current MSC is less than
    <target_msc>, the buffer swap will occur when the MSC value becomes
    equal to <target_msc>. Once prior rendering commands have completed,
    if the current MSC is greater than or equal to <target_msc>, the
    buffer swap will occur the next time the MSC value is incremented
    to a value such that MSC % <divisor> = <remainder>. If <divisor> = 0,
    the swap will occur when MSC becomes greater than or equal to
    <target_msc>.

    Once wglSwapBuffersMscOML has been called, subsequent OpenGL commands
    can be issued immediately.	If the thread's current context is made
    current to another drawable, or if the thread makes another context
    current on another drawable, rendering can proceed immediately.

    If there are multiple outstanding swaps for the same window, at most
    one such swap can be satisfied per increment of MSC.  The order of
    satisfying outstanding swaps of a window must be the order they were
    issued. Each window that has an outstanding swap satisfied by the same
    current MSC should have one swap done.

    If a thread issues a wglSwapBuffersMscOML call on a window, then
    issues OpenGL commands while still current to this window (which now
    has a pending wglSwapBuffersMscOML call), the commands will be executed
    in the order they were received, subject to implementation resource
    constraints.  Furthermore, subsequent commands that would affect
    the back buffer will only affect the new back buffer (that is, the
    back buffer after the swap completes). Such commands do not affect
    the current front buffer.

    If the graphics driver utilizes an extra thread to perform the wait,
    it is expected that this thread will have a high priority so that
    the swap will occur at the earliest possible moment once all the
    conditions for swapping have been satisfied.

    wglSwapLayerBuffersMscOML works identically to wglSwapBuffersMscOML,
    except that the specified layers of a window are swapped when the
    buffer swap occurs, as defined in wglSwapLayerBuffers. The <planes>
    parameter has the same definition as it has in the
    wglSwapLayerBuffers function, and it indicates whether to swap
    buffers for the overlay, underlay, or main planes of the window.

    Both wglSwapBuffersMscOML and wglSwapLayerBuffersMscOML return the
    value that will correspond to the value of the SBC when the buffer
    swap actually occurs (in other words, the return value will be the
    current value of the SBC + the number of pending buffer swaps + 1).
    Both functions will return a value of -1 if the function failed
    because of errors detected in the input parameters. Both functions
    are no-ops if the current pixel format for <hdc> does not include
    a back buffer.

    wglWaitForMscOML can be used to cause the calling thread to wait
    until a specific graphics MSC value has been reached. If the current
    MSC is less than the <target_msc> parameter for wglWaitForMscOML,
    wglWaitForMscOML will block until the MSC value becomes equal to
    <target_msc> and then will return the current values for UST, MSC,
    and SBC. Otherwise, the function will block until the MSC value is
    incremented to a value such that MSC % <divisor> = <remainder> and
    then will return the current values for UST, MSC, and SBC. If
    <divisor> = 0, then the wait will return as soon as MSC >= <target_msc>.

    wglWaitForSbcOML can be used to cause the calling thread to wait
    until a specific SBC value has been reached. This function will block
    until the SBC value for <hdc> becomes equal to <target_sbc> and then
    will return the current values for UST, MSC, and SBC. If the SBC
    value is already greater than or equal to <target_sbc>, the function
    will return immediately with the current values for UST, MSC, and
    SBC. If <target_sbc> = 0, the function will block until all previous
    swaps requested with wglSwapBuffersMscOML or wglSwapLayerBuffersMscOML
    for that window have completed.  It will then return the current values
    for UST, MSC, and SBC.

    When wglSwapBuffersMscOML or wglSwapLayerBuffersMscOML has been
    called to cause a swap at a particular MSC, an application process
    would observe the following order of execution for that MSC:

	1. The window for which a wglSwapBuffersMscOML call has been
	   issued has been completely scanned out to the display for
	   the previous MSC
	2. The swap buffer action for that window begins
	3. All the swap buffer actions for all the windows for the
	   application process are completed
	4. SBC and MSC values are atomically incremented
	5. Any calls to wglWaitForMscOML or wglWaitForSbcOML that
	   are satisfied by the new values for SBC and graphics
	   MSC are released

    The functions wglGetSyncValuesOML, wglGetMscRateOML, wglWaitForMscOML,
    and wglWaitForSbcOML will each return TRUE if the function completed
    successfully, FALSE otherwise.

Dependencies on WGL_ARB_extensions_string

    Because there is no way to extend wgl, these calls are defined in
    the ICD and can be called by obtaining the address with
    wglGetProcAddress. Because this is not a GL extension, it is not
    included in the GL_EXTENSIONS string. If this extension is supported
    by the implementation, its name will be returned in the extension
    string returned by wglGetExtensionString.

Errors

    To get extended error information, call GetLastError. Each of the
    functions defined by this extension may generate the following error:

    ERROR_DC_NOT_FOUND		 The <hDC> parameter was not valid.

    The following error will be generated for the functions
    wglSwapBuffersMscOML, wglSwapLayerBuffersMscOML, and
    wglWaitForMscOML, if <divisor> is less than zero, or if <remainder>
    is less than zero, or if <remainder> is greater than or equal to
    a non-zero <divisor>, or if <target_msc> is less than zero; and
    for the function wglWaitForSbcOML if <target_sbc> is less than zero:

    ERROR_INVALID_DATA		 A parameter is incorrect.

New State

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

New Implementation Dependent State

    None








