diff options
author | Gunnar Sletta <gunnar.sletta@digia.com> | 2013-12-03 14:55:40 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-12-03 17:01:49 +0100 |
commit | b7763c4cfab8df6ae9445f791442c14f1ae739ba (patch) | |
tree | b35d47dd0b5529f141421ff9bb11b1491103b0b0 | |
parent | 3b7a8d9d5e214a88f5855800e7bf54da4425d7b9 (diff) |
Release GL resources of ShaderEffectSource while we still have GL.
When a Window element is used, the QML window item is deleted before
the ShaderEffectSource component and the deleteLater to delete the
texture gets handled too late. We now register for the
sceneGraphInvalidated signal and release resources synchronously
while shutting down.
Task-number: QTBUG-35294
Change-Id: Id83b669ddc16723551e5612264ccbad6d3a9bbcb
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Reviewed-by: J-P Nurmi <jpnurmi@digia.com>
-rw-r--r-- | src/quick/items/qquickshadereffectsource.cpp | 15 | ||||
-rw-r--r-- | src/quick/items/qquickshadereffectsource_p.h | 1 |
2 files changed, 13 insertions, 3 deletions
diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp index e076a342df..98203c51e5 100644 --- a/src/quick/items/qquickshadereffectsource.cpp +++ b/src/quick/items/qquickshadereffectsource.cpp @@ -158,16 +158,24 @@ QQuickShaderEffectTexture::QQuickShaderEffectTexture(QQuickItem *shaderSource) QQuickShaderEffectTexture::~QQuickShaderEffectTexture() { - if (m_renderer) - disconnect(m_renderer, SIGNAL(sceneGraphChanged()), this, SLOT(markDirtyTexture())); + invalidated(); +} + +void QQuickShaderEffectTexture::invalidated() +{ delete m_renderer; + m_renderer = 0; delete m_fbo; delete m_secondaryFbo; + m_fbo = m_secondaryFbo = 0; #ifdef QSG_DEBUG_FBO_OVERLAY delete m_debugOverlay; + m_debugOverlay = 0; #endif - if (m_transparentTexture) + if (m_transparentTexture) { glDeleteTextures(1, &m_transparentTexture); + m_transparentTexture = 0; + } } int QQuickShaderEffectTexture::textureId() const @@ -609,6 +617,7 @@ void QQuickShaderEffectSource::ensureTexture() "Cannot be used outside the rendering thread"); m_texture = new QQuickShaderEffectTexture(this); + connect(QQuickItemPrivate::get(this)->window, SIGNAL(sceneGraphInvalidated()), m_texture, SLOT(invalidated()), Qt::DirectConnection); connect(m_texture, SIGNAL(updateRequested()), this, SLOT(update())); connect(m_texture, SIGNAL(scheduledUpdateCompleted()), this, SIGNAL(scheduledUpdateCompleted())); } diff --git a/src/quick/items/qquickshadereffectsource_p.h b/src/quick/items/qquickshadereffectsource_p.h index 6218775700..efa963fe64 100644 --- a/src/quick/items/qquickshadereffectsource_p.h +++ b/src/quick/items/qquickshadereffectsource_p.h @@ -124,6 +124,7 @@ Q_SIGNALS: public Q_SLOTS: void markDirtyTexture(); + void invalidated(); private: void grab(); |