summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2015-03-30 16:37:05 +0200
committerPaul Lemire <paul.lemire@kdab.com>2015-05-10 12:25:18 +0000
commit649a4d7035486effc987fe5a434b66cf07b533dc (patch)
tree0af2ea84c82d36e5e8a2813ce8c218078e621429
parentbe1bf4bd32d170b2066cadae6e929f7a46d5e222 (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.cpp31
-rw-r--r--src/render/backend/rendershader_p.h2
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();