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/Makefile.am b/GL/glx/Makefile.am index cd1130d..c03ff60 100644 --- a/GL/glx/Makefile.am +++ b/GL/glx/Makefile.am @@ -46,12 +46,13 @@ libglx_la_SOURCES = \ glxdrawable.h \ glxext.c \ glxext.h \ - glxvisuals.c \ + glxglcore.c \ glxscreens.c \ glxscreens.h \ glxserver.h \ glxutil.c \ glxutil.h \ + glxvisuals.c \ indirect_dispatch.c \ indirect_dispatch.h \ indirect_dispatch_swap.c \ @@ -79,3 +80,6 @@ libglx_la_SOURCES = \ swap_interval.c \ unpack.h \ xfont.c + +glxglcore.c: + ln -s $(top_srcdir)/GL/mesa/X/xf86glx.c $@ diff --git a/GL/mesa/X/Makefile.am b/GL/mesa/X/Makefile.am index f8f16c3..ace1181 100644 --- a/GL/mesa/X/Makefile.am +++ b/GL/mesa/X/Makefile.am @@ -22,8 +22,6 @@ AM_CFLAGS = \ -DXFree86Server \ @GLX_DEFINES@ -libX_la_SOURCES = xf86glx.c - nodist_libX_la_SOURCES = \ xm_api.c \ xm_buffer.c \ diff --git a/GL/mesa/X/xf86glx.c b/GL/mesa/X/xf86glx.c index 6fffdeb..32c80ee 100644 --- a/GL/mesa/X/xf86glx.c +++ b/GL/mesa/X/xf86glx.c @@ -36,8 +36,10 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #endif +#include #include +#define _NEED_GLCORE_IF #include #include #include @@ -45,11 +47,26 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include #include #include -#include "xmesaP.h" #include "glcontextmodes.h" #include "os.h" +static __GLcoreModule *glcore = NULL; + +#define XMesaCreateVisual (*glcore->XMesaCreateVisual) +#define XMesaDestroyVisual (*glcore->XMesaDestroyVisual) +#define XMesaCreateContext (*glcore->XMesaCreateContext) +#define XMesaDestroyContext (*glcore->XMesaDestroyContext) +#define XMesaCopyContext (*glcore->XMesaCopyContext) +#define XMesaForceCurrent (*glcore->XMesaForceCurrent) +#define XMesaLoseCurrent (*glcore->XMesaLoseCurrent) +#define XMesaCreateWindowBuffer (*glcore->XMesaCreateWindowBuffer) +#define XMesaCreatePixmapBuffer (*glcore->XMesaCreatePixmapBuffer) +#define XMesaDestroyBuffer (*glcore->XMesaDestroyBuffer) +#define XMesaMakeCurrent2 (*glcore->XMesaMakeCurrent2) +#define XMesaSwapBuffers (*glcore->XMesaSwapBuffers) +#define XMesaResizeBuffers (*glcore->XMesaResizeBuffers) + typedef struct __GLXMESAscreen __GLXMESAscreen; typedef struct __GLXMESAcontext __GLXMESAcontext; typedef struct __GLXMESAdrawable __GLXMESAdrawable; @@ -57,8 +74,9 @@ typedef struct __GLXMESAdrawable __GLXMESAdrawable; struct __GLXMESAscreen { __GLXscreen base; int index; - int num_vis; + int num_vis; XMesaVisual *xm_vis; + void *driver; }; struct __GLXMESAcontext { @@ -266,6 +284,8 @@ __glXMesaScreenDestroy(__GLXscreen *screen) xfree(mesaScreen->xm_vis); + dlclose(mesaScreen->driver); + __glXScreenDestroy(screen); xfree(screen); @@ -372,29 +392,62 @@ 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; + } + + glcore = dlsym(screen->driver, "glcore"); + if (glcore == NULL) { + LogMessage(X_ERROR, "GLX error: dlsym for %s failed (%s)\n", + "glcore", 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");