Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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 "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, Bool flush);
  117.    void (*copySubBuffer)(__GLXDRIdrawable *pdraw,
  118.                          int x, int y, int width, int height, Bool flush);
  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. extern Bool validate_renderType_against_config(const struct glx_config *config,
  807.                                                int renderType);
  808.  
  809.  
  810. extern struct glx_drawable *GetGLXDrawable(Display *dpy, GLXDrawable drawable);
  811. extern int InitGLXDrawable(Display *dpy, struct glx_drawable *glxDraw,
  812.                            XID xDrawable, GLXDrawable drawable);
  813. extern void DestroyGLXDrawable(Display *dpy, GLXDrawable drawable);
  814.  
  815. extern struct glx_context dummyContext;
  816.  
  817. extern struct glx_screen *
  818. indirect_create_screen(int screen, struct glx_display * priv);
  819. extern struct glx_context *
  820. indirect_create_context(struct glx_screen *psc,
  821.                         struct glx_config *mode,
  822.                         struct glx_context *shareList, int renderType);
  823. extern struct glx_context *
  824. indirect_create_context_attribs(struct glx_screen *base,
  825.                                 struct glx_config *config_base,
  826.                                 struct glx_context *shareList,
  827.                                 unsigned num_attribs,
  828.                                 const uint32_t *attribs,
  829.                                 unsigned *error);
  830.  
  831. #endif /* !__GLX_client_h__ */
  832.