diff options
author | Paul Lemire <paul.lemire@kdab.com> | 2020-09-17 15:25:03 +0200 |
---|---|---|
committer | Paul Lemire <paul.lemire@kdab.com> | 2020-09-18 12:37:01 +0200 |
commit | 7889cf1c6f9790391690ce31f391529b2dd8230e (patch) | |
tree | 086b768a249cea5e92180939ae90a75fd1bc2eea | |
parent | 12ca735af3c49cac38e3f1f7e63e809d0b8c7487 (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
Pick-to: 5.15
Reviewed-by: Mike Krus <mike.krus@kdab.com>
-rw-r--r-- | src/render/shadergraph/qshadergenerator.cpp | 12 | ||||
-rw-r--r-- | tests/auto/render/shadergraph/qshadergenerator/tst_qshadergenerator.cpp | 36 |
2 files changed, 48 insertions, 0 deletions
diff --git a/src/render/shadergraph/qshadergenerator.cpp b/src/render/shadergraph/qshadergenerator.cpp index b1a4a8950..3795d3214 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 9cfbfc866..2875539ad 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" |