restore FASTCALL stuff
[mesa.git] / src / glx / x11 / glxclient.h
index d0cc12e5ffe045b2bc6d0046b41c5a0bda6b2772..bc9a94c5d5bb6db8419d55a9609587fabf41782b 100644 (file)
 #include "GL/glxproto.h"
 #include "GL/internal/glcore.h"
 #include "glapitable.h"
-#ifdef XTHREADS
-#include "Xthreads.h"
-#endif
-#ifdef GLX_BUILT_IN_XMESA
-#include "realglx.h"  /* just silences prototype warnings */
+#include "glxextensions.h"
+#if defined( USE_XTHREADS )
+# include <X11/Xthreads.h>
+#elif defined( PTHREADS )
+# include <pthread.h>
 #endif
 
 #define GLX_MAJOR_VERSION      1       /* current version numbers */
@@ -81,15 +81,6 @@ typedef struct _glapi_table __GLapi;
 
 #include <GL/internal/dri_interface.h>
 
-typedef void *(*CreateScreenFunc)(Display *dpy, int scrn, __DRIscreen *psc,
-                                  int numConfigs, __GLXvisualConfig *config);
-
-typedef void *(*CreateNewScreenFunc)(Display *dpy, int scrn, __DRIscreen *psc,
-    const __GLcontextModes * modes, const __DRIversion * ddx_version,
-    const __DRIversion * dri_version, const __DRIversion * drm_version,
-    const __DRIframebuffer * frame_buffer, void * pSAREA,
-    int fd, int internal_api_version, __GLcontextModes ** driver_modes);
-
 
 /**
  * Display dependent methods.  This structure is initialized during the
@@ -101,17 +92,6 @@ struct __DRIdisplayRec {
      */
     void (*destroyDisplay)(Display *dpy, void *displayPrivate);
 
-    /**
-     * Methods to create the private DRI screen data and initialize the
-     * screen dependent methods.
-     * This is an array [indexed by screen number] of function pointers.
-     * 
-     * \deprecated  This array of function pointers has been replaced by
-     *              \c __DRIdisplayRec::createNewScreen.
-     * \sa __DRIdisplayRec::createNewScreen
-     */
-    CreateScreenFunc * createScreen;
-
     /**
      * Opaque pointer to private per display direct rendering data.
      * \c NULL if direct rendering is not supported on this display.
@@ -121,10 +101,8 @@ struct __DRIdisplayRec {
     /**
      * Array of pointers to methods to create and initialize the private DRI
      * screen data.
-     *
-     * \sa __DRIdisplayRec::createScreen
      */
-    CreateNewScreenFunc * createNewScreen;
+    PFNCREATENEWSCREENFUNC * createNewScreen;
 };
 
 
