diff options
author | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-07-31 11:40:03 +0200 |
---|---|---|
committer | Gunnar Sletta <gunnar.sletta@jollamobile.com> | 2014-08-04 14:30:12 +0200 |
commit | ec559c38c349c38785bdcc265d7e0f852249cfb4 (patch) | |
tree | a394958f1851991066d4a94fc782874f8dada74f /src/quick/items/qquickshadereffectsource.cpp | |
parent | 6a3d776671bc618fcc184779a8cc8e2d08e08278 (diff) |
Clean up Image and ShaderEffectSource properly.
Change-Id: I9e3eb5f65ea5f46d30fb7905d0f9c479da367bf5
Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
Diffstat (limited to 'src/quick/items/qquickshadereffectsource.cpp')
-rw-r--r-- | src/quick/items/qquickshadereffectsource.cpp | 49 |
1 files changed, 39 insertions, 10 deletions
diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp index 7603495e1b..b727c1107c 100644 --- a/src/quick/items/qquickshadereffectsource.cpp +++ b/src/quick/items/qquickshadereffectsource.cpp @@ -50,6 +50,7 @@ #include "qopenglframebufferobject.h" #include "qmath.h" #include <QtQuick/private/qsgtexture_p.h> +#include <QtCore/QRunnable> QT_BEGIN_NAMESPACE @@ -485,6 +486,21 @@ QImage QQuickShaderEffectTexture::toImage() const return QImage(); } +class QQuickShaderEffectSourceCleanup : public QRunnable +{ +public: + QQuickShaderEffectSourceCleanup(QQuickShaderEffectTexture *t, QQuickShaderEffectSourceTextureProvider *p) + : texture(t) + , provider(p) + {} + void run() Q_DECL_OVERRIDE { + delete texture; + delete provider; + } + QQuickShaderEffectTexture *texture; + QQuickShaderEffectSourceTextureProvider *provider; +}; + /*! \qmltype ShaderEffectSource \instantiates QQuickShaderEffectSource @@ -586,15 +602,20 @@ QQuickShaderEffectSource::QQuickShaderEffectSource(QQuickItem *parent) , m_grab(true) { setFlag(ItemHasContents); + connect(this, SIGNAL(sceneGraphInvalidated()), this, SLOT(invalidateSG())); } QQuickShaderEffectSource::~QQuickShaderEffectSource() { - if (m_texture) - m_texture->deleteLater(); - - if (m_provider) - m_provider->deleteLater(); + if (window()) { + window()->scheduleRenderJob(new QQuickShaderEffectSourceCleanup(m_texture, m_provider), + QQuickWindow::AfterSynchronizingStage); + } else { + // If we don't have a window, these should already have been + // released in invalidateSG or in releaseResrouces() + Q_ASSERT(!m_texture); + Q_ASSERT(!m_provider); + } if (m_sourceItem) { QQuickItemPrivate *sd = QQuickItemPrivate::get(m_sourceItem); @@ -967,12 +988,10 @@ static void get_wrap_mode(QQuickShaderEffectSource::WrapMode mode, QSGTexture::W void QQuickShaderEffectSource::releaseResources() { - if (m_texture) { - m_texture->deleteLater(); + if (m_texture || m_provider) { + window()->scheduleRenderJob(new QQuickShaderEffectSourceCleanup(m_texture, m_provider), + QQuickWindow::AfterSynchronizingStage); m_texture = 0; - } - if (m_provider) { - m_provider->deleteLater(); m_provider = 0; } } @@ -1064,6 +1083,16 @@ QSGNode *QQuickShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaint return node; } +void QQuickShaderEffectSource::invalidateSG() +{ + if (m_texture) + delete m_texture; + if (m_provider) + delete m_provider; + m_texture = 0; + m_provider = 0; +} + void QQuickShaderEffectSource::itemChange(ItemChange change, const ItemChangeData &value) { if (change == QQuickItem::ItemSceneChange && m_sourceItem) { |