aboutsummaryrefslogtreecommitdiffstats
path: root/src/quick/items/qquickgenericshadereffect.cpp
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2016-04-29 11:32:22 +0200
committerAndy Nichols <andy.nichols@qt.io>2016-04-30 20:22:18 +0000
commit5568a79fdd742761bae660137b3e6d4795100ff0 (patch)
tree34ce185438916c9e4d4022eac5b586d6fbeb5c72 /src/quick/items/qquickgenericshadereffect.cpp
parent3169744ab415268a9b6ff544d1bd49031ef3c08a (diff)
D3D12: Cache shader reflection results
Different ShaderEffect items using the same shader should have no need to examine the source/bytecode over and over again for each item. Change-Id: I9c124245b321fb0d6c4f1440d44250768d9ae94f Reviewed-by: Andy Nichols <andy.nichols@qt.io>
Diffstat (limited to 'src/quick/items/qquickgenericshadereffect.cpp')
-rw-r--r--src/quick/items/qquickgenericshadereffect.cpp40
1 files changed, 33 insertions, 7 deletions
diff --git a/src/quick/items/qquickgenericshadereffect.cpp b/src/quick/items/qquickgenericshadereffect.cpp
index 49ed25f799..c6b90e3499 100644
--- a/src/quick/items/qquickgenericshadereffect.cpp
+++ b/src/quick/items/qquickgenericshadereffect.cpp
@@ -409,6 +409,28 @@ void QQuickGenericShaderEffect::disconnectSignals(Shader shaderType)
}
}
+struct ReflectCache
+{
+ bool contains(const QByteArray &key) const
+ {
+ return m_reflectCache.contains(key);
+ }
+
+ QSGGuiThreadShaderEffectManager::ShaderInfo value(const QByteArray &key) const
+ {
+ return m_reflectCache.value(key);
+ }
+
+ void insert(const QByteArray &key, const QSGGuiThreadShaderEffectManager::ShaderInfo &value)
+ {
+ m_reflectCache.insert(key, value);
+ }
+
+ QHash<QByteArray, QSGGuiThreadShaderEffectManager::ShaderInfo> m_reflectCache;
+};
+
+Q_GLOBAL_STATIC(ReflectCache, reflectCache)
+
void QQuickGenericShaderEffect::updateShader(Shader shaderType, const QByteArray &src)
{
QSGGuiThreadShaderEffectManager *mgr = shaderEffectManager();
@@ -426,14 +448,18 @@ void QQuickGenericShaderEffect::updateShader(Shader shaderType, const QByteArray
// Figure out what input parameters and variables are used in the shader.
// For file-based shader source/bytecode this is where the data is pulled
// in from the file.
- QSGGuiThreadShaderEffectManager::ShaderInfo shaderInfo;
- // ### this may need some sort of caching mechanism
- if (!mgr->reflect(src, &shaderInfo)) {
- qWarning("ShaderEffect: shader reflection failed for %s", src.constData());
- m_shaders[shaderType].hasShaderCode = false;
- return;
+ if (reflectCache()->contains(src)) {
+ m_shaders[shaderType].shaderInfo = reflectCache()->value(src);
+ } else {
+ QSGGuiThreadShaderEffectManager::ShaderInfo shaderInfo;
+ if (!mgr->reflect(src, &shaderInfo)) {
+ qWarning("ShaderEffect: shader reflection failed for %s", src.constData());
+ m_shaders[shaderType].hasShaderCode = false;
+ return;
+ }
+ m_shaders[shaderType].shaderInfo = shaderInfo;
+ reflectCache()->insert(src, shaderInfo);
}
- m_shaders[shaderType].shaderInfo = shaderInfo;
m_shaders[shaderType].hasShaderCode = true;
} else {
m_shaders[shaderType].hasShaderCode = false;