summaryrefslogtreecommitdiffstats
path: root/src/render/materialsystem/shader.cpp
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2019-09-19 15:58:20 +0200
committerPaul Lemire <paul.lemire@kdab.com>2019-09-26 14:22:12 +0200
commitb8435ca421d5612afabec1d717ea0a29be8a9c5c (patch)
treed614990af1a0905875dbde114955f6aa082fd773 /src/render/materialsystem/shader.cpp
parent29dc5ced83b9d992ca533711d25ab31ebe984ee4 (diff)
Update QShaderProgram to use direct sync
Change-Id: I71cac1345ed7b9e14b8cdc479c60f0384bb0b198 Reviewed-by: Mike Krus <mike.krus@kdab.com>
Diffstat (limited to 'src/render/materialsystem/shader.cpp')
-rw-r--r--src/render/materialsystem/shader.cpp56
1 files changed, 17 insertions, 39 deletions
diff --git a/src/render/materialsystem/shader.cpp b/src/render/materialsystem/shader.cpp
index d42b0dda7..f35fba9fa 100644
--- a/src/render/materialsystem/shader.cpp
+++ b/src/render/materialsystem/shader.cpp
@@ -101,23 +101,24 @@ void Shader::cleanup()
m_status = QShaderProgram::NotReady;
}
-void Shader::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change)
+void Shader::syncFromFrontEnd(const QNode *frontEnd, bool firstTime)
{
- const auto typedChange = qSharedPointerCast<Qt3DCore::QNodeCreatedChange<QShaderProgramData>>(change);
- const auto &data = typedChange->data;
-
- for (int i = QShaderProgram::Vertex; i <= QShaderProgram::Compute; ++i)
- m_shaderCode[i].clear();
-
- m_shaderCode[QShaderProgram::Vertex] = data.vertexShaderCode;
- m_shaderCode[QShaderProgram::TessellationControl] = data.tessellationControlShaderCode;
- m_shaderCode[QShaderProgram::TessellationEvaluation] = data.tessellationEvaluationShaderCode;
- m_shaderCode[QShaderProgram::Geometry] = data.geometryShaderCode;
- m_shaderCode[QShaderProgram::Fragment] = data.fragmentShaderCode;
- m_shaderCode[QShaderProgram::Compute] = data.computeShaderCode;
- m_isLoaded = false;
- updateDNA();
- markDirty(AbstractRenderer::ShadersDirty);
+ const QShaderProgram *node = qobject_cast<const QShaderProgram *>(frontEnd);
+ if (!node)
+ return;
+
+ BackendNode::syncFromFrontEnd(frontEnd, firstTime);
+
+ if (firstTime)
+ for (int i = QShaderProgram::Vertex; i <= QShaderProgram::Compute; ++i)
+ m_shaderCode[i].clear();
+
+ for (int i = QShaderProgram::Vertex; i <= QShaderProgram::Compute; ++i) {
+ const QShaderProgram::ShaderType shaderType = static_cast<QShaderProgram::ShaderType>(i);
+ const QByteArray code = node->shaderCode(shaderType);
+ if (code != m_shaderCode.value(shaderType))
+ setShaderCode(shaderType, code);
+ }
}
void Shader::setGraphicsContext(GraphicsContext *context)
@@ -174,29 +175,6 @@ void Shader::setShaderCode(QShaderProgram::ShaderType type, const QByteArray &co
markDirty(AbstractRenderer::ShadersDirty);
}
-void Shader::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e)
-{
- if (e->type() == PropertyUpdated) {
- QPropertyUpdatedChangePtr propertyChange = e.staticCast<QPropertyUpdatedChange>();
- QVariant propertyValue = propertyChange->value();
-
- if (propertyChange->propertyName() == QByteArrayLiteral("vertexShaderCode"))
- setShaderCode(QShaderProgram::Vertex, propertyValue.toByteArray());
- else if (propertyChange->propertyName() == QByteArrayLiteral("fragmentShaderCode"))
- setShaderCode(QShaderProgram::Fragment, propertyValue.toByteArray());
- else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationControlShaderCode"))
- setShaderCode(QShaderProgram::TessellationControl, propertyValue.toByteArray());
- else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationEvaluationShaderCode"))
- setShaderCode(QShaderProgram::TessellationEvaluation, propertyValue.toByteArray());
- else if (propertyChange->propertyName() == QByteArrayLiteral("geometryShaderCode"))
- setShaderCode(QShaderProgram::Geometry, propertyValue.toByteArray());
- else if (propertyChange->propertyName() == QByteArrayLiteral("computeShaderCode"))
- setShaderCode(QShaderProgram::Compute, propertyValue.toByteArray());
- }
-
- BackendNode::sceneChangeEvent(e);
-}
-
QHash<QString, ShaderUniform> Shader::activeUniformsForUniformBlock(int blockIndex) const
{
return m_uniformBlockIndexToShaderUniforms.value(blockIndex);