summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Jackson <ajax@nwnk.net>2004-07-26 19:06:04 +0000
committerAdam Jackson <ajax@nwnk.net>2004-07-26 19:06:04 +0000
commit799208dd44a65b18dda97b4843a27a2628f955f4 (patch)
tree4cafbfde85bc8b90db60aad1b11caf097d9bb83c
parentf15f881727cee9a879bd43be8dc849320f8d3cbd (diff)
Bug #377: Make lib{glx,GLcore,dri} work when compiled as dlloader modules.
-rw-r--r--GL/apple/indirect.c12
-rw-r--r--GL/glx/glxext.c7
-rw-r--r--GL/glx/glxscreens.c21
-rw-r--r--GL/glx/glxserver.h3
-rw-r--r--GL/glx/glxutil.h3
-rw-r--r--GL/mesa/X/xf86glx.c12
-rwxr-xr-xGL/windows/indirect.c12
-rw-r--r--hw/xfree86/dixmods/glxmodule.c2
-rw-r--r--hw/xfree86/dri/dri.c4
9 files changed, 56 insertions, 20 deletions
diff --git a/GL/apple/indirect.c b/GL/apple/indirect.c
index c4d235a47..3f6a5e6d2 100644
--- a/GL/apple/indirect.c
+++ b/GL/apple/indirect.c
@@ -109,7 +109,7 @@ static void glAquaResetExtension(void);
* struct. In particular, the contextCreate, pGlxVisual, numVisuals,
* and numUsableVisuals fields must be initialized.
*/
-__GLXscreenInfo __glDDXScreenInfo = {
+static __GLXscreenInfo __glDDXScreenInfo = {
glAquaScreenProbe, /* Must be generic and handle all screens */
glAquaCreateContext, /* Substitute screen's createContext routine */
glAquaCreateBuffer, /* Substitute screen's createBuffer routine */
@@ -123,13 +123,21 @@ __GLXscreenInfo __glDDXScreenInfo = {
NULL /* WrappedPositionWindow is overwritten */
};
-__GLXextensionInfo __glDDXExtensionInfo = {
+void *__glXglDDXScreenInfo(void) {
+ return &__glDDXScreenInfo;
+}
+
+static __GLXextensionInfo __glDDXExtensionInfo = {
GL_CORE_APPLE,
glAquaResetExtension,
glAquaInitVisuals,
glAquaSetVisualConfigs
};
+void *__glXglDDXExtensionInfo(void) {
+ return &__glDDXExtensionInfo;
+}
+
// prototypes
static GLboolean glAquaDestroyContext(__GLcontext *gc);
diff --git a/GL/glx/glxext.c b/GL/glx/glxext.c
index 5e6801744..87c9e1448 100644
--- a/GL/glx/glxext.c
+++ b/GL/glx/glxext.c
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/GL/glx/glxext.c,v 1.8 2001/08/23 18:25:40 alanh Exp $
+/* $XFree86: xc/programs/Xserver/GL/glx/glxext.c,v 1.9 2003/09/28 20:15:43 alanh Exp $
** The contents of this file are subject to the GLX Public License Version 1.0
** (the "License"). You may not use this file except in compliance with the
** License. You may obtain a copy of the License at Silicon Graphics, Inc.,
@@ -30,12 +30,11 @@
#include "micmap.h"
-extern __GLXextensionInfo __glDDXExtensionInfo;
void GlxWrapInitVisuals(miInitVisualsProcPtr *);
void GlxSetVisualConfigs(int nconfigs,
__GLXvisualConfig *configs, void **privates);
-__GLXextensionInfo *__glXExt = &__glDDXExtensionInfo;
+static __GLXextensionInfo *__glXExt /* = &__glDDXExtensionInfo */;
/*
** Forward declarations.
@@ -314,6 +313,8 @@ GlxWrapInitVisuals(miInitVisualsProcPtr *initVisProc)
{
saveInitVisualsProc = *initVisProc;
*initVisProc = GlxInitVisuals;
+ /* HACK: this shouldn't be done here but it's the earliest time */
+ __glXExt = __glXglDDXExtensionInfo(); /* from GLcore */
}
/************************************************************************/
diff --git a/GL/glx/glxscreens.c b/GL/glx/glxscreens.c
index 0b985f06c..6ddbfcbd0 100644
--- a/GL/glx/glxscreens.c
+++ b/GL/glx/glxscreens.c
@@ -142,22 +142,25 @@ static char GLXServerExtensions[] =
;
/*
-** This comes from the GL library that the server will link with. Right
-** now, that is the DDX Sample OpenGL.
-*/
-extern __GLXscreenInfo __glDDXScreenInfo;
-
-__GLXscreenInfo *__glXScreens[] = {
- &__glDDXScreenInfo,
+ * __glDDXScreenInfo comes from GLcore, so we can't resolve this symbol at
+ * module open time. Leave a placeholder, and fill this in when we first
+ * need it (in __glXScreenInit). XXX Why make this an array?
+ */
+static __GLXscreenInfo *__glXScreens[] = {
+ NULL /* &__glDDXScreenInfo */ ,
};
-GLint __glXNumStaticScreens = (sizeof __glXScreens / sizeof __glXScreens[0]);
+static GLint __glXNumStaticScreens =
+ (sizeof __glXScreens / sizeof __glXScreens[0]);
__GLXscreenInfo *__glXActiveScreens;
GLint __glXNumActiveScreens;
RESTYPE __glXDrawableRes;
+__GLXscreenInfo *__glXgetActiveScreen(int num) {
+ return &__glXActiveScreens[num];
+}
/*
** Destroy routine that gets called when a drawable is freed. A drawable
@@ -273,6 +276,8 @@ void __glXScreenInit(GLint numscreens)
{
GLint i,j;
+ __glXScreens[0] = __glXglDDXScreenInfo(); /* from GLcore */
+
/*
** This alloc has to work or else the server might as well core dump.
*/
diff --git a/GL/glx/glxserver.h b/GL/glx/glxserver.h
index 67f5e961f..66d681d2d 100644
--- a/GL/glx/glxserver.h
+++ b/GL/glx/glxserver.h
@@ -1,4 +1,4 @@
-/* $XFree86: xc/programs/Xserver/GL/glx/glxserver.h,v 1.4 2001/08/23 18:25:40 alanh Exp $ */
+/* $XFree86: xc/programs/Xserver/GL/glx/glxserver.h,v 1.5 2003/09/28 20:15:43 alanh Exp $ */
#ifndef _GLX_server_h_
#define _GLX_server_h_
@@ -92,6 +92,7 @@ typedef struct __GLXclientStateRec __GLXclientState;
extern __GLXscreenInfo *__glXActiveScreens;
extern GLint __glXNumActiveScreens;
+extern __GLXscreenInfo *__glXgetActiveScreen(int num);
/************************************************************************/
diff --git a/GL/glx/glxutil.h b/GL/glx/glxutil.h
index 970683cb1..dbf7084b5 100644
--- a/GL/glx/glxutil.h
+++ b/GL/glx/glxutil.h
@@ -72,6 +72,9 @@ extern void __glXCacheDrawableSize(__GLXdrawablePrivate *glxPriv);
/* context helper routines */
extern __GLXcontext *__glXLookupContextByTag(__GLXclientState*, GLXContextTag);
+/* init helper routines */
+extern void *__glXglDDXScreenInfo(void);
+extern void *__glXglDDXExtensionInfo(void);
#endif /* _glxcmds_h_ */
diff --git a/GL/mesa/X/xf86glx.c b/GL/mesa/X/xf86glx.c
index 905e0cc15..bd8ff7fe0 100644
--- a/GL/mesa/X/xf86glx.c
+++ b/GL/mesa/X/xf86glx.c
@@ -76,7 +76,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
* struct. In particular, the contextCreate, pGlxVisual, numVisuals,
* and numUsableVisuals fields must be initialized.
*/
-__GLXscreenInfo __glDDXScreenInfo = {
+static __GLXscreenInfo __glDDXScreenInfo = {
__MESA_screenProbe, /* Must be generic and handle all screens */
__MESA_createContext, /* Substitute screen's createContext routine */
__MESA_createBuffer, /* Substitute screen's createBuffer routine */
@@ -90,13 +90,21 @@ __GLXscreenInfo __glDDXScreenInfo = {
NULL /* WrappedPositionWindow is overwritten */
};
-__GLXextensionInfo __glDDXExtensionInfo = {
+void *__glXglDDXScreenInfo(void) {
+ return &__glDDXScreenInfo;
+}
+
+static __GLXextensionInfo __glDDXExtensionInfo = {
GL_CORE_MESA,
__MESA_resetExtension,
__MESA_initVisuals,
__MESA_setVisualConfigs
};
+void *__glXglDDXExtensionInfo(void) {
+ return &__glDDXExtensionInfo;
+}
+
static __MESA_screen MESAScreens[MAXSCREENS];
static __GLcontext *MESA_CC = NULL;
diff --git a/GL/windows/indirect.c b/GL/windows/indirect.c
index cee9e6586..11dc0c092 100755
--- a/GL/windows/indirect.c
+++ b/GL/windows/indirect.c
@@ -172,7 +172,7 @@ static void glWinResetExtension(void);
* struct. In particular, the contextCreate, pGlxVisual, numVisuals,
* and numUsableVisuals fields must be initialized.
*/
-__GLXscreenInfo __glDDXScreenInfo = {
+static __GLXscreenInfo __glDDXScreenInfo = {
glWinScreenProbe, /* Must be generic and handle all screens */
glWinCreateContext, /* Substitute screen's createContext routine */
glWinCreateBuffer, /* Substitute screen's createBuffer routine */
@@ -186,13 +186,21 @@ __GLXscreenInfo __glDDXScreenInfo = {
NULL /* WrappedPositionWindow is overwritten */
};
-__GLXextensionInfo __glDDXExtensionInfo = {
+void *__glXglDDXScreenInfo(void) {
+ return &__glDDXScreenInfo;
+}
+
+static __GLXextensionInfo __glDDXExtensionInfo = {
GL_CORE_WINDOWS,
glWinResetExtension,
glWinInitVisuals,
glWinSetVisualConfigs
};
+void *__glXglDDXExtensionInfo(void) {
+ return &__glDDXExtensionInfo;
+}
+
/* prototypes */
static GLboolean glWinDestroyContext(__GLcontext *gc);
diff --git a/hw/xfree86/dixmods/glxmodule.c b/hw/xfree86/dixmods/glxmodule.c
index 4994e7335..853d49b0f 100644
--- a/hw/xfree86/dixmods/glxmodule.c
+++ b/hw/xfree86/dixmods/glxmodule.c
@@ -113,6 +113,8 @@ static const char *glcoreSymbols[] = {
"__glTexGeniv_size",
"__glTexParameterfv_size",
"__glTexParameteriv_size",
+ "__glXglDDXExtensionInfo",
+ "__glXglDDXScreenInfo",
"__glXActiveScreens",
"__glXAssociateContext",
"__glXBadContext",
diff --git a/hw/xfree86/dri/dri.c b/hw/xfree86/dri/dri.c
index e01303f9f..513819e21 100644
--- a/hw/xfree86/dri/dri.c
+++ b/hw/xfree86/dri/dri.c
@@ -779,7 +779,7 @@ static Bool
DRICreateDummyContext(ScreenPtr pScreen, Bool needCtxPriv)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- __GLXscreenInfo *pGLXScreen = &__glXActiveScreens[pScreen->myNum];
+ __GLXscreenInfo *pGLXScreen = __glXgetActiveScreen(pScreen->myNum);
__GLcontextModes *modes = pGLXScreen->modes;
void **pVisualConfigPriv = pGLXScreen->pVisualPriv;
DRIContextPrivPtr pDRIContextPriv;
@@ -843,7 +843,7 @@ DRICreateContext(ScreenPtr pScreen, VisualPtr visual,
XID context, drm_context_t * pHWContext)
{
DRIScreenPrivPtr pDRIPriv = DRI_SCREEN_PRIV(pScreen);
- __GLXscreenInfo *pGLXScreen = &__glXActiveScreens[pScreen->myNum];
+ __GLXscreenInfo *pGLXScreen = __glXgetActiveScreen(pScreen->myNum);
__GLcontextModes *modes = pGLXScreen->modes;
void **pVisualConfigPriv = pGLXScreen->pVisualPriv;
DRIContextPrivPtr pDRIContextPriv;