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