Name

    SGIX_fbconfig

Name Strings

    GLX_SGIX_fbconfig

Version
    
    $Date: 1997/03/24 18:56:20 $ $Revision: 1.16 $

Number

    49

Dependencies

    SGIS_multisample affects the definition of this extension
    EXT_visual_info affects the definition of this extension
    EXT_visual_rating affects the definition of this extension
    EXT_import_context affects the definition of this extension
    SGIX_pbuffer affects the definition of this extension

Overview

    This extension introduces a new way to describe the capabilities of a 
    GLX drawable (i.e., to describe the depth of color buffer components 
    and the type and size of ancillary buffers), removes the "similarity"
    requirement when making a context current to a drawable, and supports 
    RGBA rendering to one- and two-component Windows and GLX Pixmaps.

    Currently GLX overloads X Visuals with information on GLX drawable
    capabilities. This extension defines a new construct, a GLXFBConfigSGIX,
    that encapsulates GLX drawable capabilities and has the following 
    properties:
    
       - It may or may not have an associated X visual. If it does have 
       an associated X visual then it is possible to create Windows that  
       have the capabilities described by the GLXFBConfig.

       - A particular GLXFBConfig does not need to work with all GLX 
       drawables. For example, it is possible for implementations to export 
       GLXFBConfigs that only work with GLX pixmaps.

    This extension also removes the "similarity" restriction when making
    a context and drawable current. Instead a less restrictive requirement 
    of "compatibility" (see definition below) is imposed. Note that when 
    a context is created it has an associated rendering type which
    is either RGBA or color index. In the future we may want to remove all
    "similarity" and "compatibility" restrictions and allow a context to be
    bound to any drawable that supports its rendering type.

    Finally the current GLX specification requires that the GLX_RGBA visual
    attribute be associated only with X visual types TrueColor and DirectColor. 
    This extension defines the semantics for doing RGBA rendering to Windows
    created with visuals of type PseudoColor, StaticColor, GrayScale, and 
    StaticGray.  In each of these cases, the red component is used to
    generate the display, and the green and blue components, if present,
    are ignored for display purposes.  

    The OpenGL RGBA rendering semantics are more powerful than the OpenGL
    index rendering semantics.  By extending the number of X visual types
    that can be associated with an RGBA color buffer, this extension allows
    RGBA rendering semantics to be used with pseudo color and gray scale
    displays.  An especially useful application of this extension is
    support of one- and two-component RGBA drawables; drawables whose green,
    blue, and sometimes alpha components have no bitplanes.


Issues

    *	Should GLXFBConfigs apply to all GLX drawables or just GLXPbuffers?

        A: For consistency, all GLX drawables should be supported. (And if this 
        extension is incorporated in a future release of GLX then the existing 
        calls that rely on XVisualInfo structures should be deprecated.) The 
        current mechanism which ties the description of GLX drawables to
        X visuals is inadequate since it restricts all drawable configurations
        to those which can be supported by on-screen windows.

    *   Should the selection of an FBConfig differ from glXChooseVisual? If 
	so, how? 

        Yes. For some attributes, the default value (that is, the value that is
        used if the attribute is not specified in the list) should be "don't 
        care". Also, an ordered list of GLXFBConfigs should be returned so 
        applications can go through the list and apply their own policies to 
        determine the best GLXFBConfig.

    *   Do we want to introduce the notion of "compatible" GLXFBConfigs and 
	visuals? (GLX currently uses the term "similar". GLXContexts and 
	GLXDrawables are similar iff they have been created with respect 
	to the same VisualID and root window.)
   
        A: Yes. The GLX definition of similar visuals is too restrictive 
	(and the glXMakeCurrentRead extension already relaxes it.) This 
	is the right time to agree on a definition since we need to define 
	how GLXFBConfigs match up to X Visuals. Note, that we do not 
	redefine similar; instead a new term, compatible, is introduced.
        In the future, we may want to remove this restriction and allow
        a context to be bound to any drawable. (But a context would still
        be created to do either RGBA or color index rendering.)


