--- a/src/display.c +++ b/src/display.c @@ -46,6 +46,8 @@ #include +extern Bool noLibGLFallback; + static unsigned int virtualModMask[] = { CompAltMask, CompMetaMask, CompSuperMask, CompHyperMask, CompModeSwitchMask, CompNumLockMask, CompScrollLockMask @@ -2513,6 +2515,17 @@ addDisplay (char *name, return FALSE; } + if (!noLibGLFallback) + { + int major, minor; + + if (!glXQueryVersion (dpy, &major, &minor)) + return FALSE; + + if (major < 2 || minor < 4) + return FALSE; + } + compDisplayInitOptions (d, plugin, nPlugin); snprintf (d->displayString, 255, "DISPLAY=%s", DisplayString (dpy)); diff --git a/src/main.c b/src/main.c index ec50353..f87bd90 100644 --- a/src/main.c +++ b/src/main.c @@ -86,6 +86,8 @@ Bool noDetection = FALSE; Bool useCow = TRUE; #endif +Bool noLibGLFallback = FALSE; + static void usage (void) { @@ -226,6 +228,10 @@ main (int argc, char **argv) if (i + 1 < argc) backgroundImage = argv[++i]; } + else if (!strcmp (argv[i], "--no-libgl-fallback")) + { + noLibGLFallback = TRUE; + } else if (*argv[i] == '-') { fprintf (stderr, "%s: Unknown option '%s'\n", programName, argv[i]); @@ -237,11 +243,32 @@ main (int argc, char **argv) } } + if (noLibGLFallback) + unsetenv ("LD_PRELOAD"); + if (!disableSm) initSession (clientId); if (!addDisplay (displayName, plugin, nPlugin)) + { + if (!noLibGLFallback) + { + char *arg[argc + 2]; + static const char *libindirect_libgl = "/usr/$LIB/libIndirectGL.so.1"; + + memcpy (arg, argv, sizeof (char *) * argc); + + arg[argc] = "--no-libgl-fallback"; + arg[argc + 1] = NULL; + + fprintf (stderr, "%s: Trying '%s'\n", programName, libindirect_libgl); + + setenv ("LD_PRELOAD", libindirect_libgl, TRUE); + execvp (arg[0], arg); + } + return 1; + } eventLoop ();