diff --git a/GL/Makefile.am b/GL/Makefile.am index df9f533..97bb399 100644 --- a/GL/Makefile.am +++ b/GL/Makefile.am @@ -5,7 +5,7 @@ if BUILD_DARWIN DARWIN_SUBDIRS = apple endif -SUBDIRS = glx mesa $(DARWIN_SUBDIRS) +SUBDIRS = glx $(DARWIN_SUBDIRS) WINDOWS_EXTRAS = \ windows/ChangeLog \ diff --git a/GL/glx/glxglcore.c b/GL/glx/glxglcore.c index ecfa4d7..0f6c5f6 100644 --- a/GL/glx/glxglcore.c +++ b/GL/glx/glxglcore.c @@ -37,6 +37,7 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #endif #include +#include #include #include @@ -56,8 +57,9 @@ typedef struct __GLXMESAdrawable __GLXMESAdrawable; struct __GLXMESAscreen { __GLXscreen base; int index; - int num_vis; + int num_vis; XMesaVisual *xm_vis; + void *driver; }; struct __GLXMESAcontext { @@ -265,6 +267,8 @@ __glXMesaScreenDestroy(__GLXscreen *screen) xfree(mesaScreen->xm_vis); + dlclose(mesaScreen->driver); + __glXScreenDestroy(screen); xfree(screen); @@ -371,29 +375,55 @@ static void init_screen_visuals(__GLXMESAscreen *screen) screen->xm_vis = pXMesaVisual; } +static const char dri_driver_path[] = DRI_DRIVER_PATH; + static __GLXscreen * __glXMesaScreenProbe(ScreenPtr pScreen) { __GLXMESAscreen *screen; + char filename[128]; screen = xalloc(sizeof *screen); if (screen == NULL) return NULL; - __glXScreenInit(&screen->base, pScreen); - screen->base.destroy = __glXMesaScreenDestroy; screen->base.createContext = __glXMesaScreenCreateContext; screen->base.createDrawable = __glXMesaScreenCreateDrawable; screen->base.pScreen = pScreen; + snprintf(filename, sizeof filename, "%s/%s.so", + dri_driver_path, "libGLcore"); + + screen->driver = dlopen(filename, RTLD_LAZY | RTLD_LOCAL); + if (screen->driver == NULL) { + LogMessage(X_ERROR, "GLX error: dlopen of %s failed (%s)\n", + filename, dlerror()); + goto handle_error; + } + + __glXScreenInit(&screen->base, pScreen); + /* * Find the GLX visuals that are supported by this screen and create * XMesa's visuals. */ init_screen_visuals(screen); + LogMessage(X_INFO, "GLX: Loaded and initialized %s\n", filename); + return &screen->base; + +handle_error: + + if (screen->driver) + dlclose(screen->driver); + + xfree(screen); + + FatalError("GLX: could not load software renderer\n"); + + return NULL; } __GLXprovider __glXMesaProvider = { diff --git a/GL/symlink-mesa.sh b/GL/symlink-mesa.sh index 0cfe1c9..0b9704f 100755 --- a/GL/symlink-mesa.sh +++ b/GL/symlink-mesa.sh @@ -261,7 +261,6 @@ run() { # $1 what to do # $2 explanation - ACTION=$1 EXPLANATION=$2 run_module mesa ACTION=$1 EXPLANATION=$2 run_module glx } diff --git a/configure.ac b/configure.ac index a82485f..0d3724e 100644 --- a/configure.ac +++ b/configure.ac @@ -702,7 +702,7 @@ if test "x$GLX" = xyes && ! test "x$MESA_SOURCE" = x; then PKG_CHECK_MODULES([GL], [glproto >= 1.4.8]) AC_SUBST(XLIB_CFLAGS) AC_DEFINE(GLXEXT, 1, [Build GLX extension]) - GLX_LIBS='$(top_builddir)/GL/glx/libglx.la $(top_builddir)/GL/mesa/libGLcore.la' + GLX_LIBS='$(top_builddir)/GL/glx/libglx.la' test -d GL || mkdir GL case $host_os in solaris*) @@ -719,6 +719,13 @@ fi AM_CONDITIONAL(GLX, test "x$GLX" = xyes) AC_SUBST([MESA_SOURCE]) +if test "x$GLX" = xyes; then +dnl Check to see if dlopen is in default libraries (like Solaris, which +dnl has it in libc), or if libdl is needed to get it. + AC_CHECK_FUNC([dlopen], [], + AC_CHECK_LIB([dl], [dlopen], GLX_LIBS="$GLX_LIBS -ldl")) +fi + if test "x$AIGLX" = xyes -a "x$GLX" = xyes -a "x$DRI" = xyes; then AC_DEFINE(AIGLX, 1, [Build AIGLX loader]) else @@ -1959,18 +1966,6 @@ Makefile GL/Makefile GL/apple/Makefile GL/glx/Makefile -GL/mesa/Makefile -GL/mesa/glapi/Makefile -GL/mesa/main/Makefile -GL/mesa/math/Makefile -GL/mesa/shader/Makefile -GL/mesa/shader/grammar/Makefile -GL/mesa/shader/slang/Makefile -GL/mesa/swrast/Makefile -GL/mesa/swrast_setup/Makefile -GL/mesa/tnl/Makefile -GL/mesa/vbo/Makefile -GL/mesa/X/Makefile include/Makefile composite/Makefile damageext/Makefile diff --git a/hw/xfree86/dixmods/Makefile.am b/hw/xfree86/dixmods/Makefile.am index 37704c3..bf67eb2 100644 --- a/hw/xfree86/dixmods/Makefile.am +++ b/hw/xfree86/dixmods/Makefile.am @@ -3,7 +3,7 @@ noinst_LTLIBRARIES = libdixmods.la libxorgxkb.la SUBDIRS = extmod if GLX -GLXMODS = libglx.la libGLcore.la +GLXMODS = libglx.la endif if XTRAP @@ -50,10 +50,6 @@ INCLUDES = @XORG_INCS@ \ -I$(top_srcdir)/miext/shadow \ -I$(top_srcdir)/GL/glx -libGLcore_la_LDFLAGS = -avoid-version -libGLcore_la_LIBADD = $(top_builddir)/GL/mesa/libGLcore.la -libGLcore_la_SOURCES = GLcoremodule.c - libdbe_la_LDFLAGS = -avoid-version libdbe_la_LIBADD = $(top_builddir)/dbe/libdbe.la libdbe_la_SOURCES = dbemodule.c diff --git a/hw/xfree86/dixmods/glxmodule.c b/hw/xfree86/dixmods/glxmodule.c index 5384f43..ec90e59 100644 --- a/hw/xfree86/dixmods/glxmodule.c +++ b/hw/xfree86/dixmods/glxmodule.c @@ -42,13 +42,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #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 __GLXprovider __glXMesaProvider; extern void GlxPushProvider(__GLXprovider *provider); extern void GlxExtensionInit(void); @@ -88,33 +83,6 @@ _X_EXPORT XF86ModuleData glxModuleData = { &VersRec, glxSetup, NULL }; static pointer glxModule; -static __GLXscreen * -__glXMesaProxyScreenProbe(ScreenPtr pScreen) -{ - pointer GLcore; - static __GLXprovider *provider; - - if (provider == NULL) { - GLcore = LoadSubModule(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) { @@ -129,7 +97,7 @@ glxSetup(pointer module, pointer opts, int *errmaj, int *errmin) setupDone = TRUE; glxModule = module; - GlxPushProvider(&__glXMesaProxyProvider); + GlxPushProvider(&__glXMesaProvider); xf86Msg(xf86Info.aiglxFrom, "AIGLX %s\n", xf86Info.aiglx ? "enabled" : "disabled");