diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2017-07-19 15:56:12 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-09-04 11:11:47 +0000 |
commit | 47ed71044ef0d9ac2b86a3943a0c4c67c485737b (patch) | |
tree | 024077388df1b99e53b015298d3202bb4448f28f | |
parent | 77987081121bdabb7aa8da32dedd09321b4a9420 (diff) |
Introduce enabled layers to QShaderProgramBuilder
This will allow to control the code generation by forwarding this to
QShaderGenerator on the backend side.
Change-Id: Ic613467ba742c05344ef553eabab861b2408d0ec
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
4 files changed, 90 insertions, 0 deletions
diff --git a/src/render/materialsystem/qshaderprogrambuilder.cpp b/src/render/materialsystem/qshaderprogrambuilder.cpp index 0ca2ed407..9318f96af 100644 --- a/src/render/materialsystem/qshaderprogrambuilder.cpp +++ b/src/render/materialsystem/qshaderprogrambuilder.cpp @@ -135,6 +135,33 @@ QShaderProgram *QShaderProgramBuilder::shaderProgram() const } /*! + \qmlproperty stringlist ShaderProgramBuilder::enabledLayers + + Holds the list of layers this builder will activate on the shader graphs + during code generation. +*/ +/*! + \property QShaderProgramBuilder::enabledLayers + + Holds the list of layers this builder will activate on the shader graphs + during code generation. +*/ +void QShaderProgramBuilder::setEnabledLayers(const QStringList &layers) +{ + Q_D(QShaderProgramBuilder); + if (layers != d->m_enabledLayers) { + d->m_enabledLayers = layers; + emit enabledLayersChanged(layers); + } +} + +QStringList QShaderProgramBuilder::enabledLayers() const +{ + Q_D(const QShaderProgramBuilder); + return d->m_enabledLayers; +} + +/*! \qmlproperty string ShaderProgram::vertexShaderGraph Holds the URL to the vertex shader graph used by this shader program builder. @@ -290,6 +317,7 @@ Qt3DCore::QNodeCreatedChangeBasePtr QShaderProgramBuilder::createNodeCreationCha auto &data = creationChange->data; Q_D(const QShaderProgramBuilder); data.shaderProgramId = d->m_shaderProgram ? d->m_shaderProgram->id() : Qt3DCore::QNodeId(); + data.enabledLayers = d->m_enabledLayers; data.vertexShaderGraph = d->m_vertexShaderGraph; data.tessellationControlShaderGraph = d->m_tessControlShaderGraph; data.tessellationEvaluationShaderGraph = d->m_tessEvalShaderGraph; diff --git a/src/render/materialsystem/qshaderprogrambuilder.h b/src/render/materialsystem/qshaderprogrambuilder.h index db8d2cae0..d8903232a 100644 --- a/src/render/materialsystem/qshaderprogrambuilder.h +++ b/src/render/materialsystem/qshaderprogrambuilder.h @@ -56,6 +56,7 @@ class QT3DRENDERSHARED_EXPORT QShaderProgramBuilder : public Qt3DCore::QNode { Q_OBJECT Q_PROPERTY(Qt3DRender::QShaderProgram* shaderProgram READ shaderProgram WRITE setShaderProgram NOTIFY shaderProgramChanged) + Q_PROPERTY(QStringList enabledLayers READ enabledLayers WRITE setEnabledLayers NOTIFY enabledLayersChanged) Q_PROPERTY(QUrl vertexShaderGraph READ vertexShaderGraph WRITE setVertexShaderGraph NOTIFY vertexShaderGraphChanged) Q_PROPERTY(QUrl tessellationControlShaderGraph READ tessellationControlShaderGraph WRITE setTessellationControlShaderGraph NOTIFY tessellationControlShaderGraphChanged) Q_PROPERTY(QUrl tessellationEvaluationShaderGraph READ tessellationEvaluationShaderGraph WRITE setTessellationEvaluationShaderGraph NOTIFY tessellationEvaluationShaderGraphChanged) @@ -68,6 +69,7 @@ public: ~QShaderProgramBuilder(); QShaderProgram *shaderProgram() const; + QStringList enabledLayers() const; QUrl vertexShaderGraph() const; QUrl tessellationControlShaderGraph() const; QUrl tessellationEvaluationShaderGraph() const; @@ -77,6 +79,7 @@ public: public Q_SLOTS: void setShaderProgram(Qt3DRender::QShaderProgram *program); + void setEnabledLayers(const QStringList &layers); void setVertexShaderGraph(const QUrl &vertexShaderGraph); void setTessellationControlShaderGraph(const QUrl &tessellationControlShaderGraph); void setTessellationEvaluationShaderGraph(const QUrl &tessellationEvaluationShaderGraph); @@ -86,6 +89,7 @@ public Q_SLOTS: Q_SIGNALS: void shaderProgramChanged(Qt3DRender::QShaderProgram *shaderProgram); + void enabledLayersChanged(const QStringList &layers); void vertexShaderGraphChanged(const QUrl &vertexShaderGraph); void tessellationControlShaderGraphChanged(const QUrl &tessellationControlShaderGraph); void tessellationEvaluationShaderGraphChanged(const QUrl &tessellationEvaluationShaderGraph); diff --git a/src/render/materialsystem/qshaderprogrambuilder_p.h b/src/render/materialsystem/qshaderprogrambuilder_p.h index da331ee08..e1b470229 100644 --- a/src/render/materialsystem/qshaderprogrambuilder_p.h +++ b/src/render/materialsystem/qshaderprogrambuilder_p.h @@ -67,6 +67,7 @@ public: Q_DECLARE_PUBLIC(QShaderProgramBuilder) QShaderProgram *m_shaderProgram; + QStringList m_enabledLayers; QUrl m_vertexShaderGraph; QUrl m_tessControlShaderGraph; QUrl m_tessEvalShaderGraph; @@ -78,6 +79,7 @@ public: struct QShaderProgramBuilderData { Qt3DCore::QNodeId shaderProgramId; + QStringList enabledLayers; QUrl vertexShaderGraph; QUrl tessellationControlShaderGraph; QUrl tessellationEvaluationShaderGraph; diff --git a/tests/auto/render/qshaderprogrambuilder/tst_qshaderprogrambuilder.cpp b/tests/auto/render/qshaderprogrambuilder/tst_qshaderprogrambuilder.cpp index c0513da3f..93bee22cc 100644 --- a/tests/auto/render/qshaderprogrambuilder/tst_qshaderprogrambuilder.cpp +++ b/tests/auto/render/qshaderprogrambuilder/tst_qshaderprogrambuilder.cpp @@ -56,6 +56,7 @@ private Q_SLOTS: // THEN QVERIFY(!builder.shaderProgram()); + QVERIFY(builder.enabledLayers().isEmpty()); QCOMPARE(builder.vertexShaderGraph(), QUrl()); QCOMPARE(builder.tessellationControlShaderGraph(), QUrl()); QCOMPARE(builder.tessellationEvaluationShaderGraph(), QUrl()); @@ -90,6 +91,25 @@ private Q_SLOTS: } { // WHEN + QSignalSpy spy(&builder, SIGNAL(enabledLayersChanged(QStringList))); + const auto newValue = QStringList() << "foo" << "bar"; + builder.setEnabledLayers(newValue); + + // THEN + QVERIFY(spy.isValid()); + QCOMPARE(builder.enabledLayers(), newValue); + QCOMPARE(spy.count(), 1); + + // WHEN + spy.clear(); + builder.setEnabledLayers(newValue); + + // THEN + QCOMPARE(builder.enabledLayers(), newValue); + QCOMPARE(spy.count(), 0); + } + { + // WHEN QSignalSpy spy(&builder, SIGNAL(vertexShaderGraphChanged(QUrl))); const auto newValue = QUrl::fromEncoded("qrc:/vertex.json"); builder.setVertexShaderGraph(newValue); @@ -244,6 +264,7 @@ private Q_SLOTS: Qt3DRender::QShaderProgramBuilder builder; builder.setShaderProgram(new Qt3DRender::QShaderProgram(&builder)); + builder.setEnabledLayers({"foo", "bar"}); builder.setVertexShaderGraph(QUrl::fromEncoded("qrc:/vertex.json")); builder.setTessellationControlShaderGraph(QUrl::fromEncoded("qrc:/tesscontrol.json")); builder.setTessellationEvaluationShaderGraph(QUrl::fromEncoded("qrc:/tesseval.json")); @@ -267,6 +288,7 @@ private Q_SLOTS: const Qt3DRender::QShaderProgramBuilderData cloneData = creationChangeData->data; QCOMPARE(builder.shaderProgram()->id(), cloneData.shaderProgramId); + QCOMPARE(builder.enabledLayers(), cloneData.enabledLayers); QCOMPARE(builder.vertexShaderGraph(), cloneData.vertexShaderGraph); QCOMPARE(builder.tessellationControlShaderGraph(), cloneData.tessellationControlShaderGraph); QCOMPARE(builder.tessellationEvaluationShaderGraph(), cloneData.tessellationEvaluationShaderGraph); @@ -295,6 +317,7 @@ private Q_SLOTS: const Qt3DRender::QShaderProgramBuilderData cloneData = creationChangeData->data; QCOMPARE(builder.shaderProgram()->id(), cloneData.shaderProgramId); + QCOMPARE(builder.enabledLayers(), cloneData.enabledLayers); QCOMPARE(builder.vertexShaderGraph(), cloneData.vertexShaderGraph); QCOMPARE(builder.tessellationControlShaderGraph(), cloneData.tessellationControlShaderGraph); QCOMPARE(builder.tessellationEvaluationShaderGraph(), cloneData.tessellationEvaluationShaderGraph); @@ -341,6 +364,39 @@ private Q_SLOTS: } } + void checkEnabledLayersUpdate() + { + // GIVEN + TestArbiter arbiter; + Qt3DRender::QShaderProgramBuilder builder; + arbiter.setArbiterOnNode(&builder); + const auto layers = QStringList() << "foo" << "bar"; + + { + // WHEN + builder.setEnabledLayers(layers); + QCoreApplication::processEvents(); + + // THEN + QCOMPARE(arbiter.events.size(), 1); + auto change = arbiter.events.first().staticCast<Qt3DCore::QPropertyUpdatedChange>(); + QCOMPARE(change->propertyName(), "enabledLayers"); + QCOMPARE(change->value().toStringList(), layers); + QCOMPARE(change->type(), Qt3DCore::PropertyUpdated); + + arbiter.events.clear(); + } + + { + // WHEN + builder.setEnabledLayers(layers); + QCoreApplication::processEvents(); + + // THEN + QCOMPARE(arbiter.events.size(), 0); + } + } + void checkVertexShaderGraphUpdate() { // GIVEN |