New Procedures and Functions

    int glXGetFBConfigAttribSGIX(Display *dpy, 
			         GLXFBConfigSGIX config,
			         int attribute,
			         int *value);
					   
    GLXFBConfigSGIX *glXChooseFBConfigSGIX(Display *dpy, 
				           int screen,
				           const int *attrib_list,
				           int *nelements);
					   
    GLXPixmap glXCreateGLXPixmapWithConfigSGIX(Display *dpy, 
		                   	       GLXFBConfig config,
				   	       Pixmap pixmap);

    GLXContext glXCreateContextWithConfigSGIX(Display *dpy,  
                                              GLXFBConfig config,
					      int render_type,
                                              GLXContext share_list,
				 	      Bool direct);

    XVisualInfo *glXGetVisualFromFBConfigSGIX(Display *dpy,
                                              GLXFBConfig config);

    GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX(Display *dpy,
                                                 XVisualInfo *vis);

New Tokens

    Accepted by the <attribute> parameter of glXGetFBConfigAttribSGIX, and 
    by the <attrib_list> parameter of glXChooseFBConfigSGIX:

        GLX_DRAWABLE_TYPE_SGIX		0x8010
        GLX_RENDER_TYPE_SGIX		0x8011
        GLX_X_RENDERABLE_SGIX		0x8012

    Accepted by the <attribute> parameter of glXGetFBConfigAttribSGIX, the
    <attrib_list> parameter of glXChooseFBConfigSGIX, by the <attribute> 
    parameter of glXQueryGLXPbufferSGIX and by the <attribute> parameter
    of glXQueryContextInfoEXT:

	GLX_FBCONFIG_ID_SGIX		0x8013

    Accepted by the <attribute> parameter of glXGetFBConfigAttribSGIX:
 
        GLX_SCREEN_EXT			0x800C
    
    Returned by glXGetFBConfigAttribSGIX (when <attribute> is set to 
    GLX_DRAWABLE_TYPE_SGIX) and accepted by the <attrib_list> parameter of 
    glXChooseFBConfigSGIX (following the GLX_DRAWABLE_TYPE_SGIX token):

        GLX_WINDOW_BIT_SGIX		0x00000001
	GLX_PIXMAP_BIT_SGIX		0x00000002

    Returned by glXGetFBConfigAttribSGIX (when <attribute> is set to 
    GLX_RENDER_TYPE_SGIX) and accepted by the <attrib_list> parameter of 
    glXChooseFBConfigSGIX (following the GLX_RENDER_TYPE_SGIX token):

        GLX_RGBA_BIT_SGIX		0x00000001
	GLX_COLOR_INDEX_BIT_SGIX	0x00000002

    Accepted by the <render_type> parameter of glXCreateContextWithConfigSGIX:

        GLX_RGBA_TYPE_SGIX		0x8014
	GLX_COLOR_INDEX_TYPE_SGIX	0x8015

Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame buffer)

    In section 4.1.6 (Blending) follow the sentence "If a color buffer has
    no A value, then it is as if the destination A value is 1." with the
    sentence "If the color buffer has no R, G, or B value, then it is as
    if the destination R, G, or B value is 0."

    In section 4.3.2 (Reading Pixels) follow the sentence "If the framebuffer
    does not support alpha values then the A that is obtained is 1.0." with
    the sentence "If the framebuffer does not support red, green, or blue
    values, then the R, G or B that is obtained is 0.0."

Additions to Chapter 5 of the 1.0 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.0 Specification (State and State Requests)

    None

