rendered paste body--- a/src/display.c
+++ b/src/display.c
@@ -46,6 +46,8 @@
#include <compiz.h>
+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 ();