From 07edbd23ed774c4f0331bb92d35add77fe91769c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20R=C3=B8dal?= Date: Wed, 4 Jan 2012 14:17:45 +0100 Subject: [PATCH] Introduced QOpenGLContext::aboutToBeDestroyed() signal. This signal can be used to clean up OpenGL resources in a safe way before the context is destroyed. Task-number: QTBUG-20083 Change-Id: I45a4be01b06af4ee7196fa502116f099d50afeab Reviewed-by: Gunnar Sletta --- src/gui/kernel/qopenglcontext.cpp | 13 +++++++++++++ src/gui/kernel/qopenglcontext.h | 3 +++ tests/auto/gui/qopengl/tst_qopengl.cpp | 22 ++++++++++++++++++++++ 3 files changed, 38 insertions(+) diff --git a/src/gui/kernel/qopenglcontext.cpp b/src/gui/kernel/qopenglcontext.cpp index 6a9cb43028..29a9e92e5c 100644 --- a/src/gui/kernel/qopenglcontext.cpp +++ b/src/gui/kernel/qopenglcontext.cpp @@ -174,6 +174,8 @@ bool QOpenGLContext::create() void QOpenGLContext::destroy() { Q_D(QOpenGLContext); + if (d->platformGLContext) + emit aboutToBeDestroyed(); if (QOpenGLContext::currentContext() == this) doneCurrent(); if (d->shareGroup) @@ -185,6 +187,17 @@ void QOpenGLContext::destroy() d->functions = 0; } +/*! + \fn void QOpenGLContext::aboutToBeDestroyed() + + This signal is emitted before the underlying native OpenGL context is + destroyed, such that users may clean up OpenGL resources that might otherwise + be left dangling in the case of shared OpenGL contexts. + + If you wish to make the context current in order to do clean-up, make sure to + only connect to the signal using a direct connection. +*/ + /*! If this is the current context for the thread, doneCurrent is called */ diff --git a/src/gui/kernel/qopenglcontext.h b/src/gui/kernel/qopenglcontext.h index b5a19a0ebc..0d02cfe613 100644 --- a/src/gui/kernel/qopenglcontext.h +++ b/src/gui/kernel/qopenglcontext.h @@ -118,6 +118,9 @@ public: QOpenGLFunctions *functions() const; +Q_SIGNALS: + void aboutToBeDestroyed(); + private: friend class QGLContext; friend class QOpenGLContextResourceBase; diff --git a/tests/auto/gui/qopengl/tst_qopengl.cpp b/tests/auto/gui/qopengl/tst_qopengl.cpp index aa3e70a047..d6c587b65e 100644 --- a/tests/auto/gui/qopengl/tst_qopengl.cpp +++ b/tests/auto/gui/qopengl/tst_qopengl.cpp @@ -50,6 +50,8 @@ #include +#include + class tst_QOpenGL : public QObject { Q_OBJECT @@ -62,6 +64,7 @@ private slots: void fboRendering(); void fboHandleNulledAfterContextDestroyed(); void openGLPaintDevice(); + void aboutToBeDestroyed(); }; struct SharedResourceTracker @@ -500,5 +503,24 @@ void tst_QOpenGL::openGLPaintDevice() QCOMPARE(image, fbo.toImage().convertToFormat(QImage::Format_RGB32)); } +void tst_QOpenGL::aboutToBeDestroyed() +{ + QWindow window; + window.setGeometry(0, 0, 128, 128); + window.create(); + + QOpenGLContext *context = new QOpenGLContext; + QSignalSpy spy(context, SIGNAL(aboutToBeDestroyed())); + + context->create(); + context->makeCurrent(&window); + + QCOMPARE(spy.size(), 0); + + delete context; + + QCOMPARE(spy.size(), 1); +} + QTEST_MAIN(tst_QOpenGL) #include "tst_qopengl.moc"