Additions to the GLX Specification

    [Add the following to section 3.2.2 on Configuration Management]

    A GLXFBConfigSGIX describes the format, type and size of the color 
    buffers and ancillary buffers for a GLXDrawable. When the GLXDrawable
    is a window then the GLXFBConfigSGIX that describes it has an associated
    X Visual; for GLXPixmaps and GLXPbuffers there may or may not be an
    X Visual associated with the GLXFBConfigSGIX.

    Use glXChooseFBConfigSGIX to get GLXFBConfigSGIXs that match a
    list of attributes or to get the list of GLXFBConfigSGIXs that are
    available on the specified screen.

        GLXFBConfigSGIX *glXChooseFBConfigSGIX(Display *dpy, 
					  int screen,
					  const int *attrib_list,
				          int *nelements);

    If <attrib_list> is NULL then glXChooseFBConfigSGIX returns an array of 
    GLXFBConfigSGIXs that are available on the specified screen; otherwise this
    call returns an array of GLXFBConfigSGIXs that match the specified attributes. 
    (The attributes are described in Table 3.) The number of elements
    in the array is returned in nelements.   The attributes are matched in 
    an attribute-specific manner, as shown in Table 4. Some of the attributes, 
    such as GLX_LEVEL, must match the specified value exactly; others, such as, 
    GLX_RED_SIZE must meet or exceed the specified minimum values. To retrieve
    the GLXFBConfigSGIX, given an i.d., use the GLX_FBCONFIG_ID_SGIX attribute.
    When GLX_FBCONFIG_ID_SGIX is specified, all other attributes are ignored,
    and only the GLXFBConfigSGIX with the given XID is returned (NULL is returned
    if it does not exist).

    If no conforming GLXFBConfigSGIX exists, or if an error occurs (i.e., an 
    undefined GLX attribute is encountered in <attrib_list>, <screen> is 
    invalid, or <dpy> does not support the GLX extension) then NULL is 
    returned. If <attrib_list> is not NULL and more than one GLXFBConfigSGIX is 
    found, then a list of GLXFBConfigSGIXs, sorted according to the "best"
    match criteria, is returned.  The exact sorting precedence order is 
    defined below.  Use XFree to free the memory returned by
    glXChooseFBConfigSGIX.

    If GLX_RENDER_TYPE_SGIX is in <attrib_list> then the value that follows
    is a mask indicating which type of GLXContexts drawables created with
    the corresponding GLXFBConfigSGIXs be bound to. For example, if 
		GLX_RGBA_BIT_SGIX | GLX_COLOR_INDEX_BIT_SGIX 
    is specified as the mask then glXChooseFBConfigSGIX will search for 
    GLXFBConfigSGIXs that can be used to create drawables that can be bound to both 
    RGBA and color index rendering contexts. The default value for
    GLX_RENDER_TYPE_SGIX is GLX_RGBA_BIT_SGIX. 

    The attribute GLX_DRAWABLE_TYPE_SGIX has as its value a mask indicating
    the drawable types that can be created with the corresponding GLXFBConfigSGIX
    (the config is said to ``support'' these drawable types).
    For example, a GLXFBConfigSGIX for which the value of GLX_DRAWABLE_TYPE_SGIX
    attribute is GLX_WINDOW_BIT_SGIX | GLX_PIXMAP_BIT_SGIX can be used to create
    both Windows and GLX pixmaps, while a config for which this attribute value
    is GLX_WINDOW_BIT_SGIX can not be used for creating GLX pixmaps. The default
    value for GLX_DRAWABLE_TYPE_SGIX is GLX_WINDOW_BIT_SGIX.

    If a GLXFBConfigSGIX supports Windows then it has an associated X Visual. The
    value of the GLX_X_VISUAL_TYPE_EXT attribute specifies the type of X
    Visual. The possible values are:

        GLX token name                  X Visual Type
        --------------                  -------------
        GLX_TRUE_COLOR_EXT              TrueColor
        GLX_DIRECT_COLOR_EXT            DirectColor
        GLX_PSEUDO_COLOR_EXT            PseudoColor
        GLX_STATIC_COLOR_EXT            StaticColor
        GLX_GRAY_SCALE_EXT              GrayScale
        GLX_STATIC_GRAY_EXT             StaticGray

    Note that RGBA rendering may be supported for any of the six Visual types
    but color index rendering is only supported for PseudoColor, StaticColor,
    GrayScale, and StaticGray visuals (i.e., single-channel visuals). The
    GLX_X_VISUAL_TYPE_EXT attribute is ignored if GLX_DRAWABLE_TYPE_SGIX is
    specified in <attrib_list> and the mask that follows does not have
    GLX_WINDOW_BIT_SGIX set.

    GLX_X_RENDERABLE_SGIX is a boolean indicating whether X can be used
    to render into a drawable created with the GLXFBConfigSGIX. This attribute
    is True if the GLXFBConfigSGIX supports Windows and/or GLX pixmaps.

    All attributes in <attrib_list>, including boolean attributes, are 
    immediately followed by the corresponding desired value. The list is 
    terminated with None. If an attribute is not specified in <attrib_list> 
    then the default value (listed in Table 4) is used (it is said to be
    specified implicitly).  For example, if GLX_STEREO is not specified then it
    is assumed to be False.  For some attributes, the default is "don't care"
    meaning that any value is OK for this attribute, so the attribute will not
    be checked.

    When more than one GLXFBConfigSGIX matches the specification, a list of matching
    configurations is returned. The list is sorted according to the following
    precedence rules that are applied in ascending order (i.e., configurations
    that are considered equal by lower numbered rule are sorted by the higher
    numbered rule):

	 1. by GLX_VISUAL_RATING_EXT where the precedence is GLX_NONE_EXT,
	    GLX_SLOW_VISUAL.
	 2. larger total number of RGBA color components (GLX_RED_BITS,
	    GLX_GREEN_BITS, GLX_BLUE_BITS, and GLX_ALPHA_BITS) that have higher
	    number of bits,
	 3. smaller GLX_INDEX_BITS,
	 4. single buffered configuration (GLX_DOUBLE_BUFFER being False)
	    precedes a double buffered one,
	 5. smaller GLX_AUX_BUFFERS,
	 6. smaller GLX_SAMPLE_BUFFERS_SGIS,
	 7. smaller GLX_SAMPLES_SGIS,
	 8. larger GLX_DEPTH_BITS,
	 9. smaller GLX_STENCIL_BITS,
	10. larger total number of accumulation buffer color components
	    (GLX_ACCUM_RED_BITS, GLX_ACCUM_GREEN_BITS, GLX_ACCUM_BLUE_BITS, and
	    GLX_ACCUM_ALPHA_BITS) that have higher number of bits;
	11. sort by GLX_VISUAL_TYPE_EXT where the precedence order is
	    GLX_TRUE_COLOR_EXT, GLX_DIRECT_COLOR_EXT, GLX_PSEUDO_COLOR_EXT,
	    GLX_STATIC_COLOR_EXT, GLX_GRAY_SCALE_EXT, GLX_STATIC_GRAY_EXT,

    To get the value of a GLX attribute for a GLXFBConfigSGIX use

        int glXGetFBConfigAttribSGIX(Display *dpy, 
			             GLXFBConfigSGIX config,
			             int attribute,
			             int *value);

    If glXGetFBConfigAttribSGIX succeeds then it returns Success and the 
    value for the specified attribute is returned in <value>; otherwise 
    it returns one of the following errors:

        GLX_BAD_ATTRIB <attribute> is not a valid GLX attribute 

    Refer to Tables 3 and 4 for a list of valid GLX attributes. 

    Note that a GLXFBConfigSGIX has an associated X Visual iff the 
    GLX_DRAWABLE_TYPE_SGIX value has the GLX_WINDOW_BIT_SGIX bit set. To 
    retrieve the associated visual, call:

      XVisualInfo *glXGetVisualFromFBConfigSGIX(Display *dpy,
                                                GLXFBConfigSGIX config);
  
    If <config> is a valid GLXFBConfigSGIX and it has an associated X Visual then 
    information describing that visual is returned; otherwise NULL is returned.
    Use XFree to free the data returned.

    It is also possible to get a GLXFBConfigSGIX, given visual information:

      GLXFBConfigSGIX glXGetFBConfigFromVisualSGIX(Display *dpy,
                                               XVisualInfo *vis);

    If the visual is valid and supports OpenGL rendering (i.e., if the GLX 
    visual attribute GLX_USE_GL is True) then the associated GLXFBConfigSGIX is 
    returned; otherwise NULL is returned.


    [Change Table 1 caption to read: "GLX Configuration attributes for Visuals" 
     and add the tables below]

    Attribute  		  	    Type     Description
    ---------                 	    ----     -----------
    GLX_BUFFER_SIZE           	    integer  depth of the color buffer
    GLX_LEVEL                 	    integer  frame buffer level
    GLX_DOUBLEBUFFER		    boolean  True if color buffers have
    					     front/back pairs
    GLX_STEREO			    boolean  True if color buffers have
    					     left/right pairs
    GLX_AUX_BUFFERS           	    integer  number of auxiliary color buffers
    GLX_RED_SIZE              	    integer  number of bits of Red in the
    					     framebuffer
    GLX_GREEN_SIZE            	    integer  number of bits of Green in the
    					     framebuffer
    GLX_BLUE_SIZE             	    integer  number of bits of Blue in the
    					     framebuffer
    GLX_ALPHA_SIZE            	    integer  number of bits of Alpha in the
    					     framebuffer
    GLX_DEPTH_SIZE            	    integer  number of bits in the depth buffer
    GLX_STENCIL_SIZE          	    integer  number of bits in the stencil buffer
    GLX_ACCUM_RED_SIZE        	    integer  number of bits of Red in the 
					     accumulation buffer
    GLX_ACCUM_GREEN_SIZE      	    integer  number of bits of Green in the
					     accumulation buffer
    GLX_ACCUM_BLUE_SIZE       	    integer  number of bits of Blue in the 
					     accumulation buffer
    GLX_ACCUM_ALPHA_SIZE      	    integer  number of bits of Alpha in the
					     accumulation buffer
    GLX_SAMPLE_BUFFERS_SGIS   	    integer  number of multisample buffers
    GLX_SAMPLES_SGIS          	    integer  number of samples stored in each
					     multisample buffer
    GLX_X_VISUAL_TYPE_EXT	    integer  X visual type of the associated visual
    GLX_TRANSPARENT_TYPE_EXT 	    enum     GLX_NONE_EXT,
			                     TRANSPARENT_RGB_EXT, or 
			                     TRANSPARENT_INDEX_EXT
    GLX_TRANSPARENT_INDEX_VALUE_EXT integer  transparent index value.
    GLX_TRANSPARENT_RED_VALUE_EXT   integer  transparent red value.
    GLX_TRANSPARENT_GREEN_VALUE_EXT integer  transparent green value.
    GLX_TRANSPARENT_BLUE_VALUE_EXT  integer  transparent blue value.
    GLX_TRANSPARENT_ALPHA_VALUE_EXT integer  transparent alpha value.
    GLX_VISUAL_CAVEAT_EXT	    enum     GLX_NONE_EXT or GLX_SLOW_VISUAL_EXT
    GLX_DRAWABLE_TYPE_SGIX	    bitmask  mask indicating which GLX drawables
					     are supported.  Valid bits are
					     GLX_WINDOW_BIT_SGIX and
					     GLX_PIXMAP_BIT_SGIX
    GLX_RENDER_TYPE_SGIX	    bitmask  mask indicating which OpenGL
					     rendering modes are
					     supported. Valid bits are
					     GLX_RGBA_BIT_SGIX and
					     GLX_COLOR_INDEX_SGIX.
    GLX_X_RENDERABLE_SGIX     	    boolean  True if X can render to drawable
    GLX_FBCONFIG_ID_SGIX	    XID      i.d. of GLXFBConfigSGIX

    Table 3: GLXFBConfigSGIX attributes (Note that GLX_RGBA and GLX_USE_GL
             are not supported for GLXFBConfigSGIXs)

    Attribute  		  	     Default		        Sorting Criterion
    ---------                 	     -------			-----------------
    GLX_BUFFER_SIZE		     0				smaller
    GLX_LEVEL			     0				exact
    GLX_DOUBLEBUFFER		     don't care			smaller
    GLX_STEREO			     False			exact
    GLX_AUX_BUFFERS		     0				smaller
    GLX_RED_SIZE		     0				larger
    GLX_GREEN_SIZE		     0				larger
    GLX_BLUE_SIZE		     0				larger
    GLX_ALPHA_SIZE		     0				larger
    GLX_DEPTH_SIZE		     0				larger
    GLX_STENCIL_SIZE		     0				larger
    GLX_ACCUM_RED_SIZE		     0				larger
    GLX_ACCUM_GREEN_SIZE	     0				larger
    GLX_ACCUM_BLUE_SIZE		     0				larger
    GLX_ACCUM_ALPHA_SIZE	     0				larger
    GLX_SAMPLE_BUFFERS_SGIS	     0				smaller
    GLX_SAMPLES_SGIS		     0				smaller
    GLX_X_VISUAL_TYPE_EXT	     don't care			exact
    GLX_TRANSPARENT_TYPE_EXT	     GLX_NONE_EXT		exact
    GLX_TRANSPARENT_INDEX_VALUE_EXT  don't care			exact
    GLX_TRANSPARENT_RED_VALUE_EXT    don't care			exact
    GLX_TRANSPARENT_GREEN_VALUE_EXT  don't care			exact
    GLX_TRANSPARENT_BLUE_VALUE_EXT   don't care			exact
    GLX_TRANSPARENT_ALPHA_VALUE_EXT  don't care			exact
    GLX_VISUAL_CAVEAT_EXT	     don't care			exact
    GLX_DRAWABLE_TYPE_SGIX	     GLX_WINDOW_BIT_SGIX	mask
    GLX_RENDER_TYPE_SGIX	     GLX_RGBA_BIT_SGIX          mask
    GLX_X_RENDERABLE_SGIX	     don't care			exact
    GLX_FBCONFIG_ID_SGIX	     don't care			exact

    Table 4: Default values and match criteria for GLXFBConfigSGIX attributes.  The
             definition of the sorting criteria is as follow:
	     smaller - configs with attribute value that meets or exceeds the
	       specified value are returned, with precedence given to smaller
	       values (when a value is not explicitly requested, the default is
	       implied);
	     larger - when the value is requested explicitly, only configs
	       with a corresponding attribute value that meet or exceed the
	       specified value are returned, with precedence given to larger
	       values.  When the value is not requested explicitly behaves exactly
	       like the ``smaller'' criterion.
	     exact - only configs whose corresponding attribute value exactly
	       matches the requested value are considered.
	     mask - only configs for which the set bits of corresponding
	       attribute include all the bits that are set in the requested
	       value are considered (Additional bits might be set in the
	       attribute).

    [Add the following to section 3.2.3 on Offscreen Rendering]

    To create a GLX pixmap using a GLXFBConfigSGIX use 

      GLXPixmap glXCreateGLXPixmapWithConfigSGIX(Display *dpy, 
		                   	         GLXFBConfigSGIX config,
				   	         Pixmap pixmap);

    This call is identical to glXCreateGLXPixmap except that the GLXPixmap 
    is created with color buffers and ancillary buffers as specified by 
    <config>. If <config> is not a valid GLXFBConfigSGIX, or if it does not
    support pixmap rendering then a GLXBadFBConfigSGIX error is generated.


    [Add the following to section 3.2.4 on Rendering Contexts]

    To create a GLX context using a GLXFBConfigSGIX call

      GLXContext glXCreateContextWithConfigSGIX(Display *dpy,  
                                                GLXFBConfigSGIX config,
					        int render_type,
						GLXContext share_list,
						Bool direct);

    This call is identical to glXCreateContext except that the resulting 
    GLXContext can be used to render to any "compatible" GLXDrawable. A
    GLXContext and a GLXDrawable are compatible if
        - the render_type attribute for the context is supported by the
          GLXFBConfigSGIX that the drawable was created with. (e.g., if the
          context was created with render_type GLX_RGBA_TYPE_SGIX, then
          the GLXFBConfigSGIX's GLX_RENDER_TYPE_SGIX attribute must have
          the GLX_RGBA_BIT_SGIX bit set.)
        - all color buffers and ancillary buffers that exist in both 
	  GLXFBConfigSGIXs have the same depth. For example, a GLXDrawable that 
	  had a front left buffer and a back left buffer with red, green and 
	  blue sizes of 4 would not be compatible with a GLXFBConfigSGIX that had 
	  only a front left buffer with red, green and blue sizes of 8. However,
    	  it would be compatible with a GLXFBConfigSGIX that had only a front left 
 	  buffer if the red, green and blue sizes were 4.

    glXCreateContextWithConfigSGIX can generate the following errors: 
    GLXBadContext if <share_list> is neither zero nor a valid GLX
    rendering context; GLXBadFBConfigSGIX if <config> is not a valid 
    GLXFBConfigSGIX; BadMatch if <share_list> defines an address space that
    cannot be shared with the newly created context or if <share_list>
    was created on a different screen than the one referenced by <config>;
    BadAlloc if the server does not have enough resources to allocate the
    new context; BadValue if <render_type> does not refer to a valid
    rendering type.


    [Add to description of glXMakeCurrent]

    No error will be generated if the value of DRAW_BUFFER in <ctx> 
    indicates a color buffer that is not supported by <drawable>.
    In this case, all rendering will behave as if DRAW_BUFFER was 
    set to NONE. The same goes for READ_BUFFER: no error will be 
    generated if it does not correspond to a valid color buffer;
    subsequent glReadPixel and glCopyPixel operations will simply 
    return invalid data.

    Note that it is an error to later call glDrawBuffer and/or glReadBuffer
    (even if they are implicitly called via glPopAttrib) and specify
    a color buffer that is not supported by <drawable>.  Also
    subsequent calls to glCopyPixels, that specify an unsupported
    ancillary buffer, will result in an error.

    [Add to table listing GLX context attributes for glXQueryContextInfoEXT]

    GLX context attribute   type    context information
    ---------------------   ----    -------------------
    GLX_FBCONFIG_ID_SGIX    XID     FBConfig id


