diff options
author | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2011-05-09 12:58:40 +0200 |
---|---|---|
committer | Kim Motoyoshi Kalland <kim.kalland@nokia.com> | 2011-05-09 13:08:43 +0200 |
commit | c962253085265e2a9f1cfb42919cf44d04b2c45f (patch) | |
tree | 24319eb8b78f271c8d7a86c15009d3060eeec296 /src | |
parent | 02582f6c80f59aaf0e6a0f3922ae5e2565df429d (diff) |
Fixed issues with ShaderEffectSource and threaded rendering.
Diffstat (limited to 'src')
7 files changed, 47 insertions, 18 deletions
diff --git a/src/declarative/items/qsgshadereffectsource.cpp b/src/declarative/items/qsgshadereffectsource.cpp index a39398f74a..11d7f6f97e 100644 --- a/src/declarative/items/qsgshadereffectsource.cpp +++ b/src/declarative/items/qsgshadereffectsource.cpp @@ -54,6 +54,17 @@ QT_BEGIN_NAMESPACE DEFINE_BOOL_CONFIG_OPTION(qmlFboOverlay, QML_FBO_OVERLAY) +QSGShaderEffectSourceNode::QSGShaderEffectSourceNode() +{ + setFlag(UsePreprocess, true); +} + +void QSGShaderEffectSourceNode::markDirtyTexture() +{ + markDirty(DirtyMaterial); +} + + QSGShaderEffectTexture::QSGShaderEffectTexture(QSGItem *shaderSource) : QSGDynamicTexture() , m_item(0) @@ -260,9 +271,8 @@ void QSGShaderEffectTexture::grab() } // Render texture. - QSGNode::DirtyFlags dirty = root->dirtyFlags(); - root->markDirty(QSGNode::DirtyNodeAdded); // Force matrix and clip update. - m_renderer->nodeChanged(root, QSGNode::DirtyNodeAdded); // Force render list update. + root->markDirty(QSGNode::DirtyForceUpdate); // Force matrix, clip and opacity update. + m_renderer->nodeChanged(root, QSGNode::DirtyForceUpdate); // Force render list update. #ifdef QSG_DEBUG_FBO_OVERLAY if (qmlFboOverlay()) { @@ -329,7 +339,7 @@ void QSGShaderEffectTexture::grab() ctx->functions()->glGenerateMipmap(GL_TEXTURE_2D); } - root->markDirty(dirty | QSGNode::DirtyNodeAdded); // Force matrix, clip and render list update. + root->markDirty(QSGNode::DirtyForceUpdate); // Force matrix, clip, opacity and render list update. #ifdef QSG_DEBUG_FBO_OVERLAY if (qmlFboOverlay()) @@ -488,7 +498,6 @@ void QSGShaderEffectSource::setMipmap(bool enabled) { if (enabled == m_mipmap) return; - printf("setting mipmap to: %d\n", enabled); m_mipmap = enabled; update(); emit mipmapChanged(); @@ -560,13 +569,17 @@ QSGNode *QSGShaderEffectSource::updatePaintNode(QSGNode *oldNode, UpdatePaintNod return 0; } - QSGImageNode *node = static_cast<QSGImageNode *>(oldNode); + QSGShaderEffectSourceNode *node = static_cast<QSGShaderEffectSourceNode *>(oldNode); if (!node) { - node = QSGItemPrivate::get(this)->sceneGraphContext()->createImageNode(); - node->setFlag(QSGNode::UsePreprocess, true); + node = new QSGShaderEffectSourceNode; node->setTexture(m_texture); + connect(m_texture, SIGNAL(textureChanged()), node, SLOT(markDirtyTexture()), Qt::DirectConnection); } + // If live and recursive, update continuously. + if (m_live && m_recursive) + node->markDirty(QSGNode::DirtyMaterial); + QSGShaderEffectTexture *tex = qobject_cast<QSGShaderEffectTexture *>(m_texture); tex->setItem(QSGItemPrivate::get(m_sourceItem)->itemNode()); diff --git a/src/declarative/items/qsgshadereffectsource_p.h b/src/declarative/items/qsgshadereffectsource_p.h index e7e3ad62ef..891cc1ebba 100644 --- a/src/declarative/items/qsgshadereffectsource_p.h +++ b/src/declarative/items/qsgshadereffectsource_p.h @@ -46,6 +46,7 @@ #include <private/qsgtextureprovider_p.h> #include <private/qsgadaptationlayer_p.h> #include <private/qsgcontext_p.h> +#include <private/qsgdefaultimagenode_p.h> #include "qpointer.h" #include "qsize.h" @@ -63,6 +64,17 @@ class QSGNode; class UpdatePaintNodeData; class QGLFramebufferObject; +class QSGShaderEffectSourceNode : public QObject, public QSGDefaultImageNode +{ + Q_OBJECT + +public: + QSGShaderEffectSourceNode(); + +private Q_SLOTS: + void markDirtyTexture(); +}; + class QSGShaderEffectTexture : public QSGDynamicTexture { Q_OBJECT diff --git a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp index 4569e7fc32..badaa2c261 100644 --- a/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp +++ b/src/declarative/scenegraph/coreapi/qsgdefaultrenderer.cpp @@ -177,7 +177,9 @@ void QMLRenderer::nodeChanged(QSGNode *node, QSGNode::DirtyFlags flags) { QSGRenderer::nodeChanged(node, flags); - quint32 rebuildFlags = QSGNode::DirtyNodeAdded | QSGNode::DirtyNodeRemoved | QSGNode::DirtyMaterial | QSGNode::DirtyOpacity; + quint32 rebuildFlags = QSGNode::DirtyNodeAdded | QSGNode::DirtyNodeRemoved + | QSGNode::DirtyMaterial | QSGNode::DirtyOpacity + | QSGNode::DirtyForceUpdate; if (flags & rebuildFlags) m_rebuild_lists = true; diff --git a/src/declarative/scenegraph/coreapi/qsgnode.h b/src/declarative/scenegraph/coreapi/qsgnode.h index b00ef4ed1c..a905696218 100644 --- a/src/declarative/scenegraph/coreapi/qsgnode.h +++ b/src/declarative/scenegraph/coreapi/qsgnode.h @@ -83,14 +83,16 @@ public: DirtyNodeRemoved = 0x0008, DirtyGeometry = 0x0010, DirtyRenderOrder = 0x0020, - DirtyMaterial = 0x0100, - DirtyOpacity = 0x0200, + DirtyMaterial = 0x0040, + DirtyOpacity = 0x0080, + DirtyForceUpdate = 0x0100, DirtyAll = 0xffff, DirtyPropagationMask = DirtyMatrix | DirtyClipList | DirtyNodeAdded - | DirtyOpacity, + | DirtyOpacity + | DirtyForceUpdate, }; Q_DECLARE_FLAGS(DirtyFlags, DirtyFlag) diff --git a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp index d81248be3d..6eff011e85 100644 --- a/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp +++ b/src/declarative/scenegraph/coreapi/qsgnodeupdater.cpp @@ -227,7 +227,7 @@ void QSGNodeUpdater::visitNode(QSGNode *n) #endif if (n->dirtyFlags() || m_force_update) { - bool forceUpdate = n->dirtyFlags() & (QSGNode::DirtyNodeAdded); + bool forceUpdate = n->dirtyFlags() & (QSGNode::DirtyNodeAdded | QSGNode::DirtyForceUpdate); if (forceUpdate) ++m_force_update; diff --git a/src/declarative/scenegraph/coreapi/qsgrenderer.cpp b/src/declarative/scenegraph/coreapi/qsgrenderer.cpp index 04c0817f8f..e267e3d8b8 100644 --- a/src/declarative/scenegraph/coreapi/qsgrenderer.cpp +++ b/src/declarative/scenegraph/coreapi/qsgrenderer.cpp @@ -126,10 +126,10 @@ QSGRenderer::QSGRenderer(QSGContext *context) , m_context(context) , m_root_node(0) , m_node_updater(0) + , m_bindable(0) , m_changed_emitted(false) , m_mirrored(false) , m_is_rendering(false) - , m_bindable(0) { initializeGLFunctions(); } diff --git a/src/declarative/scenegraph/coreapi/qsgrenderer_p.h b/src/declarative/scenegraph/coreapi/qsgrenderer_p.h index fcf966d819..272df8082c 100644 --- a/src/declarative/scenegraph/coreapi/qsgrenderer_p.h +++ b/src/declarative/scenegraph/coreapi/qsgrenderer_p.h @@ -174,11 +174,11 @@ private: QGLShaderProgram m_clip_program; int m_clip_matrix_id; - bool m_changed_emitted; - bool m_mirrored; - bool m_is_rendering; - const Bindable *m_bindable; + + bool m_changed_emitted : 1; + bool m_mirrored : 1; + bool m_is_rendering : 1; }; Q_DECLARE_OPERATORS_FOR_FLAGS(QSGRenderer::ClearMode) |