Name

    SGIX_swap_barrier

Name Strings

    GLX_SGIX_swap_barrier

Version

    $Date: 1996/07/22 06:38:40 $ $Revision: 1.12 $

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