GLX Protocol

	Three newGLX protocol commands are added.

	GetFBConfigsSGIX
	    1		CARD8		opcode (X assigned)
	    1		17		GLX opcode (glXVendorPrivateWithReply)
	    2		4		request length
	    4		65540		vendor specific opcode
	    4				unused
	    4		CARD32		screen
	  =>
	    1		1		reply
	    1				unused
	    2		CARD16		sequence number
	    4		n*m		length
	    4		n		numFBConfigs
	    4		m		numAttribs
	    20				unused
	    8 * n	LISTofATTRIB	properties
	
	     Where n is the number of FBConfigs returned and m is the number
	     of attributes returned for each FBConfig.  Both m and n are
	     of type CARD32.


	CreateContextWithConfigSGIX
	    1		CARD8		opcode (X assigned)
	    1		17		GLX opcode (glXVendorPrivateWithReply)
	    2		9		request length
	    4		65541		vendor specific opcode
	    4				unused
	    4		GLX_CONTEXT	context
	    4		GLX_FBCONFIG	fbconfig
	    4		CARD32		screen
	    4		CARD32		renderType
	    4		GLX_CONTEXT	shareList
	    1		BOOL		isDirect
	    1		CARD8		reserved1
	    1		CARD16		reserved2
	    

	CreateGLXPixmapWithConfigSGIX
	    1		CARD8		opcode (X assigned)
	    1		17		GLX opcode (glXVendorPrivateWithReply)
	    2		7		request length
	    4		65542		vendor specific opcode
	    4				unused
	    4		CARD32		screen
	    4		GLX_FBCONFIG	fbconfig
	    4		CARD32		pixmap
	    4		GLX_PIXMAP	glxpixmap


