From 5568a79fdd742761bae660137b3e6d4795100ff0 Mon Sep 17 00:00:00 2001 From: Laszlo Agocs Date: Fri, 29 Apr 2016 11:32:22 +0200 Subject: 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 --- src/quick/items/qquickgenericshadereffect.cpp | 40 ++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'src/quick/items/qquickgenericshadereffect.cpp') 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 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; -- cgit v1.2.3