Name

    WGL_I3D_swap_frame_lock

Name Strings

    WGL_I3D_swap_frame_lock

Version

    Date: 9/23/1999   Revision: 1.2

Number

    254

Dependencies

    WGL_EXT_extensions_string is required.
    WGL_EXT_swap_control affects this extension.

Overview

    This extension allows an application to synchronize color buffer swaps
    across multiple systems.  Applications that run simultaneously on
    multiple systems can use this extension to synchronize the buffer swap
    across each of these systems.

    The mechanism used to implement synchronization of multiple displays
    depends on an external sync signal.  This resource can only be used by a
    single application at a time.

    Each system running the application must have frame lock enabled in
    order for their system to participate in the frame lock.  If frame
    lock for a system is not enabled, that system will have no affect on
    other systems.

    For each of the systems to swap at the correct position, it is
    required that all of the systems genlock together.  Genlock is
    controlled through the Video Applet.

    The frame lock extension can also be used in conjunction with the swap
    control extension to control the swap rate.  The interval rate of the
    "master" system (i.e., the system at the start of the cabled systems)
    controls the swap rate.

    An implementation-dependent timeout is set when a swap is requested.
    If the timeout expires before all systems are ready to swap, the swap
    will occur.  The prevents a system hang if the cable becomes
    disconnected or an application hangs.

New Procedures and Functions

    BOOL wglEnableFrameLockI3D(VOID)

    BOOL wglDisableFrameLockI3D(VOID)

    BOOL wglIsEnabledFrameLockI3D(BOOL *pFlag)

    BOOL wglQueryFrameLockMasterI3D(BOOL *pFlag)

New Tokens

    None

Additions to Chapter 2 of the 1.2 GL Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the 1.2 GL Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.2 GL Specification (Per-Fragment Operations
and the Framebuffer)

    None

Additions to Chapter 5 of the 1.2 GL Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.2 GL Specification (State and State Requests)

    None

Additions to the WGL Specification

    wglEnableFrameLockI3D enables synchronization of buffer swaps to all
    systems that are connected through the external sync cable and have
    enabled frame lock.  A value of TRUE is returned if the hardware
    supports frame lock and the resource is currently available.  A value
    of FALSE is returned if the hardware cannot support frame lock or the
    resource is in use.

    Frame lock can be disabled with wglDisableFrameLockI3D.  If frame
    lock is disabled for a system, that system has no affect on other
    systems that are synchronized to the external sync cable.

    The current state of the frame lock enable can be obtained with
    wglIsEnabledFrameLockI3D.

    The "master" system controls the behavior of swap for all systems
    that have frame lock enabled.  wglQueryFrameLockMaster can be used
    to determine if a system is the "master" system.  The swap behavior
    of the master system depends on the setting of the swap interval
    using the WGL_EXT_swap_control extension.

    The "master" system is forced to be synchronized to at least one
    vertical blank if the swap interval is 0 or the Video Applet
    setting for synchronizing to vertical blank is not set.

Dependencies on WGL_EXT_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 extension is a WGL extension, it
    is not included in the GL_EXTENSIONS string.  Its existence can be
    determined with the WGL_EXT_extensions_string extension.

Errors

    If the function succeeds, the return value is TRUE. If the function
    fails, the return value is FALSE.  To get extended error information,
    call GetLastError.

       ERROR_DC_NOT_FOUND      An RC was not current to the calling
                               thread; therefore, no DC could be
                               obtained.

       ERROR_BUSY              The resource used for obtaining usage
                               was currently in use by another
                               application.

New State

    None

New Implementation Dependent State

    None
