diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-04-09 14:06:21 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-04-14 08:21:55 +0200 |
commit | e65597c1dcd95e1aba2b9e40d15c27621c9884b4 (patch) | |
tree | 3d60f0cbc41e3ff9fdf44c9c1cd7213b0a179732 /src/plugins/renderers/opengl/renderer | |
parent | cd1f0d0ac6a82ed9d4621acbb84127c7d0a2a855 (diff) |
Reserve the correct amount of uniforms in shaderparameterpack
According to hotspot, that small changes makes setShaderAndUniforms
(our biggest hotspot) drop from 45% of total sample cost down to 40%
by getting rid of frequent QVector reallocs.
Change-Id: Iba94eacee8f4349201acc399432c8c38f325c1d1
Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/plugins/renderers/opengl/renderer')
3 files changed, 15 insertions, 2 deletions
diff --git a/src/plugins/renderers/opengl/renderer/renderview.cpp b/src/plugins/renderers/opengl/renderer/renderview.cpp index 6e320e6d8..fa4bb70ef 100644 --- a/src/plugins/renderers/opengl/renderer/renderview.cpp +++ b/src/plugins/renderers/opengl/renderer/renderview.cpp @@ -1083,6 +1083,9 @@ void RenderView::setShaderAndUniforms(RenderCommand *command, // Set default standard uniforms without bindings const Matrix4x4 worldTransform = *(entity->worldTransform()); + // Reserve amount of uniforms we are going to need + command->m_parameterPack.reserve(uniformNamesIds.size() + standardUniformNamesIds.size() + uniformBlockNamesIds.size() + shaderStorageBlockNamesIds.size()); + for (const int uniformNameId : standardUniformNamesIds) setStandardUniformValue(command->m_parameterPack, uniformNameId, uniformNameId, entity, worldTransform); diff --git a/src/plugins/renderers/opengl/renderer/shaderparameterpack.cpp b/src/plugins/renderers/opengl/renderer/shaderparameterpack.cpp index 8c509f804..082220349 100644 --- a/src/plugins/renderers/opengl/renderer/shaderparameterpack.cpp +++ b/src/plugins/renderers/opengl/renderer/shaderparameterpack.cpp @@ -60,6 +60,11 @@ ShaderParameterPack::~ShaderParameterPack() { } +void ShaderParameterPack::reserve(int uniformCount) +{ + m_uniforms.reserve(uniformCount); +} + void ShaderParameterPack::setUniform(const int glslNameId, const UniformValue &val) { m_uniforms.insert(glslNameId, val); diff --git a/src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h b/src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h index d658d223b..10c4da5d4 100644 --- a/src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h +++ b/src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h @@ -97,8 +97,12 @@ struct PackUniformHash PackUniformHash() { - keys.reserve(10); - values.reserve(10); + } + + void reserve(int count) + { + keys.reserve(count); + values.reserve(count); } void insert(int key, const UniformValue &value) @@ -146,6 +150,7 @@ class Q_AUTOTEST_EXPORT ShaderParameterPack public: ~ShaderParameterPack(); + void reserve(int uniformCount); void setUniform(const int glslNameId, const UniformValue &val); void setTexture(const int glslNameId, int uniformArrayIndex, Qt3DCore::QNodeId id); void setImage(const int glslNameId, int uniformArrayIndex, Qt3DCore::QNodeId id); |