#ifdef HAVE_XORG_CONFIG_H
#include <xorg-config.h>
#endif
#include "xf86Module.h"
#include "xf86Priv.h"
#include "xf86.h"
#include "colormap.h"
#include "micmap.h"
#include "globals.h"
typedef struct __GLXscreen __GLXscreen;
typedef struct __GLXprovider __GLXprovider;
struct __GLXprovider {
__GLXscreen *(*screenProbe)(ScreenPtr pScreen);
const char *name;
__GLXprovider *next;
};
extern void GlxPushProvider(__GLXprovider *provider);
extern void GlxExtensionInit(void);
extern void GlxWrapInitVisuals(miInitVisualsProcPtr *);
static MODULESETUPPROTO(glxSetup);
static const char *initdeps[] = { "DOUBLE-BUFFER", NULL };
static ExtensionModule GLXExt =
{
GlxExtensionInit,
"GLX",
&noGlxExtension,
NULL,
initdeps
};
static XF86ModuleVersionInfo VersRec =
{
"glx",
MODULEVENDORSTRING,
MODINFOSTRING1,
MODINFOSTRING2,
XORG_VERSION_CURRENT,
1, 0, 0,
ABI_CLASS_EXTENSION,
ABI_EXTENSION_VERSION,
MOD_CLASS_NONE,
{0,0,0,0}
};
_X_EXPORT XF86ModuleData glxModuleData = { &VersRec, glxSetup, NULL };
static pointer glxModule;
static __GLXscreen *
__glXMesaProxyScreenProbe(ScreenPtr pScreen)
{
pointer GLcore;
static __GLXprovider *provider;
if (provider == NULL) {
GLcore = LoadSubModuleLocal(glxModule, "GLcore", NULL, NULL, NULL, NULL,
NULL, NULL);
if (GLcore == NULL)
return NULL;
provider = LoaderSymbol("__glXMesaProvider");
if (provider == NULL)
return NULL;
}
return provider->screenProbe(pScreen);
}
static __GLXprovider __glXMesaProxyProvider = {
__glXMesaProxyScreenProbe,
"MESA-PROXY",
NULL
};
static pointer
glxSetup(pointer module, pointer opts, int *errmaj, int *errmin)
{
static Bool setupDone = FALSE;
__GLXprovider *provider;
if (setupDone) {
if (errmaj) *errmaj = LDR_ONCEONLY;
return NULL;
}
setupDone = TRUE;
glxModule = module;
GlxPushProvider(&__glXMesaProxyProvider);
xf86Msg(xf86Info.aiglxFrom, "AIGLX %s\n",
xf86Info.aiglx ? "enabled" : "disabled");
if (xf86Info.aiglx) {
provider = LoaderSymbol("__glXDRIProvider");
if (provider)
GlxPushProvider(provider);
}
LoadExtension(&GLXExt, FALSE);
GlxWrapInitVisuals(&miInitVisualsProc);
miHookInitVisuals(NULL, GlxWrapInitVisuals);
bail:
return module;
}