diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2019-09-19 15:58:20 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2019-09-26 14:22:12 +0200 |
commit | b8435ca421d5612afabec1d717ea0a29be8a9c5c (patch) | |
tree | d614990af1a0905875dbde114955f6aa082fd773 /src/render/materialsystem/shader.cpp | |
parent | 29dc5ced83b9d992ca533711d25ab31ebe984ee4 (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.cpp | 56 |
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); |