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()
|
||||
{
|
||||
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
|
||||
*/
|
||||
|
@ -118,6 +118,9 @@ public:
|
||||
|
||||
QOpenGLFunctions *functions() const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void aboutToBeDestroyed();
|
||||
|
||||
private:
|
||||
friend class QGLContext;
|
||||
friend class QOpenGLContextResourceBase;
|
||||
|
@ -50,6 +50,8 @@
|
||||
|
||||
#include <QtTest/QtTest>
|
||||
|
||||
#include <QSignalSpy>
|
||||
|
||||
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"
|
||||
|
Loading…
Reference in New Issue
Block a user