From d9c531781e6c95f80681b3c82700833e1de88794 Mon Sep 17 00:00:00 2001
From: Simon Hausmann <simon.hausmann@digia.com>
Date: Fri, 8 Aug 2014 16:33:58 +0200
Subject: [PATCH] Cleanup: Remove ShaderEffectSourceNode

We can simply use a standard image node and do the dirty marking also
directly in the texture (both live in the same thread).

Change-Id: I7345c702613782adec3c6a36a7705a2a54ed82ec
Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
---
 src/quick/items/qquickshadereffectsource.cpp | 46 ++++++++++++--------
 src/quick/items/qquickshadereffectsource_p.h | 18 +++-----
 2 files changed, 34 insertions(+), 30 deletions(-)

diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp
index b727c1107c..2b42a01fc1 100644
--- a/src/quick/items/qquickshadereffectsource.cpp
+++ b/src/quick/items/qquickshadereffectsource.cpp
@@ -122,21 +122,10 @@ public:
 };
 #include "qquickshadereffectsource.moc"
 
-
-QQuickShaderEffectSourceNode::QQuickShaderEffectSourceNode()
-{
-    setFlag(UsePreprocess, true);
-}
-
-void QQuickShaderEffectSourceNode::markDirtyTexture()
-{
-    markDirty(DirtyMaterial);
-}
-
-
 QQuickShaderEffectTexture::QQuickShaderEffectTexture(QQuickItem *shaderSource)
     : QSGDynamicTexture()
     , m_item(0)
+    , m_shaderSourceNode(0)
     , m_device_pixel_ratio(1)
     , m_format(GL_RGBA)
     , m_renderer(0)
@@ -179,6 +168,16 @@ void QQuickShaderEffectTexture::invalidated()
     }
 }
 
+void QQuickShaderEffectTexture::markDirtyTextureLater()
+{
+    QCoreApplication::postEvent(this, new QEvent(QEvent::User));
+}
+
+void QQuickShaderEffectTexture::customEvent(QEvent *)
+{
+    markDirtyTexture();
+}
+
 int QQuickShaderEffectTexture::textureId() const
 {
     return m_fbo ? m_fbo->texture() : 0;
@@ -307,8 +306,11 @@ void QQuickShaderEffectTexture::scheduleUpdate()
     if (m_grab)
         return;
     m_grab = true;
-    if (m_dirtyTexture)
+    if (m_dirtyTexture) {
         emit updateRequested();
+        if (m_shaderSourceNode)
+            m_shaderSourceNode->markDirty(QSGNode::DirtyMaterial);
+    }
 }
 
 void QQuickShaderEffectTexture::setRecursive(bool recursive)
@@ -319,8 +321,11 @@ void QQuickShaderEffectTexture::setRecursive(bool recursive)
 void QQuickShaderEffectTexture::markDirtyTexture()
 {
     m_dirtyTexture = true;
-    if (m_live || m_grab)
+    if (m_live || m_grab) {
         emit updateRequested();
+        if (m_shaderSourceNode)
+            m_shaderSourceNode->markDirty(QSGNode::DirtyMaterial);
+    }
 }
 
 void QQuickShaderEffectTexture::grab()
@@ -341,7 +346,7 @@ void QQuickShaderEffectTexture::grab()
 
     if (!m_renderer) {
         m_renderer = m_context->createRenderer();
-        connect(m_renderer, SIGNAL(sceneGraphChanged()), this, SLOT(markDirtyTexture()));
+        connect(m_renderer, SIGNAL(sceneGraphChanged()), this, SLOT(markDirtyTextureLater()));
     }
     m_renderer->setDevicePixelRatio(m_device_pixel_ratio);
     m_renderer->setRootNode(static_cast<QSGRootNode *>(root));
@@ -999,8 +1004,10 @@ void QQuickShaderEffectSource::releaseResources()
 QSGNode *QQuickShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
 {
     if (!m_sourceItem || m_sourceItem->width() <= 0 || m_sourceItem->height() <= 0) {
-        if (m_texture)
+        if (m_texture) {
             m_texture->setItem(0);
+            m_texture->setShaderSourceNode(0);
+        }
         delete oldNode;
         return 0;
     }
@@ -1061,11 +1068,12 @@ QSGNode *QQuickShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaint
         return 0;
     }
 
-    QQuickShaderEffectSourceNode *node = static_cast<QQuickShaderEffectSourceNode *>(oldNode);
+    QSGImageNode *node = static_cast<QSGImageNode *>(oldNode);
     if (!node) {
-        node = new QQuickShaderEffectSourceNode;
+        node = d->sceneGraphContext()->createImageNode();
+        node->setFlag(QSGNode::UsePreprocess);
         node->setTexture(m_texture);
-        connect(m_texture, SIGNAL(updateRequested()), node, SLOT(markDirtyTexture()));
+        m_texture->setShaderSourceNode(node);
     }
 
     // If live and recursive, update continuously.
diff --git a/src/quick/items/qquickshadereffectsource_p.h b/src/quick/items/qquickshadereffectsource_p.h
index 13b81cede5..4caeaab52c 100644
--- a/src/quick/items/qquickshadereffectsource_p.h
+++ b/src/quick/items/qquickshadereffectsource_p.h
@@ -64,17 +64,6 @@ class QSGSimpleRectNode;
 
 class QQuickShaderEffectSourceTextureProvider;
 
-class QQuickShaderEffectSourceNode : public QObject, public QSGDefaultImageNode
-{
-    Q_OBJECT
-
-public:
-    QQuickShaderEffectSourceNode();
-
-private Q_SLOTS:
-    void markDirtyTexture();
-};
-
 class Q_QUICK_PRIVATE_EXPORT QQuickShaderEffectTexture : public QSGDynamicTexture
 {
     Q_OBJECT
@@ -88,6 +77,8 @@ public:
     QSGNode *item() const { return m_item; }
     void setItem(QSGNode *item);
 
+    void setShaderSourceNode(QSGNode *node) { m_shaderSourceNode = node; }
+
     QRectF rect() const { return m_rect; }
     void setRect(const QRectF &rect);
 
@@ -125,11 +116,16 @@ Q_SIGNALS:
 public Q_SLOTS:
     void markDirtyTexture();
     void invalidated();
+    void markDirtyTextureLater();
+
+protected:
+    virtual void customEvent(QEvent *);
 
 private:
     void grab();
 
     QSGNode *m_item;
+    QSGNode *m_shaderSourceNode;
     QRectF m_rect;
     QSize m_size;
     qreal m_device_pixel_ratio;
-- 
GitLab