aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2014-08-08 16:33:58 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-08-22 21:13:28 +0200
commitd9c531781e6c95f80681b3c82700833e1de88794 (patch)
tree70aa7216b7c3198c88049f94ffbee042981be27e /src
parent595340f1622783e97c53b035b78691572537f00a (diff)
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>
Diffstat (limited to 'src')
-rw-r--r--src/quick/items/qquickshadereffectsource.cpp46
-rw-r--r--src/quick/items/qquickshadereffectsource_p.h18
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;