Dependencies on SGIS_multisample

    If SGIS_multisample is not supported, references to
    GLX_SAMPLE_BUFFERS_SGIS and GLX_SAMPLES_SGIS in this document are
    invalid and should be ignored.

Dependencies on EXT_visual_info

    If EXT_visual_info is not supported, references to
    GLX_X_VISUAL_TYPE_EXT, GLX_TRANSPARENT_TYPE_EXT,
    GLX_TRANSPARENT_INDEX_VALUE_EXT, GLX_TRANSPARENT_RED_VALUE_EXT,
    GLX_TRANSPARENT_GREEN_VALUE_EXT, GLX_TRANSPARENT_BLUE_VALUE_EXT,
    GLX_TRANSPARENT_ALPHA_VALUE_EXT, GLX_TRUE_COLOR_EXT, 
    GLX_DIRECT_COLOR_EXT, GLX_PSEUDO_COLOR_EXT, GLX_STATIC_COLOR_EXT, 
    GLX_GRAY_SCALE_EXT, and GLX_STATIC_GRAY_EXT, in this document 
    are invalid and should be ignored.
    
Dependencies on EXT_visual_rating

    If EXT_visual_rating is not supported, references to GLX_VISUAL_CAVEAT_EXT 
    and GLX_SLOW_VISUAL_EXT, in this document are invalid and should be ignored.

Dependencies on EXT_import_context

    If EXT_import_context is not supported, references to glXQueryContextInfoEXT
    in this document should be ignored.

Dependencies on SGIX_pbuffer

    If SGIX_pbuffer is not supported, references to glXQueryGLXPbufferSGIX
    and GLXPbuffer in this document should be ignored.


Errors

    One new GLX error is introduced: 

	GLXBadFBConfigSGIX

New State

    None

New Implementation Dependent State

    None
