glxclient.h revision 96fd3df59a161957876bfd7a49992e5a2130370c
1/*
2 * SGI FREE SOFTWARE LICENSE B (Version 2.0, Sept. 18, 2008)
3 * Copyright (C) 1991-2000 Silicon Graphics, Inc. All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice including the dates of first publication and
13 * either this permission notice or a reference to
14 * http://oss.sgi.com/projects/FreeB/
15 * shall be included in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * SILICON GRAPHICS, INC. BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
22 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 * SOFTWARE.
24 *
25 * Except as contained in this notice, the name of Silicon Graphics, Inc.
26 * shall not be used in advertising or otherwise to promote the sale, use or
27 * other dealings in this Software without prior written authorization from
28 * Silicon Graphics, Inc.
29 */
30
31/**
32 * \file glxclient.h
33 * Direct rendering support added by Precision Insight, Inc.
34 *
35 * \author Kevin E. Martin <kevin@precisioninsight.com>
36 */
37
38#ifndef _GLX_client_h_
39#define _GLX_client_h_
40#define NEED_REPLIES
41#define NEED_EVENTS
42#include <X11/Xproto.h>
43#include <X11/Xlibint.h>
44#define GLX_GLXEXT_PROTOTYPES
45#include <GL/glx.h>
46#include <GL/glxext.h>
47#include <string.h>
48#include <stdlib.h>
49#include <stdio.h>
50#ifdef WIN32
51#include <stdint.h>
52#endif
53#include "GL/glxint.h"
54#include "GL/glxproto.h"
55#include "GL/internal/glcore.h"
56#include "glapi/glapitable.h"
57#include "glxhash.h"
58#if defined( USE_XTHREADS )
59# include <X11/Xthreads.h>
60#elif defined( PTHREADS )
61# include <pthread.h>
62#endif
63
64#include "glxextensions.h"
65
66
67/* If we build the library with gcc's -fvisibility=hidden flag, we'll
68 * use the PUBLIC macro to mark functions that are to be exported.
69 *
70 * We also need to define a USED attribute, so the optimizer doesn't
71 * inline a static function that we later use in an alias. - ajax
72 */
73#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 303
74#  define PUBLIC __attribute__((visibility("default")))
75#  define USED __attribute__((used))
76#else
77#  define PUBLIC
78#  define USED
79#endif
80
81
82
83#define GLX_MAJOR_VERSION	1	/* current version numbers */
84#define GLX_MINOR_VERSION	4
85
86#define __GLX_MAX_TEXTURE_UNITS 32
87
88typedef struct __GLXscreenConfigsRec __GLXscreenConfigs;
89typedef struct __GLXcontextRec __GLXcontext;
90typedef struct __GLXdrawableRec __GLXdrawable;
91typedef struct __GLXdisplayPrivateRec __GLXdisplayPrivate;
92typedef struct _glapi_table __GLapi;
93
94/************************************************************************/
95
96#ifdef GLX_DIRECT_RENDERING
97
98#define containerOf(ptr, type, member)			\
99    (type *)( (char *)ptr - offsetof(type,member) )
100
101#include <GL/internal/dri_interface.h>
102
103
104/**
105 * Display dependent methods.  This structure is initialized during the
106 * \c driCreateDisplay call.
107 */
108typedef struct __GLXDRIdisplayRec __GLXDRIdisplay;
109typedef struct __GLXDRIscreenRec __GLXDRIscreen;
110typedef struct __GLXDRIdrawableRec __GLXDRIdrawable;
111typedef struct __GLXDRIcontextRec __GLXDRIcontext;
112
113#include "glxextensions.h"
114
115struct __GLXDRIdisplayRec {
116    /**
117     * Method to destroy the private DRI display data.
118     */
119    void (*destroyDisplay)(__GLXDRIdisplay *display);
120
121    __GLXDRIscreen *(*createScreen)(__GLXscreenConfigs *psc, int screen,
122				    __GLXdisplayPrivate *priv);
123};
124
125struct __GLXDRIscreenRec {
126
127    void (*destroyScreen)(__GLXscreenConfigs *psc);
128
129    __GLXDRIcontext *(*createContext)(__GLXscreenConfigs *psc,
130				      const __GLcontextModes *mode,
131				      GLXContext gc,
132				      GLXContext shareList, int renderType);
133
134    __GLXDRIdrawable *(*createDrawable)(__GLXscreenConfigs *psc,
135					XID drawable,
136					GLXDrawable glxDrawable,
137					const __GLcontextModes *modes);
138
139    void (*swapBuffers)(__GLXDRIdrawable *pdraw);
140    void (*copySubBuffer)(__GLXDRIdrawable *pdraw,
141			  int x, int y, int width, int height);
142    void (*waitX)(__GLXDRIdrawable *pdraw);
143    void (*waitGL)(__GLXDRIdrawable *pdraw);
144};
145
146struct __GLXDRIcontextRec {
147    void (*destroyContext)(__GLXDRIcontext *context, __GLXscreenConfigs *psc,
148			   Display *dpy);
149    Bool (*bindContext)(__GLXDRIcontext *context,
150			__GLXDRIdrawable *pdraw,
151			__GLXDRIdrawable *pread);
152
153    void (*unbindContext)(__GLXDRIcontext *context);
154};
155
156struct __GLXDRIdrawableRec {
157    void (*destroyDrawable)(__GLXDRIdrawable *drawable);
158
159    XID xDrawable;
160    XID drawable;
161    __GLXscreenConfigs *psc;
162    GLenum textureTarget;
163    __DRIdrawable *driDrawable;
164    GLenum textureFormat; /* EXT_texture_from_pixmap support */
165};
166
167/*
168** Function to create and DRI display data and initialize the display
169** dependent methods.
170*/
171extern __GLXDRIdisplay *driswCreateDisplay(Display *dpy);
172extern __GLXDRIdisplay *driCreateDisplay(Display *dpy);
173extern __GLXDRIdisplay *dri2CreateDisplay(Display *dpy);
174
175extern void DRI_glXUseXFont( Font font, int first, int count, int listbase );
176
177/*
178** Functions to obtain driver configuration information from a direct
179** rendering client application
180*/
181extern const char *glXGetScreenDriver (Display *dpy, int scrNum);
182
183extern const char *glXGetDriverConfig (const char *driverName);
184
185#endif
186
187/************************************************************************/
188
189#define __GL_CLIENT_ATTRIB_STACK_DEPTH 16
190
191typedef struct __GLXpixelStoreModeRec {
192    GLboolean swapEndian;
193    GLboolean lsbFirst;
194    GLuint rowLength;
195    GLuint imageHeight;
196    GLuint imageDepth;
197    GLuint skipRows;
198    GLuint skipPixels;
199    GLuint skipImages;
200    GLuint alignment;
201} __GLXpixelStoreMode;
202
203
204typedef struct __GLXattributeRec {
205    GLuint mask;
206
207    /**
208     * Pixel storage state.  Most of the pixel store mode state is kept
209     * here and used by the client code to manage the packing and
210     * unpacking of data sent to/received from the server.
211     */
212    __GLXpixelStoreMode storePack, storeUnpack;
213
214    /**
215     * Is EXT_vertex_array / GL 1.1 DrawArrays protocol specifically
216     * disabled?
217     */
218    GLboolean NoDrawArraysProtocol;
219
220    /**
221     * Vertex Array storage state.  The vertex array component
222     * state is stored here and is used to manage the packing of
223     * DrawArrays data sent to the server.
224     */
225    struct array_state_vector * array_state;
226} __GLXattribute;
227
228typedef struct __GLXattributeMachineRec {
229	__GLXattribute *stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
230	__GLXattribute **stackPointer;
231} __GLXattributeMachine;
232
233/**
234 * GLX state that needs to be kept on the client.  One of these records
235 * exist for each context that has been made current by this client.
236 */
237struct __GLXcontextRec {
238    /**
239     * \name Drawing command buffer.
240     *
241     * Drawing commands are packed into this buffer before being sent as a
242     * single GLX protocol request.  The buffer is sent when it overflows or
243     * is flushed by \c __glXFlushRenderBuffer.  \c pc is the next location
244     * in the buffer to be filled.  \c limit is described above in the buffer
245     * slop discussion.
246     *
247     * Commands that require large amounts of data to be transfered will
248     * also use this buffer to hold a header that describes the large
249     * command.
250     *
251     * These must be the first 6 fields since they are static initialized
252     * in the dummy context in glxext.c
253     */
254    /*@{*/
255    GLubyte *buf;
256    GLubyte *pc;
257    GLubyte *limit;
258    GLubyte *bufEnd;
259    GLint bufSize;
260    /*@}*/
261
262    /**
263     * The XID of this rendering context.  When the context is created a
264     * new XID is allocated.  This is set to None when the context is
265     * destroyed but is still current to some thread. In this case the
266     * context will be freed on next MakeCurrent.
267     */
268    XID xid;
269
270    /**
271     * The XID of the \c shareList context.
272     */
273    XID share_xid;
274
275    /**
276     * Screen number.
277     */
278    GLint screen;
279    __GLXscreenConfigs *psc;
280
281    /**
282     * \c GL_TRUE if the context was created with ImportContext, which
283     * means the server-side context was created by another X client.
284     */
285    GLboolean imported;
286
287    /**
288     * The context tag returned by MakeCurrent when this context is made
289     * current. This tag is used to identify the context that a thread has
290     * current so that proper server context management can be done.  It is
291     * used for all context specific commands (i.e., \c Render, \c RenderLarge,
292     * \c WaitX, \c WaitGL, \c UseXFont, and \c MakeCurrent (for the old
293     * context)).
294     */
295    GLXContextTag currentContextTag;
296
297    /**
298     * \name Rendering mode
299     *
300     * The rendering mode is kept on the client as well as the server.
301     * When \c glRenderMode is called, the buffer associated with the
302     * previous rendering mode (feedback or select) is filled.
303     */
304    /*@{*/
305    GLenum renderMode;
306    GLfloat *feedbackBuf;
307    GLuint *selectBuf;
308    /*@}*/
309
310    /**
311     * This is \c GL_TRUE if the pixel unpack modes are such that an image
312     * can be unpacked from the clients memory by just copying.  It may
313     * still be true that the server will have to do some work.  This
314     * just promises that a straight copy will fetch the correct bytes.
315     */
316    GLboolean fastImageUnpack;
317
318    /**
319     * Fill newImage with the unpacked form of \c oldImage getting it
320     * ready for transport to the server.
321     */
322    void (*fillImage)(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
323		      GLenum, const GLvoid*, GLubyte*, GLubyte*);
324
325    /**
326     * Client side attribs.
327     */
328    __GLXattributeMachine attributes;
329
330    /**
331     * Client side error code.  This is set when client side gl API
332     * routines need to set an error because of a bad enumerant or
333     * running out of memory, etc.
334     */
335    GLenum error;
336
337    /**
338     * Whether this context does direct rendering.
339     */
340    Bool isDirect;
341
342    /**
343     * \c dpy of current display for this context.  Will be \c NULL if not
344     * current to any display, or if this is the "dummy context".
345     */
346    Display *currentDpy;
347
348    /**
349     * The current drawable for this context.  Will be None if this
350     * context is not current to any drawable.  currentReadable is below.
351     */
352    GLXDrawable currentDrawable;
353
354    /**
355     * \name GL Constant Strings
356     *
357     * Constant strings that describe the server implementation
358     * These pertain to GL attributes, not to be confused with
359     * GLX versioning attributes.
360     */
361    /*@{*/
362    GLubyte *vendor;
363    GLubyte *renderer;
364    GLubyte *version;
365    GLubyte *extensions;
366    /*@}*/
367
368    /**
369     * Record the dpy this context was created on for later freeing
370     */
371    Display *createDpy;
372
373    /**
374     * Maximum small render command size.  This is the smaller of 64k and
375     * the size of the above buffer.
376     */
377    GLint maxSmallRenderCommandSize;
378
379    /**
380     * Major opcode for the extension.  Copied here so a lookup isn't
381     * needed.
382     */
383    GLint majorOpcode;
384
385    /**
386     * Pointer to the mode used to create this context.
387     */
388    const __GLcontextModes * mode;
389
390#ifdef GLX_DIRECT_RENDERING
391    __GLXDRIcontext *driContext;
392    __DRIcontext *__driContext;
393#endif
394
395    /**
396     * The current read-drawable for this context.  Will be None if this
397     * context is not current to any drawable.
398     *
399     * \since Internal API version 20030606.
400     */
401    GLXDrawable currentReadable;
402
403   /**
404    * Pointer to client-state data that is private to libGL.  This is only
405    * used for indirect rendering contexts.
406    *
407    * No internal API version change was made for this change.  Client-side
408    * drivers should NEVER use this data or even care that it exists.
409    */
410   void * client_state_private;
411
412   /**
413    * Stored value for \c glXQueryContext attribute \c GLX_RENDER_TYPE.
414    */
415   int renderType;
416
417   /**
418    * \name Raw server GL version
419    *
420    * True core GL version supported by the server.  This is the raw value
421    * returned by the server, and it may not reflect what is actually
422    * supported (or reported) by the client-side library.
423    */
424    /*@{*/
425   int server_major;        /**< Major version number. */
426   int server_minor;        /**< Minor version number. */
427    /*@}*/
428
429   /**
430    * Thread ID we're currently current in. Zero if none.
431    */
432   unsigned long thread_id;
433
434    char gl_extension_bits[ __GL_EXT_BYTES ];
435};
436
437#define __glXSetError(gc,code) \
438    if (!(gc)->error) {	       \
439	(gc)->error = code;    \
440    }
441
442extern void __glFreeAttributeState(__GLXcontext *);
443
444/************************************************************************/
445
446/**
447 * The size of the largest drawing command known to the implementation
448 * that will use the GLXRender GLX command.  In this case it is
449 * \c glPolygonStipple.
450 */
451#define __GLX_MAX_SMALL_RENDER_CMD_SIZE	156
452
453/**
454 * To keep the implementation fast, the code uses a "limit" pointer
455 * to determine when the drawing command buffer is too full to hold
456 * another fixed size command.  This constant defines the amount of
457 * space that must always be available in the drawing command buffer
458 * at all times for the implementation to work.  It is important that
459 * the number be just large enough, but not so large as to reduce the
460 * efficacy of the buffer.  The "+32" is just to keep the code working
461 * in case somebody counts wrong.
462 */
463#define __GLX_BUFFER_LIMIT_SIZE	(__GLX_MAX_SMALL_RENDER_CMD_SIZE + 32)
464
465/**
466 * This implementation uses a smaller threshold for switching
467 * to the RenderLarge protocol than the protcol requires so that
468 * large copies don't occur.
469 */
470#define __GLX_RENDER_CMD_SIZE_LIMIT	4096
471
472/**
473 * One of these records exists per screen of the display.  It contains
474 * a pointer to the config data for that screen (if the screen supports GL).
475 */
476struct __GLXscreenConfigsRec {
477    /**
478     * GLX extension string reported by the X-server.
479     */
480    const char *serverGLXexts;
481
482    /**
483     * GLX extension string to be reported to applications.  This is the
484     * set of extensions that the application can actually use.
485     */
486    char *effectiveGLXexts;
487
488#ifdef GLX_DIRECT_RENDERING
489    /**
490     * Per screen direct rendering interface functions and data.
491     */
492    __DRIscreen *__driScreen;
493    const __DRIcoreExtension *core;
494    const __DRIlegacyExtension *legacy;
495    const __DRIswrastExtension *swrast;
496    const __DRIdri2Extension *dri2;
497    __glxHashTable *drawHash;
498    Display *dpy;
499    int scr, fd;
500    void *driver;
501
502    __GLXDRIscreen *driScreen;
503
504#ifdef __DRI_COPY_SUB_BUFFER
505    const __DRIcopySubBufferExtension *driCopySubBuffer;
506#endif
507
508#ifdef __DRI_SWAP_CONTROL
509    const __DRIswapControlExtension *swapControl;
510#endif
511
512#ifdef __DRI_ALLOCATE
513    const __DRIallocateExtension *allocate;
514#endif
515
516#ifdef __DRI_FRAME_TRACKING
517    const __DRIframeTrackingExtension *frameTracking;
518#endif
519
520#ifdef __DRI_MEDIA_STREAM_COUNTER
521    const __DRImediaStreamCounterExtension *msc;
522#endif
523
524#ifdef __DRI_TEX_BUFFER
525    const __DRItexBufferExtension *texBuffer;
526#endif
527
528#ifdef __DRI2_FLUSH
529    const __DRI2flushExtension *f;
530#endif
531
532#endif
533
534    /**
535     * Linked list of glx visuals and  fbconfigs for this screen.
536     */
537    __GLcontextModes *visuals, *configs;
538
539    /**
540     * Per-screen dynamic GLX extension tracking.  The \c direct_support
541     * field only contains enough bits for 64 extensions.  Should libGL
542     * ever need to track more than 64 GLX extensions, we can safely grow
543     * this field.  The \c __GLXscreenConfigs structure is not used outside
544     * libGL.
545     */
546    /*@{*/
547    unsigned char direct_support[8];
548    GLboolean ext_list_first_time;
549    /*@}*/
550
551};
552
553/**
554 * Per display private data.  One of these records exists for each display
555 * that is using the OpenGL (GLX) extension.
556 */
557struct __GLXdisplayPrivateRec {
558    /**
559     * Back pointer to the display
560     */
561    Display *dpy;
562
563    /**
564     * The \c majorOpcode is common to all connections to the same server.
565     * It is also copied into the context structure.
566     */
567    int majorOpcode;
568
569    /**
570     * \name Server Version
571     *
572     * Major and minor version returned by the server during initialization.
573     */
574    /*@{*/
575    int majorVersion, minorVersion;
576    /*@}*/
577
578    /**
579     * \name Storage for the servers GLX vendor and versions strings.
580     *
581     * These are the same for all screens on this display. These fields will
582     * be filled in on demand.
583     */
584    /*@{*/
585    const char *serverGLXvendor;
586    const char *serverGLXversion;
587    /*@}*/
588
589    /**
590     * Configurations of visuals for all screens on this display.
591     * Also, per screen data which now includes the server \c GLX_EXTENSION
592     * string.
593     */
594    __GLXscreenConfigs *screenConfigs;
595
596#ifdef GLX_DIRECT_RENDERING
597    /**
598     * Per display direct rendering interface functions and data.
599     */
600    __GLXDRIdisplay *driswDisplay;
601    __GLXDRIdisplay *driDisplay;
602    __GLXDRIdisplay *dri2Display;
603#endif
604};
605
606
607extern GLubyte *__glXFlushRenderBuffer(__GLXcontext*, GLubyte*);
608
609extern void __glXSendLargeChunk(__GLXcontext *gc, GLint requestNumber,
610				GLint totalRequests,
611				const GLvoid * data, GLint dataLen);
612
613extern void __glXSendLargeCommand(__GLXcontext *, const GLvoid *, GLint,
614				  const GLvoid *, GLint);
615
616/* Initialize the GLX extension for dpy */
617extern __GLXdisplayPrivate *__glXInitialize(Display*);
618
619extern void __glXPreferEGL(int state);
620
621/************************************************************************/
622
623extern int __glXDebug;
624
625/* This is per-thread storage in an MT environment */
626#if defined( USE_XTHREADS ) || defined( PTHREADS )
627
628extern void __glXSetCurrentContext(__GLXcontext *c);
629
630# if defined( GLX_USE_TLS )
631
632extern __thread void * __glX_tls_Context
633    __attribute__((tls_model("initial-exec")));
634
635#  define __glXGetCurrentContext()	__glX_tls_Context
636
637# else
638
639extern __GLXcontext *__glXGetCurrentContext(void);
640
641# endif /* defined( GLX_USE_TLS ) */
642
643#else
644
645extern __GLXcontext *__glXcurrentContext;
646#define __glXGetCurrentContext()	__glXcurrentContext
647#define __glXSetCurrentContext(gc)	__glXcurrentContext = gc
648
649#endif /* defined( USE_XTHREADS ) || defined( PTHREADS ) */
650
651extern void __glXSetCurrentContextNull(void);
652
653extern void __glXFreeContext(__GLXcontext*);
654
655
656/*
657** Global lock for all threads in this address space using the GLX
658** extension
659*/
660#if defined( USE_XTHREADS )
661extern xmutex_rec __glXmutex;
662#define __glXLock()    xmutex_lock(&__glXmutex)
663#define __glXUnlock()  xmutex_unlock(&__glXmutex)
664#elif defined( PTHREADS )
665extern pthread_mutex_t __glXmutex;
666#define __glXLock()    pthread_mutex_lock(&__glXmutex)
667#define __glXUnlock()  pthread_mutex_unlock(&__glXmutex)
668#else
669#define __glXLock()
670#define __glXUnlock()
671#endif
672
673/*
674** Setup for a command.  Initialize the extension for dpy if necessary.
675*/
676extern CARD8 __glXSetupForCommand(Display *dpy);
677
678/************************************************************************/
679
680/*
681** Data conversion and packing support.
682*/
683
684extern const GLuint __glXDefaultPixelStore[9];
685
686/* Send an image to the server using RenderLarge. */
687extern void __glXSendLargeImage(__GLXcontext *gc, GLint compsize, GLint dim,
688    GLint width, GLint height, GLint depth, GLenum format, GLenum type,
689    const GLvoid *src, GLubyte *pc, GLubyte *modes);
690
691/* Return the size, in bytes, of some pixel data */
692extern GLint __glImageSize(GLint, GLint, GLint, GLenum, GLenum, GLenum);
693
694/* Return the number of elements per group of a specified format*/
695extern GLint __glElementsPerGroup(GLenum format, GLenum type);
696
697/* Return the number of bytes per element, based on the element type (other
698** than GL_BITMAP).
699*/
700extern GLint __glBytesPerElement(GLenum type);
701
702/*
703** Fill the transport buffer with the data from the users buffer,
704** applying some of the pixel store modes (unpack modes) to the data
705** first.  As a side effect of this call, the "modes" field is
706** updated to contain the modes needed by the server to decode the
707** sent data.
708*/
709extern void __glFillImage(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
710			  GLenum, const GLvoid*, GLubyte*, GLubyte*);
711
712/* Copy map data with a stride into a packed buffer */
713extern void __glFillMap1f(GLint, GLint, GLint, const GLfloat *, GLubyte *);
714extern void __glFillMap1d(GLint, GLint, GLint, const GLdouble *, GLubyte *);
715extern void __glFillMap2f(GLint, GLint, GLint, GLint, GLint,
716			  const GLfloat *, GLfloat *);
717extern void __glFillMap2d(GLint, GLint, GLint, GLint, GLint,
718			  const GLdouble *, GLdouble *);
719
720/*
721** Empty an image out of the reply buffer into the clients memory applying
722** the pack modes to pack back into the clients requested format.
723*/
724extern void __glEmptyImage(__GLXcontext*, GLint, GLint, GLint, GLint, GLenum,
725		           GLenum, const GLubyte *, GLvoid *);
726
727
728/*
729** Allocate and Initialize Vertex Array client state, and free.
730*/
731extern void __glXInitVertexArrayState(__GLXcontext *);
732extern void __glXFreeVertexArrayState(__GLXcontext *);
733
734/*
735** Inform the Server of the major and minor numbers and of the client
736** libraries extension string.
737*/
738extern void __glXClientInfo (  Display *dpy, int opcode );
739
740/************************************************************************/
741
742/*
743** Declarations that should be in Xlib
744*/
745#ifdef __GL_USE_OUR_PROTOTYPES
746extern void _XFlush(Display*);
747extern Status _XReply(Display*, xReply*, int, Bool);
748extern void _XRead(Display*, void*, long);
749extern void _XSend(Display*, const void*, long);
750#endif
751
752
753extern void __glXInitializeVisualConfigFromTags( __GLcontextModes *config,
754    int count, const INT32 *bp, Bool tagged_only, Bool fbconfig_style_tags );
755
756extern char * __glXQueryServerString(Display* dpy, int opcode,
757                                     CARD32 screen, CARD32 name);
758extern char * __glXGetString(Display* dpy, int opcode,
759                             CARD32 screen, CARD32 name);
760
761extern char *__glXstrdup(const char *str);
762
763
764extern const char __glXGLClientVersion[];
765extern const char __glXGLClientExtensions[];
766
767/* Get the unadjusted system time */
768extern int __glXGetUST( int64_t * ust );
769
770extern GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
771				    int32_t * numerator, int32_t * denominator);
772
773#ifdef GLX_DIRECT_RENDERING
774GLboolean
775__driGetMscRateOML(__DRIdrawable *draw,
776		   int32_t *numerator, int32_t *denominator, void *private);
777#endif
778
779#endif /* !__GLX_client_h__ */
780