summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Lemire <paul.lemire@kdab.com>2020-09-17 15:25:03 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-09-18 12:13:15 +0000
commit5451edeb79cc0c9816220fb60f9c6f0ba275fa02 (patch)
tree5399dd0bccf741bfd746fa63d1fe3626bc115efd
parent9a653be77429cc85e7a1481f0925b59bc4b7e4d6 (diff)
QShaderGenerator: add a #define LAYER_name for each layer
This will make it more convenient to insert conditional code based on whether a layer is defined or not. Change-Id: Ia72b569f022dd2ee723bf2493710eab709042639 Reviewed-by: Mike Krus <mike.krus@kdab.com> (cherry picked from commit 7889cf1c6f9790391690ce31f391529b2dd8230e) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/render/shadergraph/qshadergenerator.cpp12
-rw-r--r--tests/auto/render/shadergraph/qshadergenerator/tst_qshadergenerator.cpp36
2 files changed, 48 insertions, 0 deletions
diff --git a/src/render/shadergraph/qshadergenerator.cpp b/src/render/shadergraph/qshadergenerator.cpp
index f80502fcc..a33110719 100644
--- a/src/render/shadergraph/qshadergenerator.cpp
+++ b/src/render/shadergraph/qshadergenerator.cpp
@@ -507,6 +507,17 @@ namespace
}
}
}
+
+ QByteArrayList layerDefines(const QStringList &enabledLayers) noexcept
+ {
+ QByteArrayList defines;
+ const QString defineTemplate = QStringLiteral("#define LAYER_%1");
+
+ for (const QString &layer : enabledLayers)
+ defines << defineTemplate.arg(layer).toUtf8();
+
+ return defines;
+ }
}
QByteArray QShaderGenerator::createShaderCode(const QStringList &enabledLayers) const
@@ -518,6 +529,7 @@ QByteArray QShaderGenerator::createShaderCode(const QStringList &enabledLayers)
code << versionString(format);
code << QByteArray();
+ code << layerDefines(enabledLayers);
if (format.api() == QShaderFormat::VulkanFlavoredGLSL || format.api() == QShaderFormat::RHI) {
GLSL45HeaderWriter builder;
diff --git a/tests/auto/render/shadergraph/qshadergenerator/tst_qshadergenerator.cpp b/tests/auto/render/shadergraph/qshadergenerator/tst_qshadergenerator.cpp
index e386ae09f..98f571328 100644
--- a/tests/auto/render/shadergraph/qshadergenerator/tst_qshadergenerator.cpp
+++ b/tests/auto/render/shadergraph/qshadergenerator/tst_qshadergenerator.cpp
@@ -202,6 +202,7 @@ private slots:
void shouldHandlePortNamesPrefixingOneAnother();
void shouldHandleNodesWithMultipleOutputPorts();
void shouldHandleExpressionsInInputNodes();
+ void shouldGenerateLayerDefines();
};
void tst_QShaderGenerator::shouldHaveDefaultState()
@@ -860,6 +861,8 @@ void tst_QShaderGenerator::shouldGenerateDifferentCodeDependingOnActiveLayers()
const auto expected = QByteArrayList()
<< "#version 400 core"
<< ""
+ << "#define LAYER_diffuseUniform"
+ << "#define LAYER_normalUniform"
<< "uniform vec3 normalUniform;"
<< "uniform vec4 diffuseUniform;"
<< "#pragma include gl4/lightmodel.frag.inc"
@@ -880,6 +883,8 @@ void tst_QShaderGenerator::shouldGenerateDifferentCodeDependingOnActiveLayers()
// THEN
const auto expected = QByteArrayList() << "#version 400 core"
<< ""
+ << "#define LAYER_diffuseUniform"
+ << "#define LAYER_normalTexture"
<< "in vec2 texCoord;"
<< "uniform sampler2D normalTexture;"
<< "uniform vec4 diffuseUniform;"
@@ -903,6 +908,8 @@ void tst_QShaderGenerator::shouldGenerateDifferentCodeDependingOnActiveLayers()
const auto expected = QByteArrayList()
<< "#version 400 core"
<< ""
+ << "#define LAYER_diffuseTexture"
+ << "#define LAYER_normalUniform"
<< "in vec2 texCoord;"
<< "uniform vec3 normalUniform;"
<< "uniform sampler2D diffuseTexture;"
@@ -926,6 +933,8 @@ void tst_QShaderGenerator::shouldGenerateDifferentCodeDependingOnActiveLayers()
const auto expected = QByteArrayList()
<< "#version 400 core"
<< ""
+ << "#define LAYER_diffuseTexture"
+ << "#define LAYER_normalTexture"
<< "in vec2 texCoord;"
<< "uniform sampler2D normalTexture;"
<< "uniform sampler2D diffuseTexture;"
@@ -1050,6 +1059,8 @@ void tst_QShaderGenerator::shouldUseGlobalVariableRatherThanTemporaries()
const auto expected = QByteArrayList()
<< "#version 400 core"
<< ""
+ << "#define LAYER_diffuseUniform"
+ << "#define LAYER_normalUniform"
<< "in vec4 vertexPosition;"
<< "out vec4 fragColor;"
<< ""
@@ -1422,6 +1433,31 @@ void tst_QShaderGenerator::shouldHandleExpressionsInInputNodes()
QCOMPARE(code, expected.join("\n"));
}
+void tst_QShaderGenerator::shouldGenerateLayerDefines()
+{
+ // GIVEN
+ const auto gl4 = createFormat(QShaderFormat::OpenGLCoreProfile, 4, 0);
+
+ auto generator = QShaderGenerator();
+ generator.format = gl4;
+
+ // WHEN
+ const auto code = generator.createShaderCode({"layer1", "layer2"});
+
+ // THEN
+ const auto expected = QByteArrayList()
+ << "#version 400 core"
+ << ""
+ << "#define LAYER_layer1"
+ << "#define LAYER_layer2"
+ << ""
+ << "void main()"
+ << "{"
+ << "}"
+ << "";
+ QCOMPARE(code, expected.join("\n"));
+}
+
QTEST_MAIN(tst_QShaderGenerator)
#include "tst_qshadergenerator.moc"