diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2017-07-19 16:54:24 +0200 |
---|---|---|
committer | Sean Harmer <sean.harmer@kdab.com> | 2017-09-04 11:11:50 +0000 |
commit | aa3d86f2b7358dd71bdf78fb275bc2aa21ca23fd (patch) | |
tree | 50530329d97967d20aeb460ec71e7d8cfe33227f | |
parent | 47ed71044ef0d9ac2b86a3943a0c4c67c485737b (diff) |
Implement enabledLayers on ShaderBuilder
This is the backend counterpart to the QShaderProgramBuilder
introduction of the enabledLayers property.
Change-Id: Iecec5e9d1450c454f64c243f5f797c0d63e5f1ee
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
-rw-r--r-- | src/render/materialsystem/shaderbuilder.cpp | 25 | ||||
-rw-r--r-- | src/render/materialsystem/shaderbuilder_p.h | 3 | ||||
-rw-r--r-- | tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp | 90 |
3 files changed, 117 insertions, 1 deletions
diff --git a/src/render/materialsystem/shaderbuilder.cpp b/src/render/materialsystem/shaderbuilder.cpp index 95da42506..c2b32ce86 100644 --- a/src/render/materialsystem/shaderbuilder.cpp +++ b/src/render/materialsystem/shaderbuilder.cpp @@ -130,6 +130,7 @@ ShaderBuilder::~ShaderBuilder() void ShaderBuilder::cleanup() { m_shaderProgramId = Qt3DCore::QNodeId(); + m_enabledLayers.clear(); m_graphs.clear(); m_dirtyTypes.clear(); QBackendNode::setEnabled(false); @@ -140,6 +141,25 @@ Qt3DCore::QNodeId ShaderBuilder::shaderProgramId() const return m_shaderProgramId; } +QStringList ShaderBuilder::enabledLayers() const +{ + return m_enabledLayers; +} + + +void ShaderBuilder::setEnabledLayers(const QStringList &layers) +{ + if (m_enabledLayers == layers) + return; + + m_enabledLayers = layers; + + for (const auto type : m_graphs.keys()) { + if (!m_graphs.value(type).isEmpty()) + m_dirtyTypes.insert(type); + } +} + GraphicsApiFilterData ShaderBuilder::graphicsApi() const { return m_graphicsApi; @@ -253,7 +273,7 @@ void ShaderBuilder::generateCode(ShaderBuilder::ShaderType type) generator.format = format; generator.graph = graph; - const auto code = generator.createShaderCode(); + const auto code = generator.createShaderCode(m_enabledLayers); m_codes.insert(type, deincludify(code, graphPath + QStringLiteral(".glsl"))); m_dirtyTypes.remove(type); } @@ -266,6 +286,8 @@ void ShaderBuilder::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &e) if (propertyChange->propertyName() == QByteArrayLiteral("shaderProgram")) m_shaderProgramId = propertyValue.value<Qt3DCore::QNodeId>(); + else if (propertyChange->propertyName() == QByteArrayLiteral("enabledLayers")) + setEnabledLayers(propertyValue.toStringList()); else if (propertyChange->propertyName() == QByteArrayLiteral("vertexShaderGraph")) setShaderGraph(Vertex, propertyValue.toUrl()); else if (propertyChange->propertyName() == QByteArrayLiteral("tessellationControlShaderGraph")) @@ -290,6 +312,7 @@ void ShaderBuilder::initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr const auto &data = typedChange->data; m_shaderProgramId = data.shaderProgramId; + m_enabledLayers = data.enabledLayers; setShaderGraph(Vertex, data.vertexShaderGraph); setShaderGraph(TessellationControl, data.tessellationControlShaderGraph); setShaderGraph(TessellationEvaluation, data.tessellationEvaluationShaderGraph); diff --git a/src/render/materialsystem/shaderbuilder_p.h b/src/render/materialsystem/shaderbuilder_p.h index 6f3612ce8..9fff5df97 100644 --- a/src/render/materialsystem/shaderbuilder_p.h +++ b/src/render/materialsystem/shaderbuilder_p.h @@ -82,6 +82,7 @@ public: void cleanup(); Qt3DCore::QNodeId shaderProgramId() const; + QStringList enabledLayers() const; GraphicsApiFilterData graphicsApi() const; void setGraphicsApi(const GraphicsApiFilterData &graphicsApi); @@ -98,9 +99,11 @@ public: private: void initializeFromPeer(const Qt3DCore::QNodeCreatedChangeBasePtr &change) Q_DECL_FINAL; + void setEnabledLayers(const QStringList &layers); GraphicsApiFilterData m_graphicsApi; Qt3DCore::QNodeId m_shaderProgramId; + QStringList m_enabledLayers; QHash<ShaderType, QUrl> m_graphs; QHash<ShaderType, QByteArray> m_codes; QSet<ShaderType> m_dirtyTypes; diff --git a/tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp b/tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp index c381f328e..6557acb6c 100644 --- a/tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp +++ b/tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp @@ -73,6 +73,7 @@ private slots: // THEN QVERIFY(!shaderBuilder.isEnabled()); + QVERIFY(shaderBuilder.enabledLayers().isEmpty()); for (int i = 0; i <= Qt3DRender::Render::ShaderBuilder::Compute; i++) { const auto type = static_cast<Qt3DRender::Render::ShaderBuilder::ShaderType>(i); QCOMPARE(shaderBuilder.shaderGraph(type), QUrl()); @@ -97,6 +98,11 @@ private slots: } { auto frontend = new Qt3DRender::QShaderProgramBuilder; + frontend->setEnabledLayers({"foo", "bar"}); + QTest::newRow("enabledLayers") << frontend; + } + { + auto frontend = new Qt3DRender::QShaderProgramBuilder; frontend->setVertexShaderGraph(QUrl::fromEncoded("qrc:/vertex.json")); QTest::newRow("vertex") << frontend; } @@ -144,6 +150,8 @@ private slots: else QVERIFY(backend.shaderProgramId().isNull()); + QCOMPARE(backend.enabledLayers(), frontend->enabledLayers()); + QCOMPARE(backend.shaderGraph(Qt3DRender::Render::ShaderBuilder::Vertex), frontend->vertexShaderGraph()); QCOMPARE(backend.shaderCode(Qt3DRender::Render::ShaderBuilder::Vertex), QByteArray()); QCOMPARE(backend.isShaderCodeDirty(Qt3DRender::Render::ShaderBuilder::Vertex), !frontend->vertexShaderGraph().isEmpty()); @@ -173,6 +181,7 @@ private slots: // THEN QVERIFY(!backend.isEnabled()); + QVERIFY(backend.enabledLayers().isEmpty()); for (int i = 0; i <= Qt3DRender::Render::ShaderBuilder::Compute; i++) { const auto type = static_cast<Qt3DRender::Render::ShaderBuilder::ShaderType>(i); QCOMPARE(backend.shaderGraph(type), QUrl()); @@ -270,6 +279,87 @@ private slots: renderer.resetDirty(); } + void shouldHandleEnabledLayersPropertyChange() + { + // GIVEN + Qt3DRender::Render::ShaderBuilder backend; + TestRenderer renderer; + backend.setRenderer(&renderer); + const auto layers = QStringList() << "foo" << "bar"; + + for (int i = 0; i <= Qt3DRender::Render::ShaderBuilder::Compute; i++) { + const auto type = static_cast<Qt3DRender::Render::ShaderBuilder::ShaderType>(i); + const auto graphUrl = QUrl::fromEncoded("qrc:/input.json"); + backend.setShaderGraph(type, graphUrl); + } + + // WHEN + auto updateChange = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); + updateChange->setValue(layers); + updateChange->setPropertyName("enabledLayers"); + backend.sceneChangeEvent(updateChange); + + // THEN + QCOMPARE(backend.enabledLayers(), layers); + for (int i = 0; i <= Qt3DRender::Render::ShaderBuilder::Compute; i++) { + const auto type = static_cast<Qt3DRender::Render::ShaderBuilder::ShaderType>(i); + QVERIFY(backend.isShaderCodeDirty(type)); + backend.generateCode(type); // Resets the dirty flag + } + QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); + renderer.resetDirty(); + + // WHEN + updateChange = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); + updateChange->setValue(layers); + updateChange->setPropertyName("enabledLayers"); + backend.sceneChangeEvent(updateChange); + + // THEN + QCOMPARE(backend.enabledLayers(), layers); + for (int i = 0; i <= Qt3DRender::Render::ShaderBuilder::Compute; i++) { + const auto type = static_cast<Qt3DRender::Render::ShaderBuilder::ShaderType>(i); + QVERIFY(!backend.isShaderCodeDirty(type)); + backend.generateCode(type); // Resets the dirty flag + } + QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); + renderer.resetDirty(); + + // WHEN + updateChange = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); + updateChange->setValue(QStringList()); + updateChange->setPropertyName("enabledLayers"); + backend.sceneChangeEvent(updateChange); + + // THEN + QVERIFY(backend.shaderProgramId().isNull()); + for (int i = 0; i <= Qt3DRender::Render::ShaderBuilder::Compute; i++) { + const auto type = static_cast<Qt3DRender::Render::ShaderBuilder::ShaderType>(i); + QVERIFY(backend.isShaderCodeDirty(type)); + backend.generateCode(type); // Resets the dirty flag + } + QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); + renderer.resetDirty(); + + // WHEN + updateChange = Qt3DCore::QPropertyUpdatedChangePtr::create(Qt3DCore::QNodeId()); + updateChange->setValue(layers); + updateChange->setPropertyName("enabledLayers"); + backend.sceneChangeEvent(updateChange); + // AND + backend.cleanup(); + + // THEN + QVERIFY(backend.enabledLayers().isEmpty()); + for (int i = 0; i <= Qt3DRender::Render::ShaderBuilder::Compute; i++) { + const auto type = static_cast<Qt3DRender::Render::ShaderBuilder::ShaderType>(i); + QVERIFY(!backend.isShaderCodeDirty(type)); + backend.generateCode(type); // Resets the dirty flag + } + QCOMPARE(renderer.dirtyBits(), Qt3DRender::Render::AbstractRenderer::ShadersDirty); + renderer.resetDirty(); + } + void shouldHandleShaderGraphPropertiesChanges_data() { QTest::addColumn<QByteArray>("property"); |