aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickshadereffectsource.cpp
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@jollamobile.com>2014-07-31 11:40:03 +0200
committerGunnar Sletta <gunnar.sletta@jollamobile.com>2014-08-04 14:30:12 +0200
commitec559c38c349c38785bdcc265d7e0f852249cfb4 (patch)
treea394958f1851991066d4a94fc782874f8dada74f /src/quick/items/qquickshadereffectsource.cpp
parent6a3d776671bc618fcc184779a8cc8e2d08e08278 (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.cpp49
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) {