summaryrefslogtreecommitdiffstats
path: root/src/plugins/renderers/opengl/renderer
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-04-09 14:06:21 +0200
committerPaul Lemire <paul.lemire@kdab.com>2020-04-14 08:21:55 +0200
commite65597c1dcd95e1aba2b9e40d15c27621c9884b4 (patch)
tree3d60f0cbc41e3ff9fdf44c9c1cd7213b0a179732 /src/plugins/renderers/opengl/renderer
parentcd1f0d0ac6a82ed9d4621acbb84127c7d0a2a855 (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')
-rw-r--r--src/plugins/renderers/opengl/renderer/renderview.cpp3
-rw-r--r--src/plugins/renderers/opengl/renderer/shaderparameterpack.cpp5
-rw-r--r--src/plugins/renderers/opengl/renderer/shaderparameterpack_p.h9
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);