diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2021-01-27 07:24:55 +0100 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2021-01-27 16:00:33 +0100 |
commit | a7f627b29b2792154bc2a45f31bd32b74fd508b4 (patch) | |
tree | bb45786b71c60ebaa3b4d8cad2af496c26d81d8a /src | |
parent | a70e425611d80cc1d62ddd724d9f234e213503fd (diff) |
Fix light uniforms not properly being updated
- We cache commands and only rebuild them when really needed. When we rebuild
then, we also store the mapping between uniform location and parameter name
- When reusing a command, we only update the uniform values but expect the
mapping between to remain the same.
- When dealing with lights however, we can end up in a case where the light type
changes, and therefore so does the shader data associated. The command remains
cached as nothing really requires a rebuid. Yet, this means we could
have more or less parameters than the number of mappings we have stored
previously if the shader data defines more or less properties. To account for
this, we now rebuild the mapping when building the command or if the number of
parameters in the parameter pack is different than at the previous frame.
Change-Id: I9400fc7e5bcb4b97ac9da69cdf794010cf81103b
Pick-to: 6.0 5.15
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/renderers/opengl/renderer/renderview.cpp | 4 | ||||
-rw-r--r-- | src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h | 5 |
2 files changed, 8 insertions, 1 deletions
diff --git a/src/plugins/renderers/opengl/renderer/renderview.cpp b/src/plugins/renderers/opengl/renderer/renderview.cpp index 3f0f9061e..d456151e3 100644 --- a/src/plugins/renderers/opengl/renderer/renderview.cpp +++ b/src/plugins/renderers/opengl/renderer/renderview.cpp @@ -1323,6 +1323,7 @@ void RenderView::setShaderAndUniforms(RenderCommand *command, command->m_parameterPack.reserve(shader->parameterPackSize()); } + const size_t previousUniformCount = command->m_parameterPack.uniforms().size(); if (shader->hasActiveVariables()) { const std::vector<int> &standardUniformNamesIds = shader->standardUniformNameIds(); @@ -1347,8 +1348,9 @@ void RenderView::setShaderAndUniforms(RenderCommand *command, updateLightUniforms(command, entity); } + const size_t actualUniformCount = command->m_parameterPack.uniforms().size(); // Prepare the ShaderParameterPack based on the active uniforms of the shader - if (!updateUniformsOnly) + if (!updateUniformsOnly || previousUniformCount != actualUniformCount) shader->prepareUniforms(command->m_parameterPack); } diff --git a/src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h b/src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h index 826350596..0825c9c47 100644 --- a/src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h +++ b/src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h @@ -100,6 +100,11 @@ struct PackUniformHash values.reserve(count); } + size_t size() const + { + return keys.size(); + } + inline int indexForKey(int key) const { const auto b = keys.cbegin(); |