summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKevin Ottens <kevin.ottens@kdab.com>2017-07-19 15:56:12 +0200
committerSean Harmer <sean.harmer@kdab.com>2017-09-04 11:11:47 +0000
commit47ed71044ef0d9ac2b86a3943a0c4c67c485737b (patch)
tree024077388df1b99e53b015298d3202bb4448f28f
parent77987081121bdabb7aa8da32dedd09321b4a9420 (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>
-rw-r--r--src/render/materialsystem/qshaderprogrambuilder.cpp28
-rw-r--r--src/render/materialsystem/qshaderprogrambuilder.h4
-rw-r--r--src/render/materialsystem/qshaderprogrambuilder_p.h2
-rw-r--r--tests/auto/render/qshaderprogrambuilder/tst_qshaderprogrambuilder.cpp56
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