summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-08-21 12:42:39 +0200
committerLaszlo Agocs <laszlo.agocs@theqtcompany.com>2015-08-21 21:03:40 +0000
commit00948907ae7cd8af1b8067dd436d5969b4b210df (patch)
treedf7011e474cfa070769156f715ce76fe4f5ebe69
parentc1ef2e43c080779e6ddf2ea8c66a5f58e52d6e6a (diff)
Do not leak uniform values on the frame mempool
Attempting to set the value multiple times (first a standard value, then due to a binding) cannot just do an insert into the hash table as that would leak the previous value. This avoids asserting in apps loading models (f.ex. the gltf example) when using the Qt3D render thread and thus having leak checking enabled. Change-Id: I717ea8e66913a14537b05b2a6c0d16c92e6f3281 Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
-rw-r--r--src/render/backend/quniformvalue_p.h1
-rw-r--r--src/render/backend/renderview.cpp17
-rw-r--r--src/render/backend/renderview_p.h1
3 files changed, 15 insertions, 4 deletions
diff --git a/src/render/backend/quniformvalue_p.h b/src/render/backend/quniformvalue_p.h
index 873a5f220..4669ddcda 100644
--- a/src/render/backend/quniformvalue_p.h
+++ b/src/render/backend/quniformvalue_p.h
@@ -140,6 +140,7 @@ public:
void setUniformBuffer(const BlockToUBO &blockToUBO);
inline const QHash<QString, const QUniformValue* > &uniforms() const { return m_uniforms; }
+ const QUniformValue *uniform(const QString &glslName) const { return m_uniforms.value(glslName); }
struct NamedTexture
{
diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp
index 5c6b8a436..c0d0f4dcb 100644
--- a/src/render/backend/renderview.cpp
+++ b/src/render/backend/renderview.cpp
@@ -465,6 +465,9 @@ const AttachmentPack &RenderView::attachmentPack() const
void RenderView::setUniformValue(QUniformPack &uniformPack, const QString &name, const QVariant &value)
{
+ if (const QUniformValue *val = uniformPack.uniform(name))
+ destroyUniformValue(val, m_allocator);
+
RenderTexture *tex = Q_NULLPTR;
if ((tex = value.value<RenderTexture *>()) != Q_NULLPTR) {
@@ -477,6 +480,14 @@ void RenderView::setUniformValue(QUniformPack &uniformPack, const QString &name,
}
}
+void RenderView::setStandardUniformValue(QUniformPack &uniformPack, const QString &glslName, const QString &name, const QMatrix4x4 &worldTransform)
+{
+ if (const QUniformValue *val = uniformPack.uniform(glslName))
+ destroyUniformValue(val, m_allocator);
+
+ uniformPack.setUniform(glslName, (this->*ms_standardUniformSetters[name])(worldTransform));
+}
+
void RenderView::setUniformBlockValue(QUniformPack &uniformPack, RenderShader *shader, const ShaderUniformBlock &block, const QVariant &value)
{
RenderShaderData *shaderData = Q_NULLPTR;
@@ -620,8 +631,7 @@ void RenderView::setShaderAndUniforms(RenderCommand *command, RenderRenderPass *
// Set default standard uniforms without bindings
Q_FOREACH (const QString &uniformName, uniformNames) {
if (ms_standardUniformSetters.contains(uniformName))
- command->m_uniforms.setUniform(uniformName,
- (this->*ms_standardUniformSetters[uniformName])(worldTransform));
+ setStandardUniformValue(command->m_uniforms, uniformName, uniformName, worldTransform);
}
// Set default attributes
@@ -640,8 +650,7 @@ void RenderView::setShaderAndUniforms(RenderCommand *command, RenderRenderPass *
} else if (binding.bindingType() == QParameterMapping::StandardUniform
&& uniformNames.contains(binding.shaderVariableName())
&& ms_standardUniformSetters.contains(binding.parameterName())) {
- command->m_uniforms.setUniform(binding.shaderVariableName(),
- (this->*ms_standardUniformSetters[binding.parameterName()])(worldTransform));
+ setStandardUniformValue(command->m_uniforms, binding.shaderVariableName(), binding.parameterName(), worldTransform);
} else if (binding.bindingType() == QParameterMapping::FragmentOutput
&& fragOutputs.contains(binding.parameterName())) {
fragOutputs.insert(binding.shaderVariableName(), fragOutputs.take(binding.parameterName()));
diff --git a/src/render/backend/renderview_p.h b/src/render/backend/renderview_p.h
index 373465ccc..366030af9 100644
--- a/src/render/backend/renderview_p.h
+++ b/src/render/backend/renderview_p.h
@@ -254,6 +254,7 @@ private:
QUniformValue *time(const QMatrix4x4 &model) const;
void setUniformValue(QUniformPack &uniformPack, const QString &name, const QVariant &value);
+ void setStandardUniformValue(QUniformPack &uniformPack, const QString &glslName, const QString &name, const QMatrix4x4 &worldTransform);
void setUniformBlockValue(QUniformPack &uniformPack,
RenderShader *shader,
const ShaderUniformBlock &block,