diff options
author | Liang Qi <liang.qi@theqtcompany.com> | 2015-10-26 13:42:08 +0100 |
---|---|---|
committer | Liang Qi <liang.qi@theqtcompany.com> | 2015-10-26 13:42:08 +0100 |
commit | 3832b1e05b80a0f509be17dd3619a2f8bb70074f (patch) | |
tree | 3763c243b13c8228b1508ce5902dc2f587cabfdd /src/quick/items/qquickshadereffectnode.cpp | |
parent | f9fae251ca07401ee1b0039edc6ea6b7a522b5a7 (diff) | |
parent | 5c53861cced2d40490e4c7bfc202aadc532df4c2 (diff) |
Merge remote-tracking branch 'origin/5.5' into 5.6
Conflicts:
tests/auto/qml/qml.pro
tools/qmlprofiler/qmlprofilerclient.cpp
Change-Id: Id47f15a5ab38f8ec79f0a26c92805acba62caac4
Diffstat (limited to 'src/quick/items/qquickshadereffectnode.cpp')
-rw-r--r-- | src/quick/items/qquickshadereffectnode.cpp | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/src/quick/items/qquickshadereffectnode.cpp b/src/quick/items/qquickshadereffectnode.cpp index b84a4adaab..ed9e29d599 100644 --- a/src/quick/items/qquickshadereffectnode.cpp +++ b/src/quick/items/qquickshadereffectnode.cpp @@ -350,11 +350,22 @@ uint qHash(const QQuickShaderEffectMaterialKey &key) return hash; } - -typedef QHash<QQuickShaderEffectMaterialKey, QWeakPointer<QSGMaterialType> > MaterialHash; - -Q_GLOBAL_STATIC(MaterialHash, materialHash) -Q_GLOBAL_STATIC(QMutex, materialHashMutex) +class QQuickShaderEffectMaterialCache : public QObject +{ + Q_OBJECT +public: + static QQuickShaderEffectMaterialCache *get(bool create = true) { + QOpenGLContext *ctx = QOpenGLContext::currentContext(); + QQuickShaderEffectMaterialCache *me = ctx->findChild<QQuickShaderEffectMaterialCache *>(QStringLiteral("__qt_ShaderEffectCache"), Qt::FindDirectChildrenOnly); + if (!me && create) { + me = new QQuickShaderEffectMaterialCache(); + me->setObjectName(QStringLiteral("__qt_ShaderEffectCache")); + me->setParent(ctx); + } + return me; + } + QHash<QQuickShaderEffectMaterialKey, QSGMaterialType *> cache; +}; QQuickShaderEffectMaterial::QQuickShaderEffectMaterial(QQuickShaderEffectNode *node) : cullMode(NoCulling) @@ -367,7 +378,7 @@ QQuickShaderEffectMaterial::QQuickShaderEffectMaterial(QQuickShaderEffectNode *n QSGMaterialType *QQuickShaderEffectMaterial::type() const { - return m_type.data(); + return m_type; } QSGMaterialShader *QQuickShaderEffectMaterial::createShader() const @@ -425,30 +436,23 @@ int QQuickShaderEffectMaterial::compare(const QSGMaterial *o) const void QQuickShaderEffectMaterial::setProgramSource(const QQuickShaderEffectMaterialKey &source) { - QMutexLocker locker(materialHashMutex); - Q_UNUSED(locker); - m_source = source; m_emittedLogChanged = false; - QWeakPointer<QSGMaterialType> weakPtr = materialHash->value(m_source); - m_type = weakPtr.toStrongRef(); - if (m_type.isNull()) { - m_type = QSharedPointer<QSGMaterialType>(new QSGMaterialType); - materialHash->insert(m_source, m_type.toWeakRef()); + QQuickShaderEffectMaterialCache *cache = QQuickShaderEffectMaterialCache::get(); + m_type = cache->cache.value(m_source); + if (!m_type) { + m_type = new QSGMaterialType(); + cache->cache.insert(source, m_type); } } void QQuickShaderEffectMaterial::cleanupMaterialCache() { - QMutexLocker locker(materialHashMutex); - Q_UNUSED(locker); - - for (MaterialHash::iterator it = materialHash->begin(); it != materialHash->end(); ) { - if (!it.value().toStrongRef()) - it = materialHash->erase(it); - else - ++it; + QQuickShaderEffectMaterialCache *cache = QQuickShaderEffectMaterialCache::get(false); + if (cache) { + qDeleteAll(cache->cache.values()); + delete cache; } } @@ -501,4 +505,6 @@ void QQuickShaderEffectNode::preprocess() static_cast<QQuickShaderEffectMaterial *>(material())->updateTextures(); } +#include "qquickshadereffectnode.moc" + QT_END_NAMESPACE |