Name

    SGIX_swap_barrier

Name Strings

    GLX_SGIX_swap_barrier

Version

    $Date: 2005/06/02 18:12:32 $ $Revision: 1.1 $

Number

    92

Dependencies

    SGIX_swap_control affects the definition of this extension
    SGI_cushion affects the definition of this extension
    SGIX_swap_group is required

Overview

    This extension provides the capability to sychronize the buffer
    swaps of different swap groups.

    A swap group is bound to a _swap_barrier_.  The buffer swaps of each 
    swap group using that barrier will wait until every swap group using 
    that barrier is ready to swap (where readiness is defined below), after
    which time all buffer swaps of all groups using that barrier will
    take place concurrently.

    This extension extends the set of conditions that must be met before
    a buffer swap can take place. 

Issues

    * Should we have a query for the maximum number of supported barriers?

New Procedures and Functions

    void BindSwapBarrierSGIX(Display *dpy, 
			     GLXDrawable drawable,
			     int barrier);

    Bool QueryMaxSwapBarriersSGIX(Display *dpy, 
 				  int screen,
				  int *max);

New Tokens

    None

Additions to the GLX Specification

    Add to section 3.2.6, Double Buffering:

    BindSwapBarrierSGIX binds the swap group that contains <drawable> to 
    <barrier>.  Subsequent buffer swaps for that group will be subject to
    this binding, until the group is unbound from <barrier>.  If <barrier> 
    is zero, the group is unbound from its current barrier, if any.

    QueryMaxSwapBarriersSGIX returns in <max> the maximum number of barriers 
    supported by an implementation on <screen>.

    QueryMaxSwapBarriersSGIX returns True if it success and False if it fails.
    If it fails, <max> is unchanged.

    Before a buffer swap can take place, a set of conditions must be 
    satisfied.  The conditions are defined in terms of the notions of when 
    a drawable is ready to swap and when a group is ready to swap.

    Any GLX drawable that is not a window is always ready.

    When a window is unmapped, it is always ready.

    When a window is mapped, it is ready when all of the following are true:

	1. A buffer swap command has been issued for it.

	2. Its swap interval has elapsed.

    A group is ready when the following is true:

	1. All windows in the group are ready.

    All of the following must be satisfied before a buffer swap for a window
    can take place:

	1. The window is ready.

	2. If the window belongs to a group, the group is ready.

	3. If the window belongs to a group and that group is bound to a 
	   barrier, all groups using that barrier are ready.

    Buffer swaps for all windows in a swap group will take place concurrently
    after the conditions are satisfied for every window in the group.

    Buffer swaps for all groups using a barrier will take place concurrently 
    after the conditions are satisfied for every window of every group using 
    the barrier, if and only if the vertical retraces of the screens of all 
    the groups are synchronized.  If they are not synchronized, there is no
    guarantee of concurrency between groups.

    Both BindSwapBarrierSGIX and QueryMaxSwapBarrierSGIX are part of the X 
    stream.

    An implementation may support a limited number of swap barriers,
    and may have restrictions on where the users of a barrier can reside.
    For example, an implementation may allow the users to reside on different
    screens, displays, or even hosts.

Errors

    BindSwapBarrierSGIX generates BadValue if <barrier> is already bound to 
    another swap group or if <barrier> is not a valid name of a barrier.

    BindSwapBarrierSGIX generates BadGLXDrawable if <drawable> is an 
    invalid GLX drawable.

    QueryMaxSwapBarrierSGIX generates BadValue if <screen> is not a valid 
    screen.

New State
								Initial
    Get Value			Get Command		Type	Value	Attrib
    ---------			-----------		----	-------	------
    <current barrier bound to group> ??

New Implementation Dependent State

    None




