diff --git a/src/quick/items/qquickshadereffectsource.cpp b/src/quick/items/qquickshadereffectsource.cpp index b727c1107c6c09cfc81a67295612da9c191baafb..2b42a01fc152b1e12180fd44048d39c25f4c7bb7 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 13b81cede585076693814a1f2082faa43b1dcbef..4caeaab52c8ad2ffd437969b7770be8f09c19dfe 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;