diff --git a/composite.cpp b/composite.cpp index b309bd9d38..d2c31c0219 100644 --- a/composite.cpp +++ b/composite.cpp @@ -122,6 +122,14 @@ void Workspace::setupCompositing() else { unsafeConfig.writeEntry("OpenGLIsUnsafe", true); unsafeConfig.sync(); +#ifndef KWIN_HAVE_OPENGLES + if (!CompositingPrefs::hasGlx()) { + unsafeConfig.writeEntry("OpenGLIsUnsafe", false); + unsafeConfig.sync(); + kDebug(1212) << "No glx extensions available"; + break; + } +#endif scene = new SceneOpenGL(this); diff --git a/compositingprefs.cpp b/compositingprefs.cpp index 025048e70d..cf3bc1436b 100644 --- a/compositingprefs.cpp +++ b/compositingprefs.cpp @@ -80,7 +80,7 @@ bool CompositingPrefs::compositingPossible() return false; } #ifdef KWIN_HAVE_OPENGL_COMPOSITING - if (Extensions::glxAvailable()) + if (hasGlx()) return true; #endif #ifdef KWIN_HAVE_XRENDER_COMPOSITING @@ -116,14 +116,14 @@ QString CompositingPrefs::compositingNotPossibleReason() return i18n("Required X extensions (XComposite and XDamage) are not available."); } #if defined( KWIN_HAVE_OPENGL_COMPOSITING ) && !defined( KWIN_HAVE_XRENDER_COMPOSITING ) - if (!Extensions::glxAvailable()) + if (!hasGlx()) return i18n("GLX/OpenGL are not available and only OpenGL support is compiled."); #elif !defined( KWIN_HAVE_OPENGL_COMPOSITING ) && defined( KWIN_HAVE_XRENDER_COMPOSITING ) if (!(Extensions::renderAvailable() && Extensions::fixesAvailable())) return i18n("XRender/XFixes extensions are not available and only XRender support" " is compiled."); #else - if (!(Extensions::glxAvailable() + if (!(hasGlx() || (Extensions::renderAvailable() && Extensions::fixesAvailable()))) { return i18n("GLX/OpenGL and XRender/XFixes are not available."); } @@ -135,6 +135,24 @@ QString CompositingPrefs::compositingNotPossibleReason() #endif } +static bool s_glxDetected = false; +static bool s_hasGlx = false; + +bool CompositingPrefs::hasGlx() +{ + if (s_glxDetected) { + return s_hasGlx; + } +#ifdef KWIN_HAVE_OPENGL_COMPOSITING +#ifndef KWIN_HAVE_OPENGLES + int event_base, error_base; + s_hasGlx = glXQueryExtension(display(), &event_base, &error_base); +#endif +#endif + s_glxDetected = true; + return s_hasGlx; +} + void CompositingPrefs::detect() { if (!compositingPossible() || openGlIsBroken()) { @@ -186,7 +204,7 @@ void CompositingPrefs::detect() if (QProcess::execute(opengl_test) != 0) setenv("LIBGL_ALWAYS_INDIRECT", "1", true); } - if (!Extensions::glxAvailable()) { + if (!hasGlx()) { kDebug(1212) << "No GLX available"; gl_workaround_config.writeEntry("OpenGLIsUnsafe", false); gl_workaround_config.sync(); diff --git a/compositingprefs.h b/compositingprefs.h index 4cfc0095ef..3ecb03b5ce 100644 --- a/compositingprefs.h +++ b/compositingprefs.h @@ -40,6 +40,16 @@ public: static bool compositingPossible(); static QString compositingNotPossibleReason(); static bool openGlIsBroken(); + /** + * Tests whether GLX is supported and returns @c true + * in case KWin is compiled with OpenGL support and GLX + * is available. + * + * If KWin is compiled with OpenGL ES or without OpenGL at + * all, @c false is returned. + * @returns @c true if GLX is available, @c false otherwise and if not build with OpenGL support. + **/ + static bool hasGlx(); bool recommendCompositing() const; bool enableVSync() const { return mEnableVSync; diff --git a/libkwineffects/kwinglobals.cpp b/libkwineffects/kwinglobals.cpp index d126a7cc9a..4b719c34cb 100644 --- a/libkwineffects/kwinglobals.cpp +++ b/libkwineffects/kwinglobals.cpp @@ -49,9 +49,6 @@ along with this program. If not, see . #ifdef HAVE_XCOMPOSITE #include #endif -#ifdef HAVE_OPENGL -#include -#endif #ifdef HAVE_XSYNC #include #endif @@ -68,7 +65,6 @@ int Extensions::damage_event_base = 0; int Extensions::composite_version = 0; int Extensions::fixes_version = 0; int Extensions::render_version = 0; -bool Extensions::has_glx = false; bool Extensions::has_sync = false; int Extensions::sync_event_base = 0; bool Extensions::non_native_pixmaps = false; @@ -145,14 +141,6 @@ void Extensions::init() render_version = major * 0x10 + minor; addData("RENDER"); } -#endif - has_glx = false; -#ifdef HAVE_OPENGL -#ifndef KWIN_HAVE_OPENGLES - has_glx = glXQueryExtension(display(), &event_base, &error_base); - if (has_glx) - addData("GLX"); -#endif #endif #ifdef HAVE_XSYNC if (XSyncQueryExtension(display(), &sync_event_base, &error_base)) { diff --git a/libkwineffects/kwinglobals.h b/libkwineffects/kwinglobals.h index 2a4ea7196d..f34bdba5c5 100644 --- a/libkwineffects/kwinglobals.h +++ b/libkwineffects/kwinglobals.h @@ -165,9 +165,6 @@ public: return fixes_version > 0; } static bool fixesRegionAvailable(); - static bool glxAvailable() { - return has_glx; - } static bool syncAvailable() { return has_sync; } @@ -187,7 +184,6 @@ private: static int composite_version; static int render_version; static int fixes_version; - static bool has_glx; static bool has_sync; static int sync_event_base; static const char* data_extensions[ 32 ]; diff --git a/scene_opengl_glx.cpp b/scene_opengl_glx.cpp index f9358267e2..5eeb5c7406 100644 --- a/scene_opengl_glx.cpp +++ b/scene_opengl_glx.cpp @@ -39,10 +39,6 @@ SceneOpenGL::SceneOpenGL(Workspace* ws) : Scene(ws) , init_ok(false) { - if (!Extensions::glxAvailable()) { - kDebug(1212) << "No glx extensions available"; - return; // error - } initGLX(); // check for FBConfig support if (!hasGLExtension("GLX_SGIX_fbconfig") || !glXGetFBConfigAttrib || !glXGetFBConfigs ||