13a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgName
23a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
33a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    MESA_swap_frame_usage
43a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
53a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgName Strings
63a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
73a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    GLX_MESA_swap_frame_usage
83a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
93a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgContact
103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    Ian Romanick, IBM, idr at us.ibm.com
123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgStatus
143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    Deployed in DRI drivers post-XFree86 4.3.
163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgVersion
183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    Date: 5/1/2003   Revision: 1.1
203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgNumber
223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    ???
243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgDependencies
263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    GLX_SGI_swap_control affects the definition of this extension.
283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    GLX_MESA_swap_control affects the definition of this extension.
293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    GLX_OML_sync_control affects the definition of this extension.
303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    Based on WGL_I3D_swap_frame_usage version 1.3.
323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgOverview
343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    This extension allows an application to determine what portion of the
363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    swap period has elapsed since the last swap operation completed.  The
373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    "usage" value is a floating point value on the range [0,max] which is
383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    calculated as follows:
393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              td
413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                   percent = ----
423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                              tf
433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    where td is the time measured from the last completed buffer swap (or
453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    call to enable the statistic) to when the next buffer swap completes, tf
463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    is the entire time for a frame which may be multiple screen refreshes
473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    depending on the swap interval as set by the GLX_SGI_swap_control or
483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    GLX_OML_sync_control extensions. 
493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    The value, percent, indicates the amount of time spent between the
513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    completion of the two swaps.  If the value is in the range [0,1], the
523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    buffer swap occurred within the time period required to maintain a
533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    constant frame rate.  If the value is in the range (1,max], a constant
543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    frame rate was not achieved.  The value indicates the number of frames
553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    required to draw.
563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    This definition of "percent" differs slightly from
583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    WGL_I3D_swap_frame_usage.  In WGL_I3D_swap_frame_usage, the measurement
593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    is taken from the completion of one swap to the issuance of the next.
603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    This representation may not be as useful as measuring between
613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    completions, as a significant amount of time may pass between the
623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    issuance of a swap and the swap actually occurring.
633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    There is also a mechanism to determine whether a frame swap was
653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    missed.
663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgNew Procedures and Functions
683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    int glXGetFrameUsageMESA(Display *dpy,
703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                             GLXDrawable drawable,
713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    	                     float *usage)
723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    int glXBeginFrameTrackingMESA(Display *dpy,
743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                  GLXDrawable drawable)
753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    int glXEndFrameTrackingMESA(Display *dpy,
773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                GLXDrawable drawable)
783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    int glXQueryFrameTrackingMESA(Display *dpy,
803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                  GLXDrawable drawable,
813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				  int64_t *swapCount,
823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                  int64_t *missedFrames,
833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                  float *lastMissedUsage)
843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgNew Tokens
863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None
883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgAdditions to Chapter 2 of the 1.4 GL Specification (OpenGL Operation)
903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None
923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgAdditions to Chapter 3 of the 1.4 GL Specification (Rasterization)
943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None
963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgAdditions to Chapter 4 of the 1.4 GL Specification (Per-Fragment Operations
983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.organd the Framebuffer)
993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None
1013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1023a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgAdditions to Chapter 5 of the 1.4 GL Specification (Special Functions)
1033a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1043a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None
1053a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1063a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgAdditions to Chapter 6 of the 1.4 GL Specification (State and State Requests)
1073a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1083a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None
1093a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1103a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgAdditions to the GLX 1.3 Specification
1113a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1123a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    The frame usage is measured as the percentage of the swap period elapsed
1133a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    between two buffer-swap operations being committed.  In unextended GLX the
1143a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    swap period is the vertical refresh time.  If SGI_swap_control or
1153a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    MESA_swap_control are supported, the swap period is the vertical refresh
1163a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    time multiplied by the swap interval (or one if the swap interval is set
1173a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    to zero).
1183a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    
1193a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    If OML_sync_control is supported, the swap period is the vertical
1203a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    refresh time multiplied by the divisor parameter to
1213a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    glXSwapBuffersMscOML.  The frame usage in this case is less than 1.0 if
1223a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    the swap is committed before target_msc, and is greater than or equal to
1233a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    1.0 otherwise.  The actual usage value is based on the divisor and is
1243a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    never less than 0.0.
1253a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1263a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       int glXBeginFrameTrackingMESA(Display *dpy,
1273a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLXDrawable drawable,
1283a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				     float *usage)
1293a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1303a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    glXGetFrameUsageMESA returns a floating-point value in <usage>
1313a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    that represents the current swap usage, as defined above.
1323a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1333a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    Missed frame swaps can be tracked by calling the following function:
1343a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1353a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       int glXBeginFrameTrackingMESA(Display *dpy,
1363a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLXDrawable drawable)
1373a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1383a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    glXBeginFrameTrackingMESA resets a "missed frame" count and
1393a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    synchronizes with the next frame vertical sync before it returns.
1403a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    If a swap is missed based in the rate control specified by the
1413a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    <interval> set by glXSwapIntervalSGI or the default swap of once
1423a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    per frame, the missed frame count is incremented.
1433a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1443a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    The current missed frame count and total number of swaps since
1453a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    the last call to glXBeginFrameTrackingMESA can be obtained by
1463a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    calling the following function:
1473a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1483a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       int glXQueryFrameTrackingMESA(Display *dpy,
1493a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     GLXDrawable drawable,
1503a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org				     int64_t *swapCount,
1513a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     int64_t *missedFrames,
1523a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                     float *lastMissedUsage)
1533a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1543a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    The location pointed to by <swapCount> will be updated with the
1553a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    number of swaps that have been committed.  This value may not match the
1563a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    number of swaps that have been requested since swaps may be
1573a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    queued by the implementation.  This function can be called at any
1583a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    time and does not synchronize to vertical blank.
1593a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1603a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    The location pointed to by <missedFrames> will contain the number
1613a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    swaps that missed the specified frame.  The frame usage for the
1623a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    last missed frame is returned in the location pointed to by
1633a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    <lastMissedUsage>.
1643a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1653a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    Frame tracking is disabled by calling the function
1663a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1673a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       int glXEndFrameTrackingMESA(Display *dpy,
1683a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org                                   GLXDrawable drawable)
1693a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1703a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    This function will not return until all swaps have occurred.  The
1713a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    application can call glXQueryFrameTrackingMESA for a final swap and
1723a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    missed frame count.
1733a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1743a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    If these functions are successful, zero is returned.  If the context
1753a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    associated with dpy and drawable is not a direct context,
1763a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    GLX_BAD_CONTEXT is returned.
1773a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1783a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgErrors
1793a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1803a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    If the function succeeds, zero is returned.  If the function
1813a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    fails, one of the following error codes is returned:
1823a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1833a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       GLX_BAD_CONTEXT         The current rendering context is not a direct
1843a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org       			       context.
1853a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1863a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgGLX Protocol
1873a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1883a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None.  This extension only extends to direct rendering contexts.
1893a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1903a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgNew State
1913a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1923a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None
1933a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1943a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgNew Implementation Dependent State
1953a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1963a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    None
1973a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
1983a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.orgRevision History
1993a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org
2003a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    1.1,  5/1/03   Added contact information.
2013a0db227ffe90888ad760c61a63226988c974e0apatrick@chromium.org    1.0,  3/17/03  Initial version based on WGL_I3D_swap_frame_usage.
202