From 89b923242ad4697ec005aeb0f24659d85fb03c9e Mon Sep 17 00:00:00 2001 From: Paul Lemire Date: Mon, 8 Aug 2016 13:16:12 +0200 Subject: RenderView: unset thread local storage after we are done with it Change-Id: I28d05464f22a0632fb12e1408063e7fa962e85c1 Reviewed-by: Sean Harmer --- src/render/backend/renderview.cpp | 48 +++++++++++++++++++++++++++------------ src/render/backend/renderview_p.h | 2 +- 2 files changed, 34 insertions(+), 16 deletions(-) (limited to 'src/render/backend') diff --git a/src/render/backend/renderview.cpp b/src/render/backend/renderview.cpp index 0c45366c4..9226f8fac 100644 --- a/src/render/backend/renderview.cpp +++ b/src/render/backend/renderview.cpp @@ -398,6 +398,13 @@ void RenderView::addClearBuffers(const ClearBuffers *cb) { // If we are there, we know that entity had a GeometryRenderer + Material QVector RenderView::buildDrawRenderCommands(const QVector &entities) const { + // Note: since many threads can be building render commands + // we need to ensure that the UniformBlockValueBuilder they are using + // is only accessed from the same thread + UniformBlockValueBuilder *builder = new UniformBlockValueBuilder(); + builder->shaderDataManager = m_manager->shaderDataManager(); + m_localData.setLocalData(builder); + QVector commands; commands.reserve(entities.size()); @@ -444,6 +451,8 @@ QVector RenderView::buildDrawRenderCommands(const QVectorworldTransform()), lightSources.mid(0, std::max(lightSources.size(), MAX_LIGHTS))); buildSortingKey(command); @@ -451,11 +460,22 @@ QVector RenderView::buildDrawRenderCommands(const QVector RenderView::buildComputeRenderCommands(const QVector &entities) const { + // Note: since many threads can be building render commands + // we need to ensure that the UniformBlockValueBuilder they are using + // is only accessed from the same thread + UniformBlockValueBuilder *builder = new UniformBlockValueBuilder(); + builder->shaderDataManager = m_manager->shaderDataManager(); + m_localData.setLocalData(builder); + // If the RenderView contains only a ComputeDispatch then it cares about // A ComputeDispatch is also implicitely a NoDraw operation // enabled flag @@ -492,6 +512,10 @@ QVector RenderView::buildComputeRenderCommands(const QVectorshaderDataManager(); - } - - UniformBlockValueBuilder &builder = m_localData.localData(); - builder.activeUniformNamesToValue.clear(); + UniformBlockValueBuilder *builder = m_localData.localData(); + builder->activeUniformNamesToValue.clear(); // updates transformed properties; + // Fix me: this will lead to races when having multiple cameras shaderData->updateViewTransform(m_data.m_viewMatrix); + // Force to update the whole block - builder.updatedPropertiesOnly = false; + builder->updatedPropertiesOnly = false; // Retrieve names and description of each active uniforms in the uniform block - builder.uniforms = shader->activeUniformsForUniformBlock(-1); + builder->uniforms = shader->activeUniformsForUniformBlock(-1); // Build name-value map for the block - builder.buildActiveUniformNameValueMapStructHelper(shaderData, structName); + builder->buildActiveUniformNameValueMapStructHelper(shaderData, structName); // Set uniform values for each entrie of the block name-value map - QHash::const_iterator activeValuesIt = builder.activeUniformNamesToValue.constBegin(); - const QHash::const_iterator activeValuesEnd = builder.activeUniformNamesToValue.constEnd(); + QHash::const_iterator activeValuesIt = builder->activeUniformNamesToValue.constBegin(); + const QHash::const_iterator activeValuesEnd = builder->activeUniformNamesToValue.constEnd(); while (activeValuesIt != activeValuesEnd) { setUniformValue(uniformPack, activeValuesIt.key(), activeValuesIt.value()); diff --git a/src/render/backend/renderview_p.h b/src/render/backend/renderview_p.h index 1e943a80b..7be9903f6 100644 --- a/src/render/backend/renderview_p.h +++ b/src/render/backend/renderview_p.h @@ -242,7 +242,7 @@ private: void setShaderAndUniforms(RenderCommand *command, RenderPass *pass, ParameterInfoList ¶meters, const QMatrix4x4 &worldTransform, const QVector &activeLightSources) const; - mutable QThreadStorage m_localData; + mutable QThreadStorage m_localData; Renderer *m_renderer; NodeManagers *m_manager; -- cgit v1.2.3