diff options
author | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-08-21 12:42:39 +0200 |
---|---|---|
committer | Laszlo Agocs <laszlo.agocs@theqtcompany.com> | 2015-08-21 21:03:40 +0000 |
commit | 00948907ae7cd8af1b8067dd436d5969b4b210df (patch) | |
tree | df7011e474cfa070769156f715ce76fe4f5ebe69 | |
parent | c1ef2e43c080779e6ddf2ea8c66a5f58e52d6e6a (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.h | 1 | ||||
-rw-r--r-- | src/render/backend/renderview.cpp | 17 | ||||
-rw-r--r-- | src/render/backend/renderview_p.h | 1 |
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, |