Emit signal when texture is updated in ShaderEffectSource.
authorKim Motoyoshi Kalland <kim.kalland@nokia.com>
Wed, 2 Nov 2011 13:07:40 +0000 (14:07 +0100)
committerQt by Nokia <qt-info@nokia.com>
Mon, 7 Nov 2011 12:49:00 +0000 (13:49 +0100)
Added a signal scheduledUpdateCompleted() which is emitted after
the texture content has been updated as a result of a call to
scheduleUpdate(). Also renamed the textureChanged() signal to
updateRequested(), which I think is a more accurate name.

Task-number: QTBUG-22174
Change-Id: If4d29e3be3a953494562d1ff55045f2154491d97
Reviewed-by: Yoann Lopes <yoann.lopes@nokia.com>

src/declarative/items/qquickshadereffectsource.cpp
src/declarative/items/qquickshadereffectsource_p.h

index 587f7ba..351ea34 100644 (file)
@@ -216,7 +216,7 @@ void QQuickShaderEffectTexture::scheduleUpdate()
         return;
     m_grab = true;
     if (m_dirtyTexture)
-        emit textureChanged();
+        emit updateRequested();
 }
 
 void QQuickShaderEffectTexture::setRecursive(bool recursive)
@@ -228,7 +228,7 @@ void QQuickShaderEffectTexture::markDirtyTexture()
 {
     m_dirtyTexture = true;
     if (m_live || m_grab)
-        emit textureChanged();
+        emit updateRequested();
 }
 
 void QQuickShaderEffectTexture::grab()
@@ -238,6 +238,8 @@ void QQuickShaderEffectTexture::grab()
         delete m_secondaryFbo;
         m_fbo = m_secondaryFbo = 0;
         m_dirtyTexture = false;
+        if (m_grab)
+            emit scheduledUpdateCompleted();
         return;
     }
     QSGNode *root = m_item;
@@ -246,16 +248,9 @@ void QQuickShaderEffectTexture::grab()
     if (root->type() != QSGNode::RootNodeType)
         return;
 
-    if (m_size.isEmpty()) {
-        delete m_fbo;
-        delete m_secondaryFbo;
-        m_secondaryFbo = m_fbo = 0;
-        return;
-    }
-
     if (!m_renderer) {
         m_renderer = m_context->createRenderer();
-        connect(m_renderer, SIGNAL(sceneGraphChanged()), this, SLOT(markDirtyTexture()), Qt::DirectConnection);
+        connect(m_renderer, SIGNAL(sceneGraphChanged()), this, SLOT(markDirtyTexture()));
     }
     m_renderer->setRootNode(static_cast<QSGRootNode *>(root));
 
@@ -388,6 +383,9 @@ void QQuickShaderEffectTexture::grab()
 #endif
     if (m_recursive)
         markDirtyTexture(); // Continuously update if 'live' and 'recursive'.
+
+    if (m_grab)
+        emit scheduledUpdateCompleted();
 }
 
 QImage QQuickShaderEffectTexture::toImage() const
@@ -516,7 +514,8 @@ void QQuickShaderEffectSource::ensureTexture()
                "Cannot be used outside the rendering thread");
 
     m_texture = new QQuickShaderEffectTexture(this);
-    connect(m_texture, SIGNAL(textureChanged()), this, SLOT(update()));
+    connect(m_texture, SIGNAL(updateRequested()), this, SLOT(update()));
+    connect(m_texture, SIGNAL(scheduledUpdateCompleted()), this, SIGNAL(scheduledUpdateCompleted()));
 }
 
 QSGTextureProvider *QQuickShaderEffectSource::textureProvider() const
@@ -529,9 +528,8 @@ QSGTextureProvider *QQuickShaderEffectSource::textureProvider() const
                    "QQuickShaderEffectSource::textureProvider",
                    "Cannot be used outside the rendering thread");
         const_cast<QQuickShaderEffectSource *>(this)->m_provider = new QQuickShaderEffectSourceTextureProvider();
-
         const_cast<QQuickShaderEffectSource *>(this)->ensureTexture();
-        connect(m_texture, SIGNAL(textureChanged()), m_provider, SIGNAL(textureChanged()), Qt::DirectConnection);
+        connect(m_texture, SIGNAL(updateRequested()), m_provider, SIGNAL(textureChanged()));
         m_provider->sourceTexture = m_texture;
     }
     return m_provider;
@@ -884,7 +882,7 @@ QSGNode *QQuickShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaint
     if (!node) {
         node = new QQuickShaderEffectSourceNode;
         node->setTexture(m_texture);
-        connect(m_texture, SIGNAL(textureChanged()), node, SLOT(markDirtyTexture()), Qt::DirectConnection);
+        connect(m_texture, SIGNAL(updateRequested()), node, SLOT(markDirtyTexture()));
     }
 
     // If live and recursive, update continuously.
index 8117c06..b61170a 100644 (file)
@@ -119,7 +119,8 @@ public:
     QImage toImage() const;
 
 Q_SIGNALS:
-    void textureChanged();
+    void updateRequested();
+    void scheduledUpdateCompleted();
 
 public Q_SLOTS:
     void markDirtyTexture();
@@ -226,7 +227,7 @@ Q_SIGNALS:
     void mipmapChanged();
     void recursiveChanged();
 
-    void textureChanged();
+    void scheduledUpdateCompleted();
 
 protected:
     virtual QSGNode *updatePaintNode(QSGNode *, UpdatePaintNodeData *);