@@ -134,8 +112,7 @@ struct __DRIdisplayRec {
 struct __DRIdriverRec {
    const char *name;
    void *handle;
-   CreateScreenFunc createScreenFunc;
-   CreateNewScreenFunc createNewScreenFunc;
+   PFNCREATENEWSCREENFUNC createNewScreenFunc;
    struct __DRIdriverRec *next;
 };
 
@@ -157,6 +134,8 @@ extern const char *glXGetScreenDriver (Display *dpy, int scrNum);
 
 extern const char *glXGetDriverConfig (const char *driverName);
 
+extern Bool __glXWindowExists(Display *dpy, GLXDrawable draw);
+
 #endif
 
 /************************************************************************/
@@ -175,155 +154,29 @@ typedef struct __GLXpixelStoreModeRec {
     GLuint alignment;
 } __GLXpixelStoreMode;
 
-/* The next 3 structures are deprecated.  Client state is no longer tracked
- * using them.  They only remain to maintain the layout / structure offset of
- * __GLXcontextRec.  In XFree86 5.0 they will be removed altogether.
- */
-
-typedef struct __GLXvertexArrayPointerStateRecDEPRECATED {
-    GLboolean enable;
-    void (*proc)(const void *);
-    const GLubyte *ptr;
-    GLsizei skip;
-    GLint size;
-    GLenum type;
-    GLsizei stride;
-} __GLXvertexArrayPointerStateDEPRECATED;
-
-typedef struct __GLXvertArrayStateRecDEPRECATED {
-    __GLXvertexArrayPointerStateDEPRECATED vertex;
-    __GLXvertexArrayPointerStateDEPRECATED normal;
-    __GLXvertexArrayPointerStateDEPRECATED color;
-    __GLXvertexArrayPointerStateDEPRECATED index;
-    __GLXvertexArrayPointerStateDEPRECATED texCoord[__GLX_MAX_TEXTURE_UNITS];
-    __GLXvertexArrayPointerStateDEPRECATED edgeFlag;
-    GLint maxElementsVertices;
-    GLint maxElementsIndices;
-    GLint activeTexture;
-} __GLXvertArrayStateDEPRECATED;
-
-typedef struct __GLXattributeRecDEPRECATED {
-       GLuint mask;
-
-       /*
-       ** Pixel storage state.  Most of the pixel store mode state is kept
-       ** here and used by the client code to manage the packing and
-       ** unpacking of data sent to/received from the server.
-       */
-       __GLXpixelStoreMode storePack, storeUnpack;
-
-       /*
-       ** Vertex Array storage state.  The vertex array component
-       ** state is stored here and is used to manage the packing of
-       ** DrawArrays data sent to the server.
-       */
-       __GLXvertArrayStateDEPRECATED vertArray;
-} __GLXattributeDEPRECATED;
-
-typedef struct __GLXvertexArrayPointerStateRec {
-    void (*proc)(const void *);
-    void (*mtex_proc)(GLenum, const void *);
-    const GLubyte *ptr;
-    GLsizei skip;
-    GLint size;
-    GLenum type;
-    GLsizei stride;
-} __GLXvertexArrayPointerState;
 
-/**
- * Define which entries of \c __GLXvertArrayState::arrays match which
- * vertex arrays in the client-state vector.  These are only the one-of
- * arrays.  See the \c __GLXvertArrayState::arrays documentation for more
- * details.
- * 
- * \sa __GLXvertArrayState
- */
-enum {
-    edgeFlag_ARRAY,       /**< \c GL_EDGE_FLAG_ARRAY */
-    index_ARRAY,          /**< \c GL_INDEX_ARRAY */
-    fogCoord_ARRAY,       /**< \c GL_FOG_COORD_ARRAY */
-    secondaryColor_ARRAY, /**< \c GL_SECONDARY_COLOR_ARRAY */
-    color_ARRAY,          /**< \c GL_COLOR_ARRAY */
-    normal_ARRAY,         /**< \c GL_NORMAL_ARRAY */
-       
-    /**
-     * \c GL_VERTEX_ARRAY \b must be last!  All of the code for emitting arrays
-     * and array elements is written based on the assumption that the vertex
-     * array is last.
-     */
-    vertex_ARRAY,
-
-    __GLX_MAX_ARRAYS      /**< Place holder entry. */
-};
-
-#define ENABLE_ARRAY(state,a) \
-    do { (state)->vertArray.enables |=  (1U << (a ## _ARRAY)); } while( 0 )
-#define DISABLE_ARRAY(state,a) \
-    do { (state)->vertArray.enables &= ~(1U << (a ## _ARRAY)); } while( 0 )
-#define IS_ARRAY_ENABLED_BY_INDEX(state, i) \
-    (((state)->vertArray.enables & (1U << (i))) != 0)
-#define IS_ARRAY_ENABLED(state, a) \
-    IS_ARRAY_ENABLED_BY_INDEX(state, a ## _ARRAY)
-
-#define ENABLE_TEXARRAY(state,a) \
-    do { (state)->vertArray.texture_enables |=  (1U << a); } while( 0 )
-#define DISABLE_TEXARRAY(state,a) \
-    do { (state)->vertArray.texture_enables &= ~(1U << a); } while( 0 )
-#define IS_TEXARRAY_ENABLED(state, a) \
-    (((state)->vertArray.texture_enables & (1U << a)) != 0)
+typedef struct __GLXattributeRec {
+    GLuint mask;
 
-/**
- * Client-side vertex array state.
- */
-typedef struct __GLXvertArrayStateRec {
     /**
-     * Which client-side arrays are enabled?  These are the flag bits for
-     * all of the non-texture coordinate arrays.
+     * Pixel storage state.  Most of the pixel store mode state is kept
+     * here and used by the client code to manage the packing and
+     * unpacking of data sent to/received from the server.
      */
-    GLuint enables;
+    __GLXpixelStoreMode storePack, storeUnpack;
 
     /**
-     * Which of the texture coordinate arrays are enabled?
+     * Is EXT_vertex_array / GL 1.1 DrawArrays protocol specifically
+     * disabled?
      */
-    GLuint texture_enables;
-
+    GLboolean NoDrawArraysProtocol;
+    
     /**
-     * State for "one-of" arrays.  These are the arrays, such as
-     * GL_COLOR_ARRAY or GL_FOG_COORD_ARRAY for which there is only one
-     * array.  There are also "many-of" arrays, such as
-     * GL_TEXTURE_COORD_ARRAY.
+     * Vertex Array storage state.  The vertex array component
+     * state is stored here and is used to manage the packing of
+     * DrawArrays data sent to the server.
      */
-    __GLXvertexArrayPointerState arrays[__GLX_MAX_ARRAYS];
-
-    __GLXvertexArrayPointerState texCoord[__GLX_MAX_TEXTURE_UNITS];
-
-    GLint maxElementsVertices;
-    GLint maxElementsIndices;
-    GLint activeTexture;
-} __GLXvertArrayState;
-
-typedef struct __GLXattributeRec {
-       GLuint mask;
-
-       /*
-       ** Pixel storage state.  Most of the pixel store mode state is kept
-       ** here and used by the client code to manage the packing and
-       ** unpacking of data sent to/received from the server.
-       */
-       __GLXpixelStoreMode storePack, storeUnpack;
-
-       /*
-       ** Vertex Array storage state.  The vertex array component
-       ** state is stored here and is used to manage the packing of
-       ** DrawArrays data sent to the server.
-       */
-       __GLXvertArrayState vertArray;
-
-       /**
-        * Is EXT_vertex_array / GL 1.1 DrawArrays protocol specifically
-        * disabled?
-        */
-       GLboolean NoDrawArraysProtocol;
+    struct array_state_vector * array_state;
 } __GLXattribute;
 
 typedef struct __GLXattributeMachineRec {
@@ -432,12 +285,9 @@ struct __GLXcontextRec {
                      GLenum, const GLvoid*, GLubyte*, GLubyte*);
 
     /**
-     * \name Client side attribs.
+     * Client side attribs.
      */
-    /*@{*/
-    __GLXattributeDEPRECATED stateDEPRECATED;
     __GLXattributeMachine attributes;
-    /*@}*/
 
     /**
      * Client side error code.  This is set when client side gl API
@@ -529,7 +379,7 @@ struct __GLXcontextRec {
     * drivers should NEVER use this data or even care that it exists.
     */
    void * client_state_private;
-   
+
    /**
     * Stored value for \c glXQueryContext attribute \c GLX_RENDER_TYPE.
     */
@@ -546,6 +396,8 @@ struct __GLXcontextRec {
    int server_major;        /**< Major version number. */
    int server_minor;        /**< Minor version number. */
     /*@}*/
+
+    char gl_extension_bits[ __GL_EXT_BYTES ];
 };
 
 #define __glXSetError(gc,code) \
@@ -588,14 +440,6 @@ extern void __glFreeAttributeState(__GLXcontext *);
  * a pointer to the config data for that screen (if the screen supports GL).
  */
 typedef struct __GLXscreenConfigsRec {
-    /**
-     * GLX visuals formated as \c __GLXvisualConfig structures.
-     */
-    /*@{*/
-    __GLXvisualConfig * old_configs;
-    int numOldConfigs;
-    /*@}*/
-
     /**
      * GLX extension string reported by the X-server.
      */
@@ -615,10 +459,10 @@ typedef struct __GLXscreenConfigsRec {
 #endif
 
     /**
-     * Linked list of configurations for this screen.  This is intended to
-     * be a superset of \c old_configs.
+     * Linked list of configurations for this screen.
      */
     __GLcontextModes *configs;
+
     /**
      * Per-screen dynamic GLX extension tracking.  The \c direct_support
      * field only contains enough bits for 64 extensions.  Should libGL
@@ -703,24 +547,44 @@ extern __GLXdisplayPrivate *__glXInitialize(Display*);
 extern int __glXDebug;
 
 /* This is per-thread storage in an MT environment */
-#if defined(GLX_DIRECT_RENDERING) && defined(XTHREADS)
-extern __GLXcontext *__glXGetCurrentContext(void);
+#if defined( USE_XTHREADS ) || defined( PTHREADS )
+
 extern void __glXSetCurrentContext(__GLXcontext *c);
+
+# if defined( GLX_USE_TLS )
+
+extern __thread void * __glX_tls_Context
+    __attribute__((tls_model("initial-exec")));
+
+#  define __glXGetCurrentContext()     __glX_tls_Context
+
+# else
+
+extern __GLXcontext *__glXGetCurrentContext(void);
+
+# endif /* defined( GLX_USE_TLS ) */
+
 #else
+
 extern __GLXcontext *__glXcurrentContext;
 #define __glXGetCurrentContext()       __glXcurrentContext
 #define __glXSetCurrentContext(gc)     __glXcurrentContext = gc
-#endif
+
+#endif /* defined( USE_XTHREADS ) || defined( PTHREADS ) */
 
 
 /*
 ** Global lock for all threads in this address space using the GLX
 ** extension
 */
-#if defined(GLX_DIRECT_RENDERING) && defined(XTHREADS)
+#if defined( USE_XTHREADS )
 extern xmutex_rec __glXmutex;
 #define __glXLock()    xmutex_lock(&__glXmutex)
 #define __glXUnlock()  xmutex_unlock(&__glXmutex)
+#elif defined( PTHREADS )
+extern pthread_mutex_t __glXmutex;
+#define __glXLock()    pthread_mutex_lock(&__glXmutex)
+#define __glXUnlock()  pthread_mutex_unlock(&__glXmutex)
 #else
 #define __glXLock()
 #define __glXUnlock()
@@ -805,17 +669,6 @@ extern void _XSend(Display*, const void*, long);
 #endif
 
 
-/*
-** GLX_BUILT_IN_XMESA controls whether libGL has a built-in verions of
-** Mesa that can render to non-GLX displays.
-*/
-#ifdef GLX_BUILT_IN_XMESA
-#define GLX_PREFIX(function)  _real_##function
-#else
-#define GLX_PREFIX(function)  function
-#endif
-
-
 extern void __glXInitializeVisualConfigFromTags( __GLcontextModes *config,
     int count, const INT32 *bp, Bool tagged_only, Bool fbconfig_style_tags );