mesa_glinterop: make GL interop version field bidirectional
[mesa.git] / src / glx / glxclient.h
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 #include <X11/Xproto.h>
41 #include <X11/Xlibint.h>
42 #include <X11/Xfuncproto.h>
43 #include <X11/extensions/extutil.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 #include <stdint.h>
51 #include <pthread.h>
52 #include "GL/glxproto.h"
53 #include "glxconfig.h"
54 #include "glxhash.h"
55 #include "util/macros.h"
56
57 #include "glxextensions.h"
58
59
60 #ifdef __cplusplus
61 extern "C" {
62 #endif
63
64
65 #define GLX_MAJOR_VERSION 1 /* current version numbers */
66 #define GLX_MINOR_VERSION 4
67
68 #define __GLX_MAX_TEXTURE_UNITS 32
69
70 struct glx_display;
71 struct glx_context;
72
73 /************************************************************************/
74
75 #ifdef GLX_DIRECT_RENDERING
76
77 extern void DRI_glXUseXFont(struct glx_context *ctx,
78 Font font, int first, int count, int listbase);
79
80 #endif
81
82 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
83
84 /**
85 * Display dependent methods. This structure is initialized during the
86 * \c driCreateDisplay call.
87 */
88 typedef struct __GLXDRIdisplayRec __GLXDRIdisplay;
89 typedef struct __GLXDRIscreenRec __GLXDRIscreen;
90 typedef struct __GLXDRIdrawableRec __GLXDRIdrawable;
91
92 struct __GLXDRIdisplayRec
93 {
94 /**
95 * Method to destroy the private DRI display data.
96 */
97 void (*destroyDisplay) (__GLXDRIdisplay * display);
98
99 struct glx_screen *(*createScreen)(int screen, struct glx_display * priv);
100 };
101
102 struct __GLXDRIscreenRec {
103
104 void (*destroyScreen)(struct glx_screen *psc);
105
106 struct glx_context *(*createContext)(struct glx_screen *psc,
107 struct glx_config *config,
108 struct glx_context *shareList,
109 int renderType);
110
111 __GLXDRIdrawable *(*createDrawable)(struct glx_screen *psc,
112 XID drawable,
113 GLXDrawable glxDrawable,
114 struct glx_config *config);
115
116 int64_t (*swapBuffers)(__GLXDRIdrawable *pdraw, int64_t target_msc,
117 int64_t divisor, int64_t remainder, Bool flush);
118 void (*copySubBuffer)(__GLXDRIdrawable *pdraw,
119 int x, int y, int width, int height, Bool flush);
120 int (*getDrawableMSC)(struct glx_screen *psc, __GLXDRIdrawable *pdraw,
121 int64_t *ust, int64_t *msc, int64_t *sbc);
122 int (*waitForMSC)(__GLXDRIdrawable *pdraw, int64_t target_msc,
123 int64_t divisor, int64_t remainder, int64_t *ust,
124 int64_t *msc, int64_t *sbc);
125 int (*waitForSBC)(__GLXDRIdrawable *pdraw, int64_t target_sbc, int64_t *ust,
126 int64_t *msc, int64_t *sbc);
127 int (*setSwapInterval)(__GLXDRIdrawable *pdraw, int interval);
128 int (*getSwapInterval)(__GLXDRIdrawable *pdraw);
129 int (*getBufferAge)(__GLXDRIdrawable *pdraw);
130 };
131
132 struct __GLXDRIdrawableRec
133 {
134 void (*destroyDrawable) (__GLXDRIdrawable * drawable);
135
136 XID xDrawable;
137 XID drawable;
138 struct glx_screen *psc;
139 GLenum textureTarget;
140 GLenum textureFormat; /* EXT_texture_from_pixmap support */
141 unsigned long eventMask;
142 int refcount;
143 };
144
145 /*
146 ** Function to create and DRI display data and initialize the display
147 ** dependent methods.
148 */
149 extern __GLXDRIdisplay *driswCreateDisplay(Display * dpy);
150 extern __GLXDRIdisplay *driCreateDisplay(Display * dpy);
151 extern __GLXDRIdisplay *dri2CreateDisplay(Display * dpy);
152 extern void dri2InvalidateBuffers(Display *dpy, XID drawable);
153 extern unsigned dri2GetSwapEventType(Display *dpy, XID drawable);
154
155 extern __GLXDRIdisplay *dri3_create_display(Display * dpy);
156
157 /*
158 ** Functions to obtain driver configuration information from a direct
159 ** rendering client application
160 */
161 extern const char *glXGetScreenDriver(Display * dpy, int scrNum);
162
163 extern const char *glXGetDriverConfig(const char *driverName);
164
165 #endif
166
167 /************************************************************************/
168
169 #define __GL_CLIENT_ATTRIB_STACK_DEPTH 16
170
171 typedef struct __GLXpixelStoreModeRec
172 {
173 GLboolean swapEndian;
174 GLboolean lsbFirst;
175 GLuint rowLength;
176 GLuint imageHeight;
177 GLuint imageDepth;
178 GLuint skipRows;
179 GLuint skipPixels;
180 GLuint skipImages;
181 GLuint alignment;
182 } __GLXpixelStoreMode;
183
184
185 typedef struct __GLXattributeRec
186 {
187 GLuint mask;
188
189 /**
190 * Pixel storage state. Most of the pixel store mode state is kept
191 * here and used by the client code to manage the packing and
192 * unpacking of data sent to/received from the server.
193 */
194 __GLXpixelStoreMode storePack, storeUnpack;
195
196 /**
197 * Is EXT_vertex_array / GL 1.1 DrawArrays protocol specifically
198 * disabled?
199 */
200 GLboolean NoDrawArraysProtocol;
201
202 /**
203 * Vertex Array storage state. The vertex array component
204 * state is stored here and is used to manage the packing of
205 * DrawArrays data sent to the server.
206 */
207 struct array_state_vector *array_state;
208 } __GLXattribute;
209
210 typedef struct __GLXattributeMachineRec
211 {
212 __GLXattribute *stack[__GL_CLIENT_ATTRIB_STACK_DEPTH];
213 __GLXattribute **stackPointer;
214 } __GLXattributeMachine;
215
216 typedef struct _mesa_glinterop_device_info mesa_glinterop_device_info;
217 typedef struct _mesa_glinterop_export_in mesa_glinterop_export_in;
218 typedef struct _mesa_glinterop_export_out mesa_glinterop_export_out;
219
220 struct glx_context_vtable {
221 void (*destroy)(struct glx_context *ctx);
222 int (*bind)(struct glx_context *context, struct glx_context *old,
223 GLXDrawable draw, GLXDrawable read);
224 void (*unbind)(struct glx_context *context, struct glx_context *new_ctx);
225 void (*wait_gl)(struct glx_context *ctx);
226 void (*wait_x)(struct glx_context *ctx);
227 void (*use_x_font)(struct glx_context *ctx,
228 Font font, int first, int count, int listBase);
229 void (*bind_tex_image)(Display * dpy,
230 GLXDrawable drawable,
231 int buffer, const int *attrib_list);
232 void (*release_tex_image)(Display * dpy, GLXDrawable drawable, int buffer);
233 void * (*get_proc_address)(const char *symbol);
234 int (*interop_query_device_info)(struct glx_context *ctx,
235 mesa_glinterop_device_info *out);
236 int (*interop_export_object)(struct glx_context *ctx,
237 mesa_glinterop_export_in *in,
238 mesa_glinterop_export_out *out);
239 };
240
241 /**
242 * GLX state that needs to be kept on the client. One of these records
243 * exist for each context that has been made current by this client.
244 */
245 struct glx_context
246 {
247 /**
248 * \name Drawing command buffer.
249 *
250 * Drawing commands are packed into this buffer before being sent as a
251 * single GLX protocol request. The buffer is sent when it overflows or
252 * is flushed by \c __glXFlushRenderBuffer. \c pc is the next location
253 * in the buffer to be filled. \c limit is described above in the buffer
254 * slop discussion.
255 *
256 * Commands that require large amounts of data to be transfered will
257 * also use this buffer to hold a header that describes the large
258 * command.
259 *
260 * These must be the first 6 fields since they are static initialized
261 * in the dummy context in glxext.c
262 */
263 /*@{ */
264 GLubyte *buf;
265 GLubyte *pc;
266 GLubyte *limit;
267 GLubyte *bufEnd;
268 GLint bufSize;
269 /*@} */
270
271 const struct glx_context_vtable *vtable;
272
273 /**
274 * The XID of this rendering context. When the context is created a
275 * new XID is allocated. This is set to None when the context is
276 * destroyed but is still current to some thread. In this case the
277 * context will be freed on next MakeCurrent.
278 */
279 XID xid;
280
281 /**
282 * The XID of the \c shareList context.
283 */
284 XID share_xid;
285
286 /**
287 * Screen number.
288 */
289 GLint screen;
290 struct glx_screen *psc;
291
292 /**
293 * \c GL_TRUE if the context was created with ImportContext, which
294 * means the server-side context was created by another X client.
295 */
296 GLboolean imported;
297
298 /**
299 * The context tag returned by MakeCurrent when this context is made
300 * current. This tag is used to identify the context that a thread has
301 * current so that proper server context management can be done. It is
302 * used for all context specific commands (i.e., \c Render, \c RenderLarge,
303 * \c WaitX, \c WaitGL, \c UseXFont, and \c MakeCurrent (for the old
304 * context)).
305 */
306 GLXContextTag currentContextTag;
307
308 /**
309 * \name Rendering mode
310 *
311 * The rendering mode is kept on the client as well as the server.
312 * When \c glRenderMode is called, the buffer associated with the
313 * previous rendering mode (feedback or select) is filled.
314 */
315 /*@{ */
316 GLenum renderMode;
317 GLfloat *feedbackBuf;
318 GLuint *selectBuf;
319 /*@} */
320
321 /**
322 * Fill newImage with the unpacked form of \c oldImage getting it
323 * ready for transport to the server.
324 */
325 void (*fillImage) (struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
326 GLenum, const GLvoid *, GLubyte *, GLubyte *);
327
328 /**
329 * Client side attribs.
330 */
331 __GLXattributeMachine attributes;
332
333 /**
334 * Client side error code. This is set when client side gl API
335 * routines need to set an error because of a bad enumerant or
336 * running out of memory, etc.
337 */
338 GLenum error;
339
340 /**
341 * Whether this context does direct rendering.
342 */
343 Bool isDirect;
344
345 #if defined(GLX_DIRECT_RENDERING) && defined(GLX_USE_APPLEGL)
346 void *driContext;
347 #endif
348
349 /**
350 * \c dpy of current display for this context. Will be \c NULL if not
351 * current to any display, or if this is the "dummy context".
352 */
353 Display *currentDpy;
354
355 /**
356 * The current drawable for this context. Will be None if this
357 * context is not current to any drawable. currentReadable is below.
358 */
359 GLXDrawable currentDrawable;
360
361 /**
362 * \name GL Constant Strings
363 *
364 * Constant strings that describe the server implementation
365 * These pertain to GL attributes, not to be confused with
366 * GLX versioning attributes.
367 */
368 /*@{ */
369 GLubyte *vendor;
370 GLubyte *renderer;
371 GLubyte *version;
372 GLubyte *extensions;
373 /*@} */
374
375 /**
376 * Maximum small render command size. This is the smaller of 64k and
377 * the size of the above buffer.
378 */
379 GLint maxSmallRenderCommandSize;
380
381 /**
382 * Major opcode for the extension. Copied here so a lookup isn't
383 * needed.
384 */
385 GLint majorOpcode;
386
387 /**
388 * Pointer to the config used to create this context.
389 */
390 struct glx_config *config;
391
392 /**
393 * The current read-drawable for this context. Will be None if this
394 * context is not current to any drawable.
395 *
396 * \since Internal API version 20030606.
397 */
398 GLXDrawable currentReadable;
399
400 /**
401 * Pointer to client-state data that is private to libGL. This is only
402 * used for indirect rendering contexts.
403 *
404 * No internal API version change was made for this change. Client-side
405 * drivers should NEVER use this data or even care that it exists.
406 */
407 void *client_state_private;
408
409 /**
410 * Stored value for \c glXQueryContext attribute \c GLX_RENDER_TYPE.
411 */
412 int renderType;
413
414 /**
415 * \name Raw server GL version
416 *
417 * True core GL version supported by the server. This is the raw value
418 * returned by the server, and it may not reflect what is actually
419 * supported (or reported) by the client-side library.
420 */
421 /*@{ */
422 int server_major; /**< Major version number. */
423 int server_minor; /**< Minor version number. */
424 /*@} */
425
426 /**
427 * Number of threads we're currently current in.
428 */
429 unsigned long thread_refcount;
430
431 char gl_extension_bits[__GL_EXT_BYTES];
432 };
433
434 extern Bool
435 glx_context_init(struct glx_context *gc,
436 struct glx_screen *psc, struct glx_config *fbconfig);
437
438 #define __glXSetError(gc,code) \
439 if (!(gc)->error) { \
440 (gc)->error = code; \
441 }
442
443 extern void __glFreeAttributeState(struct glx_context *);
444
445 /************************************************************************/
446
447 /**
448 * The size of the largest drawing command known to the implementation
449 * that will use the GLXRender GLX command. In this case it is
450 * \c glPolygonStipple.
451 */
452 #define __GLX_MAX_SMALL_RENDER_CMD_SIZE 156
453
454 /**
455 * To keep the implementation fast, the code uses a "limit" pointer
456 * to determine when the drawing command buffer is too full to hold
457 * another fixed size command. This constant defines the amount of
458 * space that must always be available in the drawing command buffer
459 * at all times for the implementation to work. It is important that
460 * the number be just large enough, but not so large as to reduce the
461 * efficacy of the buffer. The "+32" is just to keep the code working
462 * in case somebody counts wrong.
463 */
464 #define __GLX_BUFFER_LIMIT_SIZE (__GLX_MAX_SMALL_RENDER_CMD_SIZE + 32)
465
466 /**
467 * This implementation uses a smaller threshold for switching
468 * to the RenderLarge protocol than the protcol requires so that
469 * large copies don't occur.
470 */
471 #define __GLX_RENDER_CMD_SIZE_LIMIT 4096
472
473 /**
474 * One of these records exists per screen of the display. It contains
475 * a pointer to the config data for that screen (if the screen supports GL).
476 */
477 struct glx_screen_vtable {
478 struct glx_context *(*create_context)(struct glx_screen *psc,
479 struct glx_config *config,
480 struct glx_context *shareList,
481 int renderType);
482
483 struct glx_context *(*create_context_attribs)(struct glx_screen *psc,
484 struct glx_config *config,
485 struct glx_context *shareList,
486 unsigned num_attrib,
487 const uint32_t *attribs,
488 unsigned *error);
489 int (*query_renderer_integer)(struct glx_screen *psc,
490 int attribute,
491 unsigned int *value);
492 int (*query_renderer_string)(struct glx_screen *psc,
493 int attribute,
494 const char **value);
495 };
496
497 struct glx_screen
498 {
499 const struct glx_screen_vtable *vtable;
500
501 /**
502 * GLX extension string reported by the X-server.
503 */
504 const char *serverGLXexts;
505
506 /**
507 * GLX extension string to be reported to applications. This is the
508 * set of extensions that the application can actually use.
509 */
510 char *effectiveGLXexts;
511
512 struct glx_display *display;
513
514 Display *dpy;
515 int scr;
516
517 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
518 /**
519 * Per screen direct rendering interface functions and data.
520 */
521 __GLXDRIscreen *driScreen;
522 #endif
523
524 /**
525 * Linked list of glx visuals and fbconfigs for this screen.
526 */
527 struct glx_config *visuals, *configs;
528
529 /**
530 * Per-screen dynamic GLX extension tracking. The \c direct_support
531 * field only contains enough bits for 64 extensions. Should libGL
532 * ever need to track more than 64 GLX extensions, we can safely grow
533 * this field. The \c struct glx_screen structure is not used outside
534 * libGL.
535 */
536 /*@{ */
537 unsigned char direct_support[8];
538 GLboolean ext_list_first_time;
539 /*@} */
540
541 };
542
543 /**
544 * Per display private data. One of these records exists for each display
545 * that is using the OpenGL (GLX) extension.
546 */
547 struct glx_display
548 {
549 /* The extension protocol codes */
550 XExtCodes *codes;
551 struct glx_display *next;
552
553 /**
554 * Back pointer to the display
555 */
556 Display *dpy;
557
558 /**
559 * The \c majorOpcode is common to all connections to the same server.
560 * It is also copied into the context structure.
561 */
562 int majorOpcode;
563
564 /**
565 * \name Server Version
566 *
567 * Major and minor version returned by the server during initialization.
568 */
569 /*@{ */
570 int majorVersion, minorVersion;
571 /*@} */
572
573 /**
574 * \name Storage for the servers GLX vendor and versions strings.
575 *
576 * These are the same for all screens on this display. These fields will
577 * be filled in on demand.
578 */
579 /*@{ */
580 const char *serverGLXvendor;
581 const char *serverGLXversion;
582 /*@} */
583
584 /**
585 * Configurations of visuals for all screens on this display.
586 * Also, per screen data which now includes the server \c GLX_EXTENSION
587 * string.
588 */
589 struct glx_screen **screens;
590
591 __glxHashTable *glXDrawHash;
592
593 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
594 __glxHashTable *drawHash;
595
596 /**
597 * Per display direct rendering interface functions and data.
598 */
599 __GLXDRIdisplay *driswDisplay;
600 __GLXDRIdisplay *driDisplay;
601 __GLXDRIdisplay *dri2Display;
602 __GLXDRIdisplay *dri3Display;
603 #endif
604 };
605
606 struct glx_drawable {
607 XID xDrawable;
608 XID drawable;
609
610 uint32_t lastEventSbc;
611 int64_t eventSbcWrap;
612 };
613
614 extern int
615 glx_screen_init(struct glx_screen *psc,
616 int screen, struct glx_display * priv);
617 extern void
618 glx_screen_cleanup(struct glx_screen *psc);
619
620 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
621 extern __GLXDRIdrawable *
622 dri2GetGlxDrawableFromXDrawableId(Display *dpy, XID id);
623 #endif
624
625 extern GLubyte *__glXFlushRenderBuffer(struct glx_context *, GLubyte *);
626
627 extern void __glXSendLargeChunk(struct glx_context * gc, GLint requestNumber,
628 GLint totalRequests,
629 const GLvoid * data, GLint dataLen);
630
631 extern void __glXSendLargeCommand(struct glx_context *, const GLvoid *, GLint,
632 const GLvoid *, GLint);
633
634 /* Initialize the GLX extension for dpy */
635 extern struct glx_display *__glXInitialize(Display *);
636
637 extern void __glXPreferEGL(int state);
638
639 /************************************************************************/
640
641 extern int __glXDebug;
642
643 /* This is per-thread storage in an MT environment */
644
645 extern void __glXSetCurrentContext(struct glx_context * c);
646
647 # if defined( GLX_USE_TLS )
648
649 extern __thread void *__glX_tls_Context
650 __attribute__ ((tls_model("initial-exec")));
651
652 # define __glXGetCurrentContext() __glX_tls_Context
653
654 # else
655
656 extern struct glx_context *__glXGetCurrentContext(void);
657
658 # endif /* defined( GLX_USE_TLS ) */
659
660 extern void __glXSetCurrentContextNull(void);
661
662
663 /*
664 ** Global lock for all threads in this address space using the GLX
665 ** extension
666 */
667 extern pthread_mutex_t __glXmutex;
668 #define __glXLock() pthread_mutex_lock(&__glXmutex)
669 #define __glXUnlock() pthread_mutex_unlock(&__glXmutex)
670
671 /*
672 ** Setup for a command. Initialize the extension for dpy if necessary.
673 */
674 extern CARD8 __glXSetupForCommand(Display * dpy);
675
676 /************************************************************************/
677
678 /*
679 ** Data conversion and packing support.
680 */
681
682 extern const GLuint __glXDefaultPixelStore[9];
683
684 /* Send an image to the server using RenderLarge. */
685 extern void __glXSendLargeImage(struct glx_context * gc, GLint compsize, GLint dim,
686 GLint width, GLint height, GLint depth,
687 GLenum format, GLenum type,
688 const GLvoid * src, GLubyte * pc,
689 GLubyte * modes);
690
691 /* Return the size, in bytes, of some pixel data */
692 extern GLint __glImageSize(GLint, GLint, GLint, GLenum, GLenum, GLenum);
693
694 /* Return the number of elements per group of a specified format*/
695 extern 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 */
700 extern 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 */
709 extern void __glFillImage(struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
710 GLenum, const GLvoid *, GLubyte *, GLubyte *);
711
712 /* Copy map data with a stride into a packed buffer */
713 extern void __glFillMap1f(GLint, GLint, GLint, const GLfloat *, GLubyte *);
714 extern void __glFillMap1d(GLint, GLint, GLint, const GLdouble *, GLubyte *);
715 extern void __glFillMap2f(GLint, GLint, GLint, GLint, GLint,
716 const GLfloat *, GLfloat *);
717 extern 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 */
724 extern void __glEmptyImage(struct glx_context *, GLint, GLint, GLint, GLint, GLenum,
725 GLenum, const GLubyte *, GLvoid *);
726
727
728 /*
729 ** Allocate and Initialize Vertex Array client state, and free.
730 */
731 extern void __glXInitVertexArrayState(struct glx_context *);
732 extern void __glXFreeVertexArrayState(struct glx_context *);
733
734 /*
735 ** Inform the Server of the major and minor numbers and of the client
736 ** libraries extension string.
737 */
738 extern void __glXClientInfo(Display * dpy, int opcode);
739
740 _X_HIDDEN void
741 __glX_send_client_info(struct glx_display *glx_dpy);
742
743 /************************************************************************/
744
745 /*
746 ** Declarations that should be in Xlib
747 */
748 #ifdef __GL_USE_OUR_PROTOTYPES
749 extern void _XFlush(Display *);
750 extern Status _XReply(Display *, xReply *, int, Bool);
751 extern void _XRead(Display *, void *, long);
752 extern void _XSend(Display *, const void *, long);
753 #endif
754
755
756 extern void __glXInitializeVisualConfigFromTags(struct glx_config * config,
757 int count, const INT32 * bp,
758 Bool tagged_only,
759 Bool fbconfig_style_tags);
760
761 extern char *__glXQueryServerString(Display * dpy, int opcode,
762 CARD32 screen, CARD32 name);
763 extern char *__glXGetString(Display * dpy, int opcode,
764 CARD32 screen, CARD32 name);
765
766 extern const char __glXGLClientVersion[];
767 extern const char __glXGLClientExtensions[];
768
769 /* Get the unadjusted system time */
770 extern int __glXGetUST(int64_t * ust);
771
772 extern GLboolean __glXGetMscRateOML(Display * dpy, GLXDrawable drawable,
773 int32_t * numerator,
774 int32_t * denominator);
775
776 #if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
777 extern GLboolean
778 __glxGetMscRate(struct glx_screen *psc,
779 int32_t * numerator, int32_t * denominator);
780
781 /* So that dri2.c:DRI2WireToEvent() can access
782 * glx_info->codes->first_event */
783 XExtDisplayInfo *__glXFindDisplay (Display *dpy);
784
785 extern void
786 GarbageCollectDRIDrawables(struct glx_screen *psc);
787
788 extern __GLXDRIdrawable *
789 GetGLXDRIDrawable(Display *dpy, GLXDrawable drawable);
790 #endif
791
792 extern struct glx_screen *GetGLXScreenConfigs(Display * dpy, int scrn);
793
794 #ifdef GLX_USE_APPLEGL
795 extern struct glx_screen *
796 applegl_create_screen(int screen, struct glx_display * priv);
797
798 extern struct glx_context *
799 applegl_create_context(struct glx_screen *psc,
800 struct glx_config *mode,
801 struct glx_context *shareList, int renderType);
802
803 extern int
804 applegl_create_display(struct glx_display *display);
805 #endif
806
807 extern Bool validate_renderType_against_config(const struct glx_config *config,
808 int renderType);
809
810
811 extern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable);
812 extern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw,
813 XID xDrawable, GLXDrawable drawable);
814 extern void DestroyGLXDrawable(Display *dpy, GLXDrawable drawable);
815
816 extern struct glx_context dummyContext;
817
818 extern struct glx_screen *
819 indirect_create_screen(int screen, struct glx_display * priv);
820 extern struct glx_context *
821 indirect_create_context(struct glx_screen *psc,
822 struct glx_config *mode,
823 struct glx_context *shareList, int renderType);
824 extern struct glx_context *
825 indirect_create_context_attribs(struct glx_screen *base,
826 struct glx_config *config_base,
827 struct glx_context *shareList,
828 unsigned num_attribs,
829 const uint32_t *attribs,
830 unsigned *error);
831
832 #ifdef __cplusplus
833 }
834 #endif
835
836 #endif /* !__GLX_client_h__ */