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