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