Name

    WGL_I3D_swap_frame_usage

Name Strings

    WGL_I3D_swap_frame_usage

Version

    Date: 5/1/2000   Revision: 1.3

Number

    ???

Dependencies

    WGL_EXT_extensions_string is required.
    WGL_EXT_swap_control affects the definition of this extension

Overview

    This extension allows an application to obtain the percent of time
    used to draw a frame.  A floating-point value in the range [0,max]
    is returned which is calculated as follows:

                              td
                   percent = ----
                              tf

    where td is the time measured from the last buffer swap (or call to
    enable the statistic) to when the application issued a buffer swap,
    tf is the entire time for a frame which may be multiple screen
    refreshes depending on the swap interval as set by the
    WGL_swap_control extension.

    The value, percent, indicates the amount of time spent during the
    draw.  If the value is in the range [0,1], the buffer swap occurred
    within the time period required to maintain a constant frame rate.
    If the value is in the range (1,max], a constant frame rate was not
    achieved.  The value indicates the number of frames required to
    draw.

    There is also a mechanism to determine whether a frame swap was
    missed.

New Procedures and Functions

    BOOL wglGetFrameUsageI3D(float *pUsage)

    BOOL wglBeginFrameTrackingI3D(void)

    BOOL wglEndFrameTrackingI3D(void)

    BOOL wglQueryFrameTrackingI3D(DWORD *pFrameCount,
                                  DWORD *pMissedFrames,
                                  float *pLastMissedUsage)

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

    wglGetFrameUsageI3D returns a floating-point value in <pUsage>
    that represents the percentage of time that the application spent
    drawing a scene.  The percentage is calculated as the time spent
    within the time available.

    The time available is the frame refresh time unless a swap interval
    has been established.  In this case, the time available is an
    integer multiple of the frame time as established by the swap
    interval.

    Missed frame swaps can be tracked by calling the following function:

       BOOL wglBeginFrameTrackingI3D(void)

    wglBeginFrameTrackingI3D resets a "missed frame" count and
    synchronizes with the next frame vertical sync before it returns.
    If a swap is missed based in the rate control specified by the
    <interval> set by wglSwapIntervalEXT or the default swap of once
    per frame, the missed frame count is incremented.

    The current missed frame count and total number of swaps since
    the last call to wglBeginFrameTrackingI3D can be obtained by
    callling the following function:

       BOOL wglQueryFrameTrackingI3D(DWORD *pFrameCount,
                                     DWORD *pMissedFrames,
                                     float *pLastMissedUsage)

    The location pointed to by <pFrameCount> will be updated with the
    number of swaps that have occurred.  This value may not match the
    number of swaps that have been requested since swaps may be
    queued by the implementation.  This function can be called at any
    time and does not synchronize to vertical blank.

    The location pointed to by <pMissedFrames> will contain the number
    swaps that missed the specified frame.  The frame usage for the
    last missed frame is returned in the location pointed to by
    <pLastMissedUsage>.

    Frame tracking is disabled by calling the function

       BOOL wglEndFrameTrackingI3D(void)

    This function will not return until all swaps have occurred.  The
    application can call wglQueryFrameTrackingI3D for a final swap and
    missed frame count.

    If these functions fail, FALSE is returned.  To get extended
    error information, call GetLastError.

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
