• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Name
2
3    SGIX_pbuffer
4
5Name Strings
6
7    GLX_SGIX_pbuffer
8
9Version
10
11    Version 1.29, 2009/11/19
12
13Number
14
15    50
16
17Dependencies
18
19    SGIX_FBConfig is required
20    SGIS_multisample affects the definition of this extension
21
22Overview
23
24    This extension defines pixel buffers (GLXPbuffers, or pbuffer for
25    short). GLXPbuffers are additional non-visible rendering buffers for an
26    OpenGL renderer.  GLXPbuffers are equivalent to GLXPixmaps with the
27    following exceptions:
28
29    1.	There is no associated X pixmap. Also, since a GLXPbuffer is a GLX
30        resource, it may not be possible to render to it using X or an
31   	X extension other than GLX.
32
33    2.	The format of the color buffers and the type and size of any
34     	associated ancillary buffers for a GLXPbuffer can only be
35        described with a GLXFBConfig -- an X Visual cannot be used.
36
37    3.	It is possible to create a GLXPbuffer whose contents may be
38	asynchronously lost at any time.
39
40    4.  GLXPbuffers can be rendered to using either direct or indirect
41        rendering contexts.
42
43    5.  The allocation of a GLXPbuffer can fail if there are insufficient
44	resources (i.e., all the pbuffer memory has been allocated and
45	the implementation does not virtualize pbuffer memory.)
46
47    The intent of the pbuffer semantics is to enable implementations to
48    allocate pbuffers in non-visible frame buffer memory.  These
49    pbuffers are intended to be "static" resources, in that a program
50    will typically allocate them only once, rather than as a part of its
51    rendering loop.  (But they should be deallocated when the program is
52    no longer using them -- for example, if the program is iconified.)
53    The frame buffer resources that are associated with a pbuffer are
54    also static, and are deallocated only when the pbuffer is destroyed,
55    or, in the case of a "unpreserved" pbuffer, as a result of X server
56    activity that changes its frame buffer requirements.
57
58
59Issues
60
61    *   Should the optimum width and height be fixed sizes or a multiple?
62
63    *   Any better names for GLX_BUFFER_CLOBBER_MASK_SGIX, etc?
64
65    UM  Should we add a command so an application can set the behavior
66        when a deep window buffer (e.g., depth buffer or multisample buffer)
67        is clobbered by a pbuffer? The choices would be "preserved" or
68        "unpreserved".
69
70    *   When a pbuffer interferes with a window's ancillary buffer should
71        the action -- swapped or saved -- be specified or left as
72	implementation dependent?
73
74
75New Procedures and Functions
76
77    GLXPbuffer glXCreateGLXPbufferSGIX(Display *dpy,
78				       GLXFBConfig config,
79				       unsigned int width,
80				       unsigned int height,
81				       int *attrib_list);
82
83    void glXDestroyGLXPbufferSGIX(Display *dpy,
84			          GLXPbuffer pbuf);
85
86    void glXQueryGLXPbufferSGIX(Display *dpy,
87			        GLXPbuffer pbuf,
88			        int attribute,
89			        unsigned int *value);
90
91    void glXSelectEventSGIX(Display *dpy,
92	  		    GLXDrawable drawable,
93			    unsigned long mask);
94
95    void glXGetSelectedEventSGIX(Display *dpy,
96  		                 GLXDrawable drawable,
97			         unsigned long *mask);
98
99
100New Tokens
101
102    Accepted by the <attribute> parameter of glXGetFBConfigAttribSGIX:
103
104        GLX_MAX_PBUFFER_WIDTH_SGIX		0x8016
105        GLX_MAX_PBUFFER_HEIGHT_SGIX		0x8017
106        GLX_MAX_PBUFFER_PIXELS_SGIX		0x8018
107        GLX_OPTIMAL_PBUFFER_WIDTH_SGIX		0x8019
108        GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX		0x801A
109
110    Returned by glXGetFBConfigAttribSGIX (when <attribute> is set to
111    GLX_DRAWABLE_TYPE_SGIX) and accepted by the <attrib_list> parameter of
112    glXChooseFBConfigSGIX (following the GLX_DRAWABLE_TYPE_SGIX token):
113
114	GLX_PBUFFER_BIT_SGIX			0x00000004
115
116    Accepted by the <attrib_list> parameter of glXCreateGLXPbufferSGIX
117    and by the <attribute> parameter of glXQueryGLXPbufferSGIX:
118
119        GLX_PRESERVED_CONTENTS_SGIX		0x801B
120        GLX_LARGEST_PBUFFER_SGIX		0x801C
121
122    Accepted by the <attribute> parameter of glXQueryGLXPbufferSGIX:
123
124        GLX_WIDTH_SGIX 				0x801D
125        GLX_HEIGHT_SGIX				0x801E
126	GLX_EVENT_MASK_SGIX			0x801F
127
128    Accepted by the <mask> parameter of glXSelectEventSGIX and returned
129    in the <mask> parameter of glXGetSelectedEventSGIX:
130
131	GLX_BUFFER_CLOBBER_MASK_SGIX  		0x08000000
132
133    Returned in the <event_type> field of a "buffer clobber" event:
134
135	GLX_DAMAGED_SGIX 			0x8020
136	GLX_SAVED_SGIX				0x8021
137
138    Returned in the <draw_type> field of a "buffer clobber" event:
139
140        GLX_WINDOW_SGIX				0x8022
141	GLX_PBUFFER_SGIX			0x8023
142
143    Returned in the <mask> field of a "buffer clobber" event:
144
145	GLX_FRONT_LEFT_BUFFER_BIT_SGIX		0x00000001
146	GLX_FRONT_RIGHT_BUFFER_BIT_SGIX		0x00000002
147	GLX_BACK_LEFT_BUFFER_BIT_SGIX		0x00000004
148	GLX_BACK_RIGHT_BUFFER_BIT_SGIX		0x00000008
149	GLX_AUX_BUFFERS_BIT_SGIX		0x00000010
150	GLX_DEPTH_BUFFER_BIT_SGIX		0x00000020
151	GLX_STENCIL_BUFFER_BIT_SGIX		0x00000040
152	GLX_ACCUM_BUFFER_BIT_SGIX		0x00000080
153	GLX_SAMPLE_BUFFERS_BIT_SGIX		0x00000100
154
155Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)
156
157    None
158
159Additions to Chapter 3 of the 1.0 Specification (Rasterization)
160
161    None
162
163Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
164and the Frame buffer)
165
166    None
167
168Additions to Chapter 5 of the 1.0 Specification (Special Functions)
169
170    None
171
172Additions to Chapter 6 of the 1.0 Specification (State and State Requests)
173
174    None
175
176Additions to the GLX Specification
177
178    [Add the following to section 3.2.2 on Configuration Management]
179
180    [Add to glXGetFBConfigAttribSGIX]:
181
182    GLX_MAX_PBUFFER_WIDTH_SGIX and GLX_MAX_PBUFFER_HEIGHT_SGIX indicate the
183    maximum width and height that can be passed into glXCreateGLXPbufferSGIX and
184    GLX_MAX_PBUFFER_PIXELS_SGIX indicates the maximum number of pixels (width x
185    hieght) for a GLXPbuffer. Note that an implementation may return a value for
186    GLX_MAX_PBUFFER_PIXELS_SGIX that is less than the maximum width times the
187    maximum height. Also, the value for GLX_MAX_PBUFFER_PIXELS_SGIX is static
188    and assumes that no other pbuffers or X resources are contending for the
189    framebuffer memory. Thus it may not be possible to allocate a pbuffer of
190    the size given by GLX_MAX_PBUFFER_PIXELS_SGIX.
191
192    On some implementations, there may be an optimum width and height to use
193    when allocating a pbuffer. (For example, the implementation may use fixed
194    size tiles to allocate pbuffers.) Use GLX_OPTIMAL_PBUFFER_WIDTH_SGIX and
195    GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX to determine this width and height. If the
196    values are zero then there is no optimal value.
197
198    [Add to glXChooseFBConfigSGIX]:
199
200    If GLX_OPTIMAL_PBUFFER_WIDTH_SGIX and/or GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX
201    are specified in <attrib_list> then they are ignored.
202
203    [Additions to tables 2 and 3, given in SGIX_FBConfig]
204
205      Attribute                       Type        Description
206      ---------                       ----        -----------
207      GLX_BUFFER_SIZE                 integer     depth of the color buffer
208      GLX_LEVEL                       integer     frame buffer level
209      GLX_DOUBLEBUFFER                boolean     True if color buffers have
210						  front/back pairs
211      GLX_STEREO                      boolean     True if color buffers have
212				      		  left/right pairs
213      GLX_AUX_BUFFERS                 integer     number of auxiliary color
214						  buffers
215      GLX_RED_SIZE                    integer     number of bits of Red if in
216      						  RGB mode
217      GLX_GREEN_SIZE                  integer     number of bits of Green if in
218      						  RGB mode
219      GLX_BLUE_SIZE                   integer     number of bits of Blue if in
220      						  RGB mode
221      GLX_ALPHA_SIZE                  integer     number of bits of Alpha if in
222      						  RGB mode
223      GLX_DEPTH_SIZE                  integer     number of bits in the depth
224      						  buffer
225      GLX_STENCIL_SIZE                integer     number of bits in the stencil
226      						  buffer
227      GLX_ACCUM_RED_SIZE              integer     number of bits of Red in the
228       						  accumulation buffer
229      GLX_ACCUM_GREEN_SIZE            integer     number of bits of Green in the
230      						  accumulation buffer
231      GLX_ACCUM_BLUE_SIZE             integer     number of bits of Blue in the
232      accumulation buffer
233      GLX_ACCUM_ALPHA_SIZE            integer     number of bits of Alpha in the
234      						  accumulation buffer
235      GLX_SAMPLE_BUFFERS_SGIS         integer     number of multisample buffers
236      GLX_SAMPLES_SGIS                integer     number of samples stored in
237						  each multisample buffer
238      GLX_X_VISUAL_TYPE_EXT           integer     X visual type of the
239						  associated visual
240      GLX_TRANSPARENT_TYPE_EXT        enum        GLX_NONE_EXT,
241                                                  TRANSPARENT_RGB_EXT, or
242                                                  TRANSPARENT_INDEX_EXT
243      GLX_TRANSPARENT_INDEX_VALUE_EXT integer     transparent index value.
244      GLX_TRANSPARENT_RED_VALUE_EXT   color       transparent color value.
245      GLX_TRANSPARENT_GREEN_VALUE_EXT color       transparent color value.
246      GLX_TRANSPARENT_BLUE_VALUE_EXT  color       transparent color value.
247      GLX_TRANSPARENT_ALPHA_VALUE_EXT color       transparent color value.
248      GLX_VISUAL_CAVEAT_EXT           enum        GLX_NONE_EXT or
249      						  GLX_SLOW_VISUAL_EXT
250      GLX_DRAWABLE_TYPE_SGIX          bitmask     mask indicating which GLX
251      						  drawables are supported. Valid
252						  bits are GLX_WINDOW_BIT_SGIX and
253                                                  GLX_PIXMAP_BIT_SGIX
254      GLX_RENDER_TYPE_SGIX            bitmask     mask indicating which OpenGL
255      						  rendering modes are supported.
256						  Valid bits are GLX_RGBA_BIT_SGIX
257						  and GLX_COLOR_INDEX_SGIX.
258      GLX_X_RENDERABLE_SGIX           boolean     True if X can render to drawable
259      GLX_MAX_PBUFFER_WIDTH_SGIX      integer	  maximum width of GLXPbuffer
260      GLX_MAX_PBUFFER_HEIGHT_SGIX     integer	  maximum height of GLXPbuffer
261      GLX_MAX_PBUFFER_PIXELS_SGIX     integer	  maximum size of GLXPbuffer
262      GLX_OPTIMAL_PBUFFER_WIDTH_SGIX  integer     best width to use when
263						  creating pbuffer, or zero if
264						  all widths are equally good.
265      GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX integer     best height to use when creating
266						  pbuffer, or zero if all
267						  heights are equally good.
268
269      Table 3: GLX configuration attributes for GLXFBConfigs (Note that
270               GLX_RGBA and GLX_USE_GL are not supported)
271
272      Attribute                               Default             Match Criteria
273      ---------                               -------             --------------
274      GLX_BUFFER_SIZE                         0                   minimum
275      GLX_LEVEL                               0                   exact
276      GLX_DOUBLEBUFFER                        don't care          exact
277      GLX_STEREO                              False               exact
278      GLX_AUX_BUFFERS                         0                   minimum
279      GLX_RED_SIZE                            0                   minimum
280      GLX_GREEN_SIZE                          0                   minimum
281      GLX_BLUE_SIZE                           0                   minimum
282      GLX_ALPHA_SIZE                          0                   minimum
283      GLX_DEPTH_SIZE                          0                   minimum
284      GLX_STENCIL_SIZE                        0                   minimum
285      GLX_ACCUM_RED_SIZE                      0                   minimum
286      GLX_ACCUM_GREEN_SIZE                    0                   minimum
287      GLX_ACCUM_BLUE_SIZE                     0                   minimum
288      GLX_ACCUM_ALPHA_SIZE                    0                   minimum
289      GLX_SAMPLE_BUFFERS_SGIS                 0                   minimum
290      GLX_SAMPLES_SGIS                        0                   minimum
291      GLX_X_VISUAL_TYPE_EXT                   don't care          exact
292      GLX_TRANSPARENT_PIXEL_EXT               GLX_NONE_EXT        exact
293      GLX_TRANSPARENT_INDEX_VALUE_EXT         don't care          exact
294      GLX_TRANSPARENT_RED_VALUE_EXT           don't care          exact
295      GLX_TRANSPARENT_GREEN_VALUE_EXT         don't care          exact
296      GLX_TRANSPARENT_BLUE_VALUE_EXT          don't care          exact
297      GLX_TRANSPARENT_ALPHA_VALUE_EXT         don't care          exact
298      GLX_VISUAL_CAVEAT_EXT                   don't care          exact
299      GLX_DRAWABLE_TYPE_SGIX                  GLX_WINDOW_BIT_SGIX minimum
300      GLX_RENDER_TYPE_SGIX                    GLX_RGBA_BIT_SGIX   minimum
301      GLX_X_RENDERABLE_SGIX                   don't care          exact
302      GLX_FBCONFIG_ID_SGIX                    don't care          exact
303      GLX_MAX_PBUFFER_WIDTH_SGIX      	      0 		  minimum
304      GLX_MAX_PBUFFER_HEIGHT_SGIX    	      0			  minimum
305      GLX_MAX_PBUFFER_PIXELS_SGIX             0 		  minimum
306      GLX_OPTIMAL_PBUFFER_WIDTH_SGIX          ignored		  ignored
307      GLX_OPTIMAL_PBUFFER_HEIGHT_SGIX         ignored		  ignored
308
309      Table 4: Default values and match criteria for GLX configuration
310               attributes for GLXFBConfigs
311
312
313    [Add the following to section 3.2.3 on Offscreen Rendering]
314
315    To create a GLXPbuffer call:
316
317        GLXPbuffer glXCreateGLXPbufferSGIX(Display *dpy,
318				           GLXFBConfig config,
319				           unsigned int width,
320				           unsigned int height,
321				           int *attrib_list);
322
323    This creates a single GLXPbuffer and returns its XID. <width> and <height>
324    specify the pixel width and height of the rectangular pbuffer and
325    <attrib_list> specifies a list of attributes for the pbuffer. Currently
326    only two attributes can be specified in <attrib_list>:
327    GLX_PRESERVED_CONTENTS_SGIX and GLX_LARGEST_PBUFFER_SGIX.
328
329    <attrib_list> can be either NULL, in which case all the attributes assume
330    their default values as described below.  If it not NULL then its format is
331    similar to the attribute list paramter of glXChooseFBConfigSGIX: each
332    attribute is immediately followed by the corresponding desired value and the
333    list is terminated with None.
334
335    Use GLX_LARGEST_PBUFFER_SGIX to get the largest available pbuffer when
336    the allocation of the pbuffer would otherwise fail.  The width or height
337    of the allocated pbuffer never exceed <width> and <height>,
338    respectively. Use glXQueryGLXPbufferSGIX to retrieve the dimensions of the
339    allocated pbuffer.  By default, GLX_LARGEST_PBUFFER_SGIX is False.
340
341    If the GLX_PRESERVED_CONTENTS_SGIX attribute is set to False in
342    <attrib_list>, then an "unpreserved" pbuffer is created and the contents
343    of the pbuffer may be lost at any time. If this attribute is not
344    specified, or if it is specified as True in <attrib_list>, then when a
345    resource conflict occurs the contents of the pbuffer will be preserved
346    (most likely by swapping out portions of the buffer to main memory).  In
347    either case, the client can register to receive a "buffer clobber" event
348    which is generated when the pbuffer contents have been preserved or have
349    been damaged. (See the event description.)
350
351    The resulting pbuffer will contain color buffers and ancillary as
352    specified by <config>.  Note that pbuffers use framebuffer
353    resources so applications should consider deallocating them when
354    they are not in use.
355
356    It is possible to create a pbuffer with back buffers and to swap
357    the front and back buffers by calling glXSwapBuffers.  The contents
358    of the back buffers are undefined after such a swap.  (Pbuffers are
359    the same as windows in this respect.)
360
361    Any GLX rendering context created with a GLXFBConfig or X Visual that is
362    "compatible" with the <config> may be used to render into the pbuffer. (See
363    description of glXCreateContextWithConfigSGIX, glXMakeCurrent and
364    glXMakeCurrentReadSGI for definition of "compatible".)  If a pbuffer is
365    created with GLX_PRESERVED_CONTENTS_SGIX set to False, then portion of the
366    buffer contents may be lost at any time due to frame buffer resource
367    conflicts.  Once the contents of a "non preserved" pbuffer has been lost it
368    is considered to be in a "damaged" state.  It is not an error to render to a
369    pbuffer that is in this state but the effect of rendering to it is
370    undefined. It is also not an error to query the pixel contents of such a
371    pbuffer, but the values of the returned pixels are undefined.  Note, that
372    while this specification allows for non preserved pbuffers to be damaged as
373    a result of other pbuffer activity, the intent is to only have visible
374    windows activity "damage" pbuffers.
375
376    Since the contents of a "unpreserved" pbuffer can be lost at anytime
377    with only asynchronous notification (via the "buffer clobber" event), the
378    only way a client can guarantee that valid pixels are read back with
379    glReadPixels is by grabbing the X server. (Note that this operation is
380    potentially expensive and should not be done frequently. Also, since this
381    locks out other X clients, it should only be done for short periods of
382    time.) Clients that don't wish to do this can check if the data returned
383    by glReadPixels is valid by calling XSync and then checking the event
384    queue for "buffer clobber" events (assuming that these events had been
385    pulled off of the queue prior to the glReadPixels call).
386
387    When glXCreateGLXPbufferSGIX fails to create a GLXPbuffer due to
388    insufficient resources, a BadAlloc error is generated and None is
389    returned. If <config> is not a valid GLXFBConfig then a GLXBadFBConfigSGIX
390    error is generated; if <config> does not support GLXPbuffers then a BadMatch
391    error is generated.
392
393    A GLXPbuffer is destroyed by calling:
394
395        void glXDestroyGLXPbufferSGIX(Display *dpy,
396			              GLXPbuffer pbuf);
397
398    The GLXPbuffer will be destroyed once it is no longer current to any
399    client. When a GLXPbuffer is destroyed, any memory resources that are
400    attached to it are freed, and its XID is made available for reuse.
401
402    If <pbuf> is not a valid GLXPbuffer then a GLXBadPbufferSGIX error
403    is generated.
404
405    To query an attribute associated with a GLXPbuffer call
406
407        void glXQueryGLXPbufferSGIX(Display* dpy,
408			            GLXPbuffer pbuf,
409			            int attribute,
410			            unsigned int *value);
411
412    <attribute> must be set to one of GLX_WIDTH_SGIX, GLX_HEIGHT_SGIX,
413    GLX_PRESERVED_CONTENTS_SGIX, GLX_LARGEST_PBUFFER_SGIX, or
414    GLX_FBCONFIG_ID_SGIX.
415
416    To get the GLXFBConfig for a GLXPbuffer, first retrieve the i.d.  for the
417    FBConfig and then call glXChooseFBConfigSGIX.
418
419    If <pbuf> is not a valid GLXPbuffer then a GLXBadPbufferSGIX error is
420    generated.
421
422
423    [Add new section, Events]
424
425    A client can ask to receive GLX events on a window or GLXPbuffer.
426
427      void glXSelectEventSGIX(Display *dpy,
428	  		      GLXDrawable drawable,
429			      unsigned long mask);
430
431    Currently only one GLX event, GLX_BUFFER_CLOBBER_MASK_SGIX, can be selected:
432
433      typdef struct {
434	int event_type;	      /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */
435        int draw_type;        /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */
436	unsigned long serial; /* # of last request processed by server */
437	Bool send_event;      /* event was generated by a SendEvent request */
438        Display *display;     /* display the event was read from */
439        GLXDrawable drawable; /* i.d. of Drawable */
440        unsigned int mask;    /* mask indicating which buffers are affected*/
441        int x, y;
442        int width, height;
443        int count;            /* if nonzero, at least this many more */
444      } GLXBufferClobberEventSGIX;
445
446    A single X server operation can cause several "buffer clobber" events to be
447    sent. (e.g., a single pbuffer may be damaged and cause multiple "buffer
448    clobber" events to be generated). Each event specifies one region of the
449    GLXDrawable that was affected by the X Server operation. <mask> indicates
450    which color or ancillary buffers were affected. All the "buffer clobber"
451    events generated by a single X server action are guaranteed to be contiguous
452    in the event queue. The conditions under which this event is generated and
453    the event <type> varies, depending on the type of the GLXDrawable.
454
455    For "preserved" pbuffers, a "buffer clobber" event, with <type>
456    GLX_SAVED_SGIX, is generated whenever the contents of a pbuffer has to be
457    moved to avoid being damaged.  The event(s) describes which portions of the
458    pbuffer were affected. Clients who receive many "buffer clobber" events,
459    referring to different save actions, should consider freeing the pbuffer
460    resource in order to prevent the system from thrashing due to insufficient
461    resources.
462
463    For an "unpreserved" pbuffer a "buffer clobber" event, with <type>
464    GLX_DAMAGED_SGIX, is generated whenever a portion of the pbuffer becomes
465    invalid.
466
467    For Windows, "buffer clobber" events, with <type> GLX_DAMAGED_SGIX or
468    GLX_SAVED_SGIX, occur whenever an ancillary buffer, associated with the
469    window, gets clobbered or moved out of offscreen memory. The event contains
470    information indicating which color or ancillary buffers, and which
471    portions of those buffers, were affected.
472
473    Calling glXSelectEventSGIX overrides any previous event mask that was set by
474    the client for <drawable>. Note that a separate event mask is maintained for
475    each client that requested "clobber events" for <drawable>.
476
477    If <drawable> is not a valid GLXPbuffer or a valid Window, a GLXBadDrawable
478    error is generated.
479
480    To find out which GLX events are selected for a window or GLXPbuffer call
481
482      void glXGetSelectedEventSGIX(Display *dpy,
483	  		           GLXDrawable drawable,
484			           unsigned long *mask);
485
486
487GLX Protocol
488
489	Four new GLX protocol commands are added.
490
491	CreateGLXPbufferSGIX
492	    1		CARD8		opcode (X assigned)
493	    1		17		GLX opcode (glXVendorPrivateWithReply)
494	    2		8 + 2n		request length
495	    4		65543		vendor specific opcode
496	    4				unused
497	    4		CARD32		screen
498	    4		GLX_FBCONFIG	fbconfig
499	    4		GLX_PBUFFER	pbuffer
500	    4		CARD32		width
501	    4		CARD32		height
502	    8 * n	LISTofATTRIB	properties
503
504	     Where n is the number of token/value pairs.  Each token value is
505	     either a CARD32, BOOL32, or INT32, followed by an attribute
506	     value which is also either a CARD32, BOOL32, or INT32.
507
508
509	DestroyGLXPbufferSGIX
510	    1		CARD8		opcode (X assigned)
511	    1		17		GLX opcode (glXVendorPrivateWithReply)
512	    2		4		request length
513	    4		65544		vendor specific opcode
514	    4				unused
515	    4		GLX_PBUFFER	pbuffer
516
517
518	ChangeDrawableAttributesSGIX
519	    1		CARD8		opcode (X assigned)
520	    1		17		GLX opcode (glXVendorPrivateWithReply)
521	    2		4 + 2*n		request length
522	    4		65545		vendor specific opcode
523	    4				unused
524	    4		GLX_DRAWABLE	drawable
525	    8 * n	LISTofATTRIB	properties
526
527	     Where n is the number of token/value pairs.  Each token value is
528	     either a CARD32, BOOL32, or INT32, followed by an attribute
529	     value which is also either a CARD32, BOOL32, or INT32.
530
531
532	GetDrawableAttributesSGIX
533	    1		CARD8		opcode (X assigned)
534	    1		17		GLX opcode (glXVendorPrivateWithReply)
535	    2		4 + 2n		request length
536	    4		65546		vendor specific opcode
537	    4				unused
538	    4		GLX_DRAWABLE	drawable
539	  =>
540	    1		1		reply
541	    1				unused
542	    2		CARD16		sequence number
543	    4		2*n		length
544	    4		CARD32		numAttribs
545	    20				unused
546	    8 * n	LISTofATTRIB	properties
547
548	     Where n is the number of token/value pairs.  Each token value is
549	     either a CARD32, BOOL32, or INT32, followed by an attribute
550	     value which is also either a CARD32, BOOL32, or INT32.
551
552    One new event is added:
553
554	BEC is the base event code for the extension, as returned by
555	XQueryExtension.
556
557	GLX_BUFFER_CLOBBER_MASK_SGIX
558	    1		BEC+16		code
559	    1				unused
560	    2		CARD16		sequence number
561	    2		CARD16		event_type
562			0x8017		GLX_DAMAGED_SGIX
563			0x8018		GLX_SAVED_SGIX
564	    2		CARD16		draw_type
565			0x8019		GLX_WINDOW_SGIX
566                        0x801A		GLX_PBUFFER_SGIX
567	    4		GLX_DRAWABLE    drawable
568            4		BITFIELD	mask
569	    2		CARD16		x
570	    2		CARD16		y
571	    2		CARD16		width
572	    2		CARD16		height
573	    2		CARD16		count
574	    6				unused
575
576Dependencies on SGIS_multisample
577
578    If SGIS_multisample is not supported, references to
579    GLX_SAMPLE_BUFFERS_BIT_SGIX in this document are invalid and should be
580    ignored.
581
582Errors
583
584    One new GLX errors is introduced:
585
586        GLXBadPbufferSGIX
587
588New State
589
590    None
591
592New Implementation Dependent State
593
594    None
595
596Revision History
597
598    Version 1.29, 2009/11/19 - clarify that BEC in the
599    GLX_BUFFER_CLOBBER_MASK_SGIX event protocol is returned from
600    XQueryExtension, matching the GLX_ARB_create_context spec language.
601
602    Version 1.28, 1997/03/20 - final spec as shipped by SGI.
603