diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2015-03-30 16:37:05 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2015-05-10 12:25:18 +0000 |
commit | 649a4d7035486effc987fe5a434b66cf07b533dc (patch) | |
tree | 0af2ea84c82d36e5e8a2813ce8c218078e621429 | |
parent | be1bf4bd32d170b2066cadae6e929f7a46d5e222 (diff) |
RenderShader: protect fragOutput hash with mutex
Also recompute the shader dna when the fragOutput changes and use those to
as part of the dna as well.
Change-Id: I800d9554142d108f74a8123ef9b0ace5038d3e4c
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/render/backend/rendershader.cpp | 31 | ||||
-rw-r--r-- | src/render/backend/rendershader_p.h | 2 |
2 files changed, 26 insertions, 7 deletions
diff --git a/src/render/backend/rendershader.cpp b/src/render/backend/rendershader.cpp index d4a3cbd70..b8c01f334 100644 --- a/src/render/backend/rendershader.cpp +++ b/src/render/backend/rendershader.cpp @@ -40,6 +40,7 @@ #include <QFile> #include <QOpenGLContext> #include <QOpenGLShaderProgram> +#include <QMutexLocker> #include <qshaderprogram.h> #include <Qt3DRenderer/private/qgraphicscontext_p.h> #include <Qt3DRenderer/private/attachmentpack_p.h> @@ -55,6 +56,7 @@ RenderShader::RenderShader() , m_program(Q_NULLPTR) , m_isLoaded(false) , m_dna(0) + , m_mutex(new QMutex()) { m_shaderCode.resize(static_cast<int>(QShaderProgram::Compute) + 1); } @@ -63,6 +65,7 @@ RenderShader::~RenderShader() { // TO DO: ShaderProgram is leaked as of now // Fix that taking care that they may be shared given a same dna + delete m_mutex; } void RenderShader::cleanup() @@ -226,7 +229,11 @@ void RenderShader::updateUniforms(QGraphicsContext *ctx, const QUniformPack &pac void RenderShader::setFragOutputs(const QHash<QString, int> &fragOutputs) { - m_fragOutputs = fragOutputs; + { + QMutexLocker lock(m_mutex); + m_fragOutputs = fragOutputs; + } + updateDNA(); } static QOpenGLShader::ShaderType shaderType(QShaderProgram::ShaderType type) @@ -292,12 +299,22 @@ QOpenGLShaderProgram* RenderShader::createDefaultProgram() void RenderShader::updateDNA() { - m_dna = qHash(m_shaderCode[QShaderProgram::Vertex] - + m_shaderCode[QShaderProgram::TessellationControl] - + m_shaderCode[QShaderProgram::TessellationEvaluation] - + m_shaderCode[QShaderProgram::Geometry] - + m_shaderCode[QShaderProgram::Fragment] - + m_shaderCode[QShaderProgram::Compute]); + uint codeHash = qHash(m_shaderCode[QShaderProgram::Vertex] + + m_shaderCode[QShaderProgram::TessellationControl] + + m_shaderCode[QShaderProgram::TessellationEvaluation] + + m_shaderCode[QShaderProgram::Geometry] + + m_shaderCode[QShaderProgram::Fragment] + + m_shaderCode[QShaderProgram::Compute]); + + QMutexLocker locker(m_mutex); + uint attachmentHash = 0; + QHash<QString, int>::const_iterator it = m_fragOutputs.begin(); + QHash<QString, int>::const_iterator end = m_fragOutputs.end(); + while (it != end) { + attachmentHash += ::qHash(it.value()) + ::qHash(it.key()); + ++it; + } + m_dna = codeHash + attachmentHash; } void RenderShader::initializeUniforms(const QVector<ShaderUniform> &uniformsDescription) diff --git a/src/render/backend/rendershader_p.h b/src/render/backend/rendershader_p.h index 23d5a8672..18bd6b232 100644 --- a/src/render/backend/rendershader_p.h +++ b/src/render/backend/rendershader_p.h @@ -45,6 +45,7 @@ QT_BEGIN_NAMESPACE class QOpenGLShaderProgram; +class QMutex; namespace Qt3D { @@ -108,6 +109,7 @@ private: bool m_isLoaded; ProgramDNA m_dna; + QMutex *m_mutex; void updateDNA(); |