Name

    WGL_I3D_genlock

Name Strings

    WGL_I3D_genlock

Contact

    Dale Kirkland, Intense3D (kirkland 'at' intense3d.com)

Status

    Complete

Version

    Date: 04/17/2000   Revision 1.0

Number

    252

Dependencies

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

    The WGL_EXT_extensions_string extension is required.

Overview

    The genlock extensions allows application control of the genlock
    features.  Genlock is used to synchronize the refresh of the
    monitor to an external signal.

    There are five different parameters that can be used to control
    genlock:

         Enable/Disable
         Source Selection
         Source Sample Edge
         Source Sample Rate
         Source Delay

IP Status

    None

Issues

    None

New Procedures and Functions

    BOOL wglEnableGenlockI3D(HDC hDC)

    BOOL wglDisableGenlockI3D(HDC hDC)

    BOOL wglIsEnabledGenlockI3D(HDC hDC,
                                BOOL *pFlag)

    BOOL wglGenlockSourceI3D(HDC hDC,
                             UINT uSource)

    BOOL wglGetGenlockSourceI3D(HDC hDC,
                                UINT *uSource)

    BOOL wglGenlockSourceEdgeI3D(HDC hDC,
                                 UINT uEdge)

    BOOL wglGetGenlockSourceEdgeI3D(HDC hDC,
                                    UINT *uEdge)

    BOOL wglGenlockSampleRateI3D(HDC hDC,
                                 UINT uRate)

    BOOL wglGetGenlockSampleRateI3D(HDC hDC,
                                    UINT *uRate)

    BOOL wglGenlockSourceDelayI3D(HDC hDC,
                                  UINT uDelay)

    BOOL wglGetGenlockSourceDelayI3D(HDC hDC,
                                      UINT *uDelay)

    BOOL wglQueryGenlockMaxSourceDelayI3D(HDC hDC,
                                          UINT *uMaxLineDelay,
                                          UINT *uMaxPixelDelay)

New Tokens

    Accepted by the <uSource> parameter of wglGenlockSourceI3D:

      WGL_GENLOCK_SOURCE_MULTIVIEW_I3D            0x2044
      WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D        0x2045
      WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D       0x2046
      WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D         0x2047
      WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D         0x2048
      WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D        0x2049

    Accepted by the <uEdge> parameter of wglGenlockSourceEdgeI3D:

      WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D         0x204A
      WGL_GENLOCK_SOURCE_EDGE_RISING_I3D          0x204B
      WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D            0x204C

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 Frame Buffer)

    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 Appendix A of the OpenGL 1.2.1 Specification (Invariance)

    None

Additions to the WGL Specification

    The genlock trigger is used to synchronize the start of a frame
    with a trigger pulse.  If field data is being displayed (e.g.
    frame-sequential stereo), the synchronization only occurs at the
    frame boundary, not each field boundary.

    The genlock trigger is derived from the genlock source.  The
    genlock source can be selected from six different inputs to the
    system by calling wglGenlockSourceI3D.

      BOOL wglGenlockSourceI3D(HDC hDC,
                               UINT uSource)

    <hDC> is a device context for the graphics adapter or a window
    residing on the graphics adapter that supports genlock.  There is
    only a single genlock source for each graphics adapter regardless
    of the number of monitors supported by the adapter.

    <uSource> specifies one of the following sources:

      WGL_GENLOCK_SOURCE_MULTIVIEW_I3D
        Selects the multiview sync signal as the genlock source.

      WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D
        Selects the external genlock vertical sync component.

      WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D
        Selects the external genlock field component.

      WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D
        Selects the external genlock as a TTL-level signal.

      WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D
        Selects the digital genlock vertical sync component.

      WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D
        Selects the digital genlock field component.

    The current genlock source can be queried by calling
    wglGetGenlockSourceI3D.

    A genlock pulse is generated from the input source based on the
    rising, falling, or both edges of the source.  The edge selection
    is set by calling wglGenlockSourceEdgeI3D.

      BOOL wglGenlockSourceEdgeI3D(HDC hDC,
                                   UINT uEdge)

    <uEdge> specifies one of the following source edges modes used
    to generate the genlock trigger.

      WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D
        Selects the falling edge of the source.

      WGL_GENLOCK_SOURCE_EDGE_RISING_I3D
        Selects the rising edge of the source.

      WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D
        Selects both edges of the source.

    The current genlock source edge mode can be queried with
    wglGetGenlockSourceEdgeI3D.

    The genlock trigger is generated by sampling the genlock pulses.
    The sample rate of the genlock pulses is controlled by calling
    wglGenlockSampleRateI3D.

      BOOL wglGenlockSampleRateI3D(HDC hDC,
                                   UINT uRate)

    <uRate> specifies every nth pulse be used for the genlock trigger.
    For example, if <uRate> were set to a value of 2, every other
    genlock pulse would generate a genlock trigger.  The minimum
    value for <uRate> is 1.  The maximum value for <uRate> is 6.

    The current genlock sample rate can be queried by calling
    wglGetGenlockSampleRateI3D.

    The genlock trigger can be delayed up to an entire frame by
    calling wglGenlockSourceDelayI3D.

      BOOL wglGenlockSourceDelayI3D(HDC hDC,
                                    UINT uDelay)

    <uDelay> specifies the delay (in pixels) that the trigger is
    delayed before being used to synchronize the screen refresh.
    <uDelay> must be in the range [0, <maxDelay>] where <maxDelay>
    is the number of pixel clocks needed to display an entire frame.
    The maximum delay <maxDelay> can be calculated by the following
    equation:

          <maxDelay> = <maxLineDelay> * <maxPixelDelay>

    where <maxLineDelay> and <maxPixelDelay> can be queried by
    calling wglQueryGenlockMaxSourceDelayI3D.

      BOOL wglQueryGenlockMaxSourceDelayI3D(HDC hDC,
                                            UINT *uMaxLineDelay,
                                            UINT *uMaxPixelDelay)

    The current source delay can be queried by calling
    wglGetGenlockSourceDelayI3D.

    Genlock is enabled for each monitor by calling wglEnableGenlockI3D.

      BOOL wglEnableGenlockI3D(HDC hDC)

    Genlock is enabled for the monitor attached to the device with
    the device context <hDC> of a window created on the monitor.

    Genlock can be disabled for a monitor by calling
    wglDisableGenlockI3D.

      BOOL wglDisableGenlockI3D(HDC hDC)

    The current genlock enable can be queried by calling
    wglIsEnabledGenlockI3D.

    In order to avoid synchronization to an incomplete genlock
    specification, genlock should be disabled while the genlock
    parameters are being changed.  The exception to this is changing
    the genlock trigger delay with wglGenlockSourceDelayI3D.

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 any of the genlock functions succeed, a value of TRUE is
    returned.  If a function fails, a value of FALSE is returned.  To
    get extended error information, call GetLastError.

      ERROR_DC_NOT_FOUND         The <hDC> was not valid.

      ERROR_NO_SYSTEM_RESOURCES  The genlock functionality is not
                                 supported.

      ERROR_INVALID_DATA         <uSource> is not one of the valid
                                 sources.

      ERROR_INVALID_DATA         <uEdge> is not one of the valid
                                 source edge modes.

      ERROR_INVALID_DATA         <uRate> is less than a value of 1 or
                                 greater than a value of 6.

      ERROR_INVALID_DATA         <uDelay> is greater than <maxDelay>.

New State

    None

New Implementation Dependent State

    None

Revision History

    10/26/1999  0.1  First draft.
    04/17/2000  1.0  Released driver to ISVs.
