aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickshadereffectnode.cpp
diff options
context:
space:
mode:
authorLiang Qi <liang.qi@theqtcompany.com>2015-10-26 13:42:08 +0100
committerLiang Qi <liang.qi@theqtcompany.com>2015-10-26 13:42:08 +0100
commit3832b1e05b80a0f509be17dd3619a2f8bb70074f (patch)
tree3763c243b13c8228b1508ce5902dc2f587cabfdd /src/quick/items/qquickshadereffectnode.cpp
parentf9fae251ca07401ee1b0039edc6ea6b7a522b5a7 (diff)
parent5c53861cced2d40490e4c7bfc202aadc532df4c2 (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.cpp50
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