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 <gunnar.sletta@nokia.com>
This commit is contained in:
Samuel Rødal 2012-01-04 14:17:45 +01:00 committed by Qt by Nokia
parent 8ed53babb9
commit 07edbd23ed
3 changed files with 38 additions and 0 deletions

View File

@ -174,6 +174,8 @@ bool QOpenGLContext::create()
void QOpenGLContext::destroy() void QOpenGLContext::destroy()
{ {
Q_D(QOpenGLContext); Q_D(QOpenGLContext);
if (d->platformGLContext)
emit aboutToBeDestroyed();
if (QOpenGLContext::currentContext() == this) if (QOpenGLContext::currentContext() == this)
doneCurrent(); doneCurrent();
if (d->shareGroup) if (d->shareGroup)
@ -185,6 +187,17 @@ void QOpenGLContext::destroy()
d->functions = 0; 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 If this is the current context for the thread, doneCurrent is called
*/ */

View File

@ -118,6 +118,9 @@ public:
QOpenGLFunctions *functions() const; QOpenGLFunctions *functions() const;
Q_SIGNALS:
void aboutToBeDestroyed();
private: private:
friend class QGLContext; friend class QGLContext;
friend class QOpenGLContextResourceBase; friend class QOpenGLContextResourceBase;

View File

@ -50,6 +50,8 @@
#include <QtTest/QtTest> #include <QtTest/QtTest>
#include <QSignalSpy>
class tst_QOpenGL : public QObject class tst_QOpenGL : public QObject
{ {
Q_OBJECT Q_OBJECT
@ -62,6 +64,7 @@ private slots:
void fboRendering(); void fboRendering();
void fboHandleNulledAfterContextDestroyed(); void fboHandleNulledAfterContextDestroyed();
void openGLPaintDevice(); void openGLPaintDevice();
void aboutToBeDestroyed();
}; };
struct SharedResourceTracker struct SharedResourceTracker
@ -500,5 +503,24 @@ void tst_QOpenGL::openGLPaintDevice()
QCOMPARE(image, fbo.toImage().convertToFormat(QImage::Format_RGB32)); 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) QTEST_MAIN(tst_QOpenGL)
#include "tst_qopengl.moc" #include "tst_qopengl.moc"