Only use glXCreateContext if glXCreateContextAttribsARB did not succeed.
authorZeno Albisser <zeno@webkit.org>
Fri, 3 Aug 2012 11:37:03 +0000 (13:37 +0200)
committerQt by Nokia <qt-info@nokia.com>
Tue, 7 Aug 2012 14:40:07 +0000 (16:40 +0200)
If glXCreateContextAttribsARB does not succeed or is not available,
we should fallback to using glXCreateContext. But we should not just
create a context with glXCreateContext by default that is being thrown
away if glXCreateContextAttribsARB succeeds.
Otherwise glXMakeCurrent with context 0 might cause an unexpected
context change when dealing with multiple contexts.

Change-Id: I7627abbe2500b4006180653a1b3b074fe7aca1d3
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
src/plugins/platforms/xcb/qglxintegration.cpp

index 3a29988..36ab678 100644 (file)
@@ -88,13 +88,6 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
     GLXFBConfig config = qglx_findConfig(DISPLAY_FROM_XCB(screen),screen->screenNumber(),format);
 
     if (config) {
-        m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, m_shareContext, TRUE);
-        if (!m_context && m_shareContext) {
-            // re-try without a shared glx context
-            m_shareContext = 0;
-            m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, 0, TRUE);
-        }
-
         // Resolve entry point for glXCreateContextAttribsARB
         glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0;
         glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc) glXGetProcAddress((const GLubyte*)"glXCreateContextAttribsARB");
@@ -116,19 +109,23 @@ QGLXContext::QGLXContext(QXcbScreen *screen, const QSurfaceFormat &format, QPlat
 
             contextAttributes << None;
 
-            GLXContext context = 0;
-            context = glXCreateContextAttribsARB(DISPLAY_FROM_XCB(screen), config, m_shareContext, true, contextAttributes.data());
+            m_context = glXCreateContextAttribsARB(DISPLAY_FROM_XCB(screen), config, m_shareContext, true, contextAttributes.data());
             if (!m_context && m_shareContext) {
                 // re-try without a shared glx context
-                m_shareContext = 0;
-                context = glXCreateContextAttribsARB(DISPLAY_FROM_XCB(screen), config, 0, true, contextAttributes.data());
+                m_context = glXCreateContextAttribsARB(DISPLAY_FROM_XCB(screen), config, 0, true, contextAttributes.data());
+                if (m_context)
+                    m_shareContext = 0;
             }
+        }
 
-            // Set this as our context and destroy the old context
-            if (context) {
-                glXMakeCurrent(DISPLAY_FROM_XCB(screen), 0, 0);
-                glXDestroyContext(DISPLAY_FROM_XCB(screen), m_context);
-                m_context = context;
+        // Could not create a context using glXCreateContextAttribsARB, falling back to glXCreateNewContext.
+        if (!m_context) {
+            m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, m_shareContext, TRUE);
+            if (!m_context && m_shareContext) {
+                // re-try without a shared glx context
+                m_context = glXCreateNewContext(DISPLAY_FROM_XCB(screen), config, GLX_RGBA_TYPE, 0, TRUE);
+                if (m_context)
+                    m_shareContext = 0;
             }
         }