summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@kdab.com>2017-07-19 16:54:24 +0200
committerSean Harmer <sean.harmer@kdab.com>2017-09-04 11:11:50 +0000
commitaa3d86f2b7358dd71bdf78fb275bc2aa21ca23fd (patch)
tree50530329d97967d20aeb460ec71e7d8cfe33227f
parent47ed71044ef0d9ac2b86a3943a0c4c67c485737b (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.cpp25
-rw-r--r--src/render/materialsystem/shaderbuilder_p.h3
-rw-r--r--tests/auto/render/shaderbuilder/tst_shaderbuilder.cpp90
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");