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:
parent
8ed53babb9
commit
07edbd23ed
@ -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
|
||||||
*/
|
*/
|
||||||
|
@ -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;
|
||||||
|
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user