summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorSean Harmer <sean.harmer@kdab.com>2016-05-21 20:05:41 +0100
committerSean Harmer <sean.harmer@kdab.com>2016-05-22 06:00:08 +0000
commit784c89cedb817c8329edcc7ec53dad23a9cae1f2 (patch)
tree3686b32fd09d28705557998291cf1e47b9ee0a38 /src
parent0697e2d23622d1d2f40c275194fb5479a48f7be0 (diff)
Fix dynamic shader code updates
Being careful to remove cached pointer to the shader program from the graphics context. Task-number: QTBUG-53527 Change-Id: Icee8aaa3f0900c7aa42598ad81b3f368f0338f46 Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src')
-rw-r--r--src/render/materialsystem/shader.cpp14
-rw-r--r--src/render/materialsystem/shader_p.h1
2 files changed, 9 insertions, 6 deletions
diff --git a/src/render/materialsystem/shader.cpp b/src/render/materialsystem/shader.cpp
index 909f19c79..19df0eed2 100644
--- a/src/render/materialsystem/shader.cpp
+++ b/src/render/materialsystem/shader.cpp
@@ -144,22 +144,22 @@ void Shader::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
QPropertyUpdatedChangePtr propertyChange = e.staticCast<QPropertyUpdatedChange>();
QVariant propertyValue = propertyChange->value();
- if (propertyChange->propertyName() == QByteArrayLiteral("vertexSourceCode")) {
+ if (propertyChange->propertyName() == QByteArrayLiteral("vertexShaderCode")) {
m_shaderCode[QShaderProgram::Vertex] = propertyValue.toByteArray();
m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("fragmentSourceCode")) {
+ } else if (propertyChange->propertyName() == QByteArrayLiteral("fragmentShaderCode")) {
m_shaderCode[QShaderProgram::Fragment] = propertyValue.toByteArray();
m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationControlSourceCode")) {
+ } else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationControlShaderCode")) {
m_shaderCode[QShaderProgram::TessellationControl] = propertyValue.toByteArray();
m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationEvaluationSourceCode")) {
+ } else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationEvaluationShaderCode")) {
m_shaderCode[QShaderProgram::TessellationEvaluation] = propertyValue.toByteArray();
m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("geometrySourceCode")) {
+ } else if (propertyChange->propertyName() == QByteArrayLiteral("geometryShaderCode")) {
m_shaderCode[QShaderProgram::Geometry] = propertyValue.toByteArray();
m_isLoaded = false;
- } else if (propertyChange->propertyName() == QByteArrayLiteral("computeSourceCode")) {
+ } else if (propertyChange->propertyName() == QByteArrayLiteral("computeShaderCode")) {
m_shaderCode[QShaderProgram::Compute] = propertyValue.toByteArray();
m_isLoaded = false;
}
@@ -241,6 +241,7 @@ QOpenGLShaderProgram *Shader::getOrCreateProgram(GraphicsContext *ctx)
if (!m_isLoaded) {
delete m_program;
m_graphicsContext = ctx;
+ m_graphicsContext->removeProgram(m_oldDna, peerId());
m_program = createProgram(ctx);
if (!m_program)
m_program = createDefaultProgram();
@@ -333,6 +334,7 @@ QOpenGLShaderProgram* Shader::createDefaultProgram()
void Shader::updateDNA()
{
+ m_oldDna = m_dna;
uint codeHash = qHash(m_shaderCode[QShaderProgram::Vertex]
+ m_shaderCode[QShaderProgram::TessellationControl]
+ m_shaderCode[QShaderProgram::TessellationEvaluation]
diff --git a/src/render/materialsystem/shader_p.h b/src/render/materialsystem/shader_p.h
index 0bf0c528f..1d92b4f4d 100644
--- a/src/render/materialsystem/shader_p.h
+++ b/src/render/materialsystem/shader_p.h
@@ -144,6 +144,7 @@ private:
bool m_isLoaded;
ProgramDNA m_dna;
+ ProgramDNA m_oldDna;
QMutex m_mutex;
GraphicsContext *m_graphicsContext;