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