From aa6d47e9c45bbff074cc43596b2d5d4150aebb8b Mon Sep 17 00:00:00 2001 From: Kim Motoyoshi Kalland Date: Wed, 2 Nov 2011 14:07:40 +0100 Subject: [PATCH] Emit signal when texture is updated in ShaderEffectSource. 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 --- src/declarative/items/qquickshadereffectsource.cpp | 26 +++++++++---------- src/declarative/items/qquickshadereffectsource_p.h | 5 ++- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/declarative/items/qquickshadereffectsource.cpp b/src/declarative/items/qquickshadereffectsource.cpp index 587f7ba..351ea34 100644 --- a/src/declarative/items/qquickshadereffectsource.cpp +++ b/src/declarative/items/qquickshadereffectsource.cpp @@ -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(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(this)->m_provider = new QQuickShaderEffectSourceTextureProvider(); - const_cast(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. diff --git a/src/declarative/items/qquickshadereffectsource_p.h b/src/declarative/items/qquickshadereffectsource_p.h index 8117c06..b61170a 100644 --- a/src/declarative/items/qquickshadereffectsource_p.h +++ b/src/declarative/items/qquickshadereffectsource_p.h @@ -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 *); -- 1.7.2.5