Return appropriate currentContext() in platform's makeCurrent().
authorSamuel Rødal <samuel.rodal@digia.com>
Mon, 5 Nov 2012 14:55:49 +0000 (15:55 +0100)
committerThe Qt Project <gerrit-noreply@qt-project.org>
Thu, 8 Nov 2012 21:47:42 +0000 (22:47 +0100)
This way the platform plugin can use convenience classes such as
QOpenGLFramebufferObject in the makeCurrent() implementation.

Change-Id: I1fb5f6b8ec094ff39454adbeca9eb0d1a8f43ee6
Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
src/gui/kernel/qopenglcontext.cpp
src/gui/kernel/qopenglcontext_p.h

index e8aa44d..d2de6aa 100644 (file)
@@ -62,6 +62,10 @@ QT_BEGIN_NAMESPACE
 class QGuiGLThreadContext
 {
 public:
+    QGuiGLThreadContext()
+        : context(0)
+    {
+    }
     ~QGuiGLThreadContext() {
         if (context)
             context->doneCurrent();
@@ -151,18 +155,25 @@ QMutex QOpenGLContextPrivate::makeCurrentTrackerMutex;
     \sa QOpenGLFunctions, QOpenGLBuffer, QOpenGLShaderProgram, QOpenGLFramebufferObject
 */
 
-void QOpenGLContextPrivate::setCurrentContext(QOpenGLContext *context)
+/*!
+    \internal
+
+    Set the current context. Returns the previously current context.
+*/
+QOpenGLContext *QOpenGLContextPrivate::setCurrentContext(QOpenGLContext *context)
 {
     QGuiGLThreadContext *threadContext = qwindow_context_storage.localData();
     if (!threadContext) {
         if (!QThread::currentThread()) {
             qWarning("No QTLS available. currentContext wont work");
-            return;
+            return 0;
         }
         threadContext = new QGuiGLThreadContext;
         qwindow_context_storage.setLocalData(threadContext);
     }
+    QOpenGLContext *previous = threadContext->context;
     threadContext->context = context;
+    return previous;
 }
 
 int QOpenGLContextPrivate::maxTextureSize()
@@ -505,9 +516,9 @@ bool QOpenGLContext::makeCurrent(QSurface *surface)
         return false;
     }
 
+    QOpenGLContext *previous = QOpenGLContextPrivate::setCurrentContext(this);
 
     if (d->platformGLContext->makeCurrent(surface->surfaceHandle())) {
-        QOpenGLContextPrivate::setCurrentContext(this);
         d->surface = surface;
 
         d->shareGroup->d_func()->deletePendingResources(this);
@@ -519,6 +530,8 @@ bool QOpenGLContext::makeCurrent(QSurface *surface)
         return true;
     }
 
+    QOpenGLContextPrivate::setCurrentContext(previous);
+
     return false;
 }
 
index 704ff09..efce991 100644 (file)
@@ -224,7 +224,7 @@ public:
 
     QPaintEngineEx *active_engine;
 
-    static void setCurrentContext(QOpenGLContext *context);
+    static QOpenGLContext *setCurrentContext(QOpenGLContext *context);
 
     int maxTextureSize();