summaryrefslogtreecommitdiffstats
path: root/tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp')
-rw-r--r--tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp627
1 files changed, 0 insertions, 627 deletions
diff --git a/tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp b/tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp
deleted file mode 100644
index 86db9edbea..0000000000
--- a/tests/auto/gui/util/qshadergraphloader/tst_qshadergraphloader.cpp
+++ /dev/null
@@ -1,627 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB).
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of the test suite of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:GPL-EXCEPT$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 as published by the Free Software
-** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-
-#include <QTest>
-
-#include <QtCore/qbuffer.h>
-
-#include <QtGui/private/qshadergraphloader_p.h>
-#include <QtGui/private/qshaderlanguage_p.h>
-
-using QBufferPointer = QSharedPointer<QBuffer>;
-Q_DECLARE_METATYPE(QBufferPointer);
-
-using PrototypeHash = QHash<QString, QShaderNode>;
-Q_DECLARE_METATYPE(PrototypeHash);
-
-namespace
-{
- QBufferPointer createBuffer(const QByteArray &data, QIODevice::OpenMode openMode = QIODevice::ReadOnly)
- {
- auto buffer = QBufferPointer::create();
- buffer->setData(data);
- if (openMode != QIODevice::NotOpen)
- buffer->open(openMode);
- return buffer;
- }
-
- QShaderFormat createFormat(QShaderFormat::Api api, int majorVersion, int minorVersion)
- {
- auto format = QShaderFormat();
- format.setApi(api);
- format.setVersion(QVersionNumber(majorVersion, minorVersion));
- return format;
- }
-
- QShaderNodePort createPort(QShaderNodePort::Direction portDirection, const QString &portName)
- {
- auto port = QShaderNodePort();
- port.direction = portDirection;
- port.name = portName;
- return port;
- }
-
- QShaderNode createNode(const QList<QShaderNodePort> &ports,
- const QStringList &layers = QStringList())
- {
- auto node = QShaderNode();
- node.setUuid(QUuid::createUuid());
- node.setLayers(layers);
- for (const auto &port : ports)
- node.addPort(port);
- return node;
- }
-
- QShaderGraph::Edge createEdge(const QUuid &sourceUuid, const QString &sourceName,
- const QUuid &targetUuid, const QString &targetName,
- const QStringList &layers = QStringList())
- {
- auto edge = QShaderGraph::Edge();
- edge.sourceNodeUuid = sourceUuid;
- edge.sourcePortName = sourceName;
- edge.targetNodeUuid = targetUuid;
- edge.targetPortName = targetName;
- edge.layers = layers;
- return edge;
- }
-
- QShaderGraph createGraph()
- {
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
-
- auto graph = QShaderGraph();
-
- auto worldPosition = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- worldPosition.setUuid(QUuid("{00000000-0000-0000-0000-000000000001}"));
- worldPosition.setParameter("name", "worldPosition");
- worldPosition.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(QShaderLanguage::Input));
- worldPosition.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(QShaderLanguage::Vec3));
- worldPosition.addRule(openGLES2, QShaderNode::Rule("highp $type $value = $name;",
- QByteArrayList() << "$qualifier highp $type $name;"));
- worldPosition.addRule(openGL3, QShaderNode::Rule("$type $value = $name;",
- QByteArrayList() << "$qualifier $type $name;"));
-
- auto texture = createNode({
- createPort(QShaderNodePort::Output, "texture")
- });
- texture.setUuid(QUuid("{00000000-0000-0000-0000-000000000002}"));
- texture.addRule(openGLES2, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
- texture.addRule(openGL3, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
-
- auto texCoord = createNode({
- createPort(QShaderNodePort::Output, "texCoord")
- });
- texCoord.setUuid(QUuid("{00000000-0000-0000-0000-000000000003}"));
- texCoord.addRule(openGLES2, QShaderNode::Rule("highp vec2 $texCoord = texCoord;",
- QByteArrayList() << "varying highp vec2 texCoord;"));
- texCoord.addRule(openGL3, QShaderNode::Rule("vec2 $texCoord = texCoord;",
- QByteArrayList() << "in vec2 texCoord;"));
-
- auto lightIntensity = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- lightIntensity.setUuid(QUuid("{00000000-0000-0000-0000-000000000004}"));
- lightIntensity.setParameter("name", "defaultName");
- lightIntensity.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(QShaderLanguage::Uniform));
- lightIntensity.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(QShaderLanguage::Float));
- lightIntensity.addRule(openGLES2, QShaderNode::Rule("highp $type $value = $name;",
- QByteArrayList() << "$qualifier highp $type $name;"));
- lightIntensity.addRule(openGL3, QShaderNode::Rule("$type $value = $name;",
- QByteArrayList() << "$qualifier $type $name;"));
-
- auto exposure = createNode({
- createPort(QShaderNodePort::Output, "exposure")
- });
- exposure.setUuid(QUuid("{00000000-0000-0000-0000-000000000005}"));
- exposure.addRule(openGLES2, QShaderNode::Rule("highp float $exposure = exposure;",
- QByteArrayList() << "uniform highp float exposure;"));
- exposure.addRule(openGL3, QShaderNode::Rule("float $exposure = exposure;",
- QByteArrayList() << "uniform float exposure;"));
-
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- fragColor.setUuid(QUuid("{00000000-0000-0000-0000-000000000006}"));
- fragColor.addRule(openGLES2, QShaderNode::Rule("gl_fragColor = $fragColor;"));
- fragColor.addRule(openGL3, QShaderNode::Rule("fragColor = $fragColor;",
- QByteArrayList() << "out vec4 fragColor;"));
-
- auto sampleTexture = createNode({
- createPort(QShaderNodePort::Input, "sampler"),
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "color")
- });
- sampleTexture.setUuid(QUuid("{00000000-0000-0000-0000-000000000007}"));
- sampleTexture.addRule(openGLES2, QShaderNode::Rule("highp vec4 $color = texture2D($sampler, $coord);"));
- sampleTexture.addRule(openGL3, QShaderNode::Rule("vec4 $color = texture2D($sampler, $coord);"));
-
- auto lightFunction = createNode({
- createPort(QShaderNodePort::Input, "baseColor"),
- createPort(QShaderNodePort::Input, "position"),
- createPort(QShaderNodePort::Input, "lightIntensity"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- lightFunction.setUuid(QUuid("{00000000-0000-0000-0000-000000000008}"));
- lightFunction.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include es2/lightmodel.frag.inc"));
- lightFunction.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include gl3/lightmodel.frag.inc"));
-
- auto exposureFunction = createNode({
- createPort(QShaderNodePort::Input, "inputColor"),
- createPort(QShaderNodePort::Input, "exposure"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- exposureFunction.setUuid(QUuid("{00000000-0000-0000-0000-000000000009}"));
- exposureFunction.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
- exposureFunction.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
-
- graph.addNode(worldPosition);
- graph.addNode(texture);
- graph.addNode(texCoord);
- graph.addNode(lightIntensity);
- graph.addNode(exposure);
- graph.addNode(fragColor);
- graph.addNode(sampleTexture);
- graph.addNode(lightFunction);
- graph.addNode(exposureFunction);
-
- graph.addEdge(createEdge(texture.uuid(), "texture", sampleTexture.uuid(), "sampler"));
- graph.addEdge(createEdge(texCoord.uuid(), "texCoord", sampleTexture.uuid(), "coord"));
-
- graph.addEdge(createEdge(worldPosition.uuid(), "value", lightFunction.uuid(), "position"));
- graph.addEdge(createEdge(sampleTexture.uuid(), "color", lightFunction.uuid(), "baseColor"));
- graph.addEdge(createEdge(lightIntensity.uuid(), "value", lightFunction.uuid(), "lightIntensity"));
-
- graph.addEdge(createEdge(lightFunction.uuid(), "outputColor", exposureFunction.uuid(), "inputColor"));
- graph.addEdge(createEdge(exposure.uuid(), "exposure", exposureFunction.uuid(), "exposure"));
-
- graph.addEdge(createEdge(exposureFunction.uuid(), "outputColor", fragColor.uuid(), "fragColor"));
-
- return graph;
- }
-
- void debugStatement(const QString &prefix, const QShaderGraph::Statement &statement)
- {
- qDebug() << prefix << statement.inputs << statement.uuid().toString() << statement.outputs;
- }
-
- void dumpStatementsIfNeeded(const QList<QShaderGraph::Statement> &statements,
- const QList<QShaderGraph::Statement> &expected)
- {
- if (statements != expected) {
- for (int i = 0; i < qMax(statements.size(), expected.size()); i++) {
- qDebug() << "----" << i << "----";
- if (i < statements.size())
- debugStatement("A:", statements.at(i));
- if (i < expected.size())
- debugStatement("E:", expected.at(i));
- qDebug() << "-----------";
- }
- }
- }
-}
-
-class tst_QShaderGraphLoader : public QObject
-{
- Q_OBJECT
-private slots:
- void shouldManipulateLoaderMembers();
- void shouldLoadFromJsonStream_data();
- void shouldLoadFromJsonStream();
-};
-
-void tst_QShaderGraphLoader::shouldManipulateLoaderMembers()
-{
- // GIVEN
- auto loader = QShaderGraphLoader();
-
- // THEN (default state)
- QCOMPARE(loader.status(), QShaderGraphLoader::Null);
- QVERIFY(!loader.device());
- QVERIFY(loader.graph().nodes().isEmpty());
- QVERIFY(loader.graph().edges().isEmpty());
- QVERIFY(loader.prototypes().isEmpty());
-
- // WHEN
- auto device1 = createBuffer(QByteArray("..........."), QIODevice::NotOpen);
- loader.setDevice(device1.data());
-
- // THEN
- QCOMPARE(loader.status(), QShaderGraphLoader::Error);
- QCOMPARE(loader.device(), device1.data());
- QVERIFY(loader.graph().nodes().isEmpty());
- QVERIFY(loader.graph().edges().isEmpty());
-
- // WHEN
- auto device2 = createBuffer(QByteArray("..........."), QIODevice::ReadOnly);
- loader.setDevice(device2.data());
-
- // THEN
- QCOMPARE(loader.status(), QShaderGraphLoader::Waiting);
- QCOMPARE(loader.device(), device2.data());
- QVERIFY(loader.graph().nodes().isEmpty());
- QVERIFY(loader.graph().edges().isEmpty());
-
-
- // WHEN
- const auto prototypes = [&]{
- auto res = QHash<QString, QShaderNode>();
- res.insert("foo", createNode({}));
- return res;
- }();
- loader.setPrototypes(prototypes);
-
- // THEN
- QCOMPARE(loader.prototypes().size(), prototypes.size());
- QVERIFY(loader.prototypes().contains("foo"));
- QCOMPARE(loader.prototypes().value("foo").uuid(), prototypes.value("foo").uuid());
-}
-
-void tst_QShaderGraphLoader::shouldLoadFromJsonStream_data()
-{
- QTest::addColumn<QBufferPointer>("device");
- QTest::addColumn<PrototypeHash>("prototypes");
- QTest::addColumn<QShaderGraph>("graph");
- QTest::addColumn<QShaderGraphLoader::Status>("status");
-
- QTest::newRow("empty") << createBuffer("", QIODevice::ReadOnly) << PrototypeHash()
- << QShaderGraph() << QShaderGraphLoader::Error;
-
- const auto smallJson = "{"
- " \"nodes\": ["
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000001}\","
- " \"type\": \"MyInput\","
- " \"layers\": [\"foo\", \"bar\"]"
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000002}\","
- " \"type\": \"MyOutput\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"type\": \"MyFunction\""
- " }"
- " ],"
- " \"edges\": ["
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000001}\","
- " \"sourcePort\": \"input\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"targetPort\": \"functionInput\","
- " \"layers\": [\"bar\", \"baz\"]"
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"sourcePort\": \"functionOutput\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000002}\","
- " \"targetPort\": \"output\""
- " }"
- " ]"
- "}";
-
- const auto smallProtos = [&]{
- auto protos = PrototypeHash();
-
- auto input = createNode({
- createPort(QShaderNodePort::Output, "input")
- });
- protos.insert("MyInput", input);
-
- auto output = createNode({
- createPort(QShaderNodePort::Input, "output")
- });
- protos.insert("MyOutput", output);
-
- auto function = createNode({
- createPort(QShaderNodePort::Input, "functionInput"),
- createPort(QShaderNodePort::Output, "functionOutput")
- });
- protos.insert("MyFunction", function);
- return protos;
- }();
-
- const auto smallGraph = [&]{
- auto graph = QShaderGraph();
-
- auto input = createNode({
- createPort(QShaderNodePort::Output, "input")
- }, {"foo", "bar"});
- input.setUuid(QUuid("{00000000-0000-0000-0000-000000000001}"));
- auto output = createNode({
- createPort(QShaderNodePort::Input, "output")
- });
- output.setUuid(QUuid("{00000000-0000-0000-0000-000000000002}"));
- auto function = createNode({
- createPort(QShaderNodePort::Input, "functionInput"),
- createPort(QShaderNodePort::Output, "functionOutput")
- });
- function.setUuid(QUuid("{00000000-0000-0000-0000-000000000003}"));
-
- graph.addNode(input);
- graph.addNode(output);
- graph.addNode(function);
- graph.addEdge(createEdge(input.uuid(), "input", function.uuid(), "functionInput", {"bar", "baz"}));
- graph.addEdge(createEdge(function.uuid(), "functionOutput", output.uuid(), "output"));
-
- return graph;
- }();
-
- QTest::newRow("TwoNodesOneEdge") << createBuffer(smallJson) << smallProtos << smallGraph << QShaderGraphLoader::Ready;
- QTest::newRow("NotOpen") << createBuffer(smallJson, QIODevice::NotOpen) << smallProtos << QShaderGraph() << QShaderGraphLoader::Error;
- QTest::newRow("NoPrototype") << createBuffer(smallJson) << PrototypeHash() << QShaderGraph() << QShaderGraphLoader::Error;
-
- const auto complexJson = "{"
- " \"nodes\": ["
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000001}\","
- " \"type\": \"inputValue\","
- " \"parameters\": {"
- " \"name\": \"worldPosition\","
- " \"qualifier\": {"
- " \"type\": \"QShaderLanguage::StorageQualifier\","
- " \"value\": \"QShaderLanguage::Input\""
- " },"
- " \"type\": {"
- " \"type\": \"QShaderLanguage::VariableType\","
- " \"value\": \"QShaderLanguage::Vec3\""
- " }"
- " }"
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000002}\","
- " \"type\": \"texture\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"type\": \"texCoord\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000004}\","
- " \"type\": \"inputValue\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000005}\","
- " \"type\": \"exposure\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000006}\","
- " \"type\": \"fragColor\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000007}\","
- " \"type\": \"sampleTexture\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"type\": \"lightModel\""
- " },"
- " {"
- " \"uuid\": \"{00000000-0000-0000-0000-000000000009}\","
- " \"type\": \"exposureFunction\""
- " }"
- " ],"
- " \"edges\": ["
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000002}\","
- " \"sourcePort\": \"texture\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000007}\","
- " \"targetPort\": \"sampler\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000003}\","
- " \"sourcePort\": \"texCoord\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000007}\","
- " \"targetPort\": \"coord\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000001}\","
- " \"sourcePort\": \"value\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"targetPort\": \"position\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000007}\","
- " \"sourcePort\": \"color\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"targetPort\": \"baseColor\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000004}\","
- " \"sourcePort\": \"value\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"targetPort\": \"lightIntensity\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000008}\","
- " \"sourcePort\": \"outputColor\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000009}\","
- " \"targetPort\": \"inputColor\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000005}\","
- " \"sourcePort\": \"exposure\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000009}\","
- " \"targetPort\": \"exposure\""
- " },"
- " {"
- " \"sourceUuid\": \"{00000000-0000-0000-0000-000000000009}\","
- " \"sourcePort\": \"outputColor\","
- " \"targetUuid\": \"{00000000-0000-0000-0000-000000000006}\","
- " \"targetPort\": \"fragColor\""
- " }"
- " ]"
- "}";
-
- const auto complexProtos = [&]{
- const auto openGLES2 = createFormat(QShaderFormat::OpenGLES, 2, 0);
- const auto openGL3 = createFormat(QShaderFormat::OpenGLCoreProfile, 3, 0);
-
- auto protos = PrototypeHash();
-
- auto inputValue = createNode({
- createPort(QShaderNodePort::Output, "value")
- });
- inputValue.setParameter("name", "defaultName");
- inputValue.setParameter("qualifier", QVariant::fromValue<QShaderLanguage::StorageQualifier>(QShaderLanguage::Uniform));
- inputValue.setParameter("type", QVariant::fromValue<QShaderLanguage::VariableType>(QShaderLanguage::Float));
- inputValue.addRule(openGLES2, QShaderNode::Rule("highp $type $value = $name;",
- QByteArrayList() << "$qualifier highp $type $name;"));
- inputValue.addRule(openGL3, QShaderNode::Rule("$type $value = $name;",
- QByteArrayList() << "$qualifier $type $name;"));
- protos.insert("inputValue", inputValue);
-
- auto texture = createNode({
- createPort(QShaderNodePort::Output, "texture")
- });
- texture.addRule(openGLES2, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
- texture.addRule(openGL3, QShaderNode::Rule("sampler2D $texture = texture;",
- QByteArrayList() << "uniform sampler2D texture;"));
- protos.insert("texture", texture);
-
- auto texCoord = createNode({
- createPort(QShaderNodePort::Output, "texCoord")
- });
- texCoord.addRule(openGLES2, QShaderNode::Rule("highp vec2 $texCoord = texCoord;",
- QByteArrayList() << "varying highp vec2 texCoord;"));
- texCoord.addRule(openGL3, QShaderNode::Rule("vec2 $texCoord = texCoord;",
- QByteArrayList() << "in vec2 texCoord;"));
- protos.insert("texCoord", texCoord);
-
- auto exposure = createNode({
- createPort(QShaderNodePort::Output, "exposure")
- });
- exposure.addRule(openGLES2, QShaderNode::Rule("highp float $exposure = exposure;",
- QByteArrayList() << "uniform highp float exposure;"));
- exposure.addRule(openGL3, QShaderNode::Rule("float $exposure = exposure;",
- QByteArrayList() << "uniform float exposure;"));
- protos.insert("exposure", exposure);
-
- auto fragColor = createNode({
- createPort(QShaderNodePort::Input, "fragColor")
- });
- fragColor.addRule(openGLES2, QShaderNode::Rule("gl_fragColor = $fragColor;"));
- fragColor.addRule(openGL3, QShaderNode::Rule("fragColor = $fragColor;",
- QByteArrayList() << "out vec4 fragColor;"));
- protos.insert("fragColor", fragColor);
-
- auto sampleTexture = createNode({
- createPort(QShaderNodePort::Input, "sampler"),
- createPort(QShaderNodePort::Input, "coord"),
- createPort(QShaderNodePort::Output, "color")
- });
- sampleTexture.addRule(openGLES2, QShaderNode::Rule("highp vec4 $color = texture2D($sampler, $coord);"));
- sampleTexture.addRule(openGL3, QShaderNode::Rule("vec4 $color = texture2D($sampler, $coord);"));
- protos.insert("sampleTexture", sampleTexture);
-
- auto lightModel = createNode({
- createPort(QShaderNodePort::Input, "baseColor"),
- createPort(QShaderNodePort::Input, "position"),
- createPort(QShaderNodePort::Input, "lightIntensity"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- lightModel.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include es2/lightmodel.frag.inc"));
- lightModel.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = lightModel($baseColor, $position, $lightIntensity);",
- QByteArrayList() << "#pragma include gl3/lightmodel.frag.inc"));
- protos.insert("lightModel", lightModel);
-
- auto exposureFunction = createNode({
- createPort(QShaderNodePort::Input, "inputColor"),
- createPort(QShaderNodePort::Input, "exposure"),
- createPort(QShaderNodePort::Output, "outputColor")
- });
- exposureFunction.addRule(openGLES2, QShaderNode::Rule("highp vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
- exposureFunction.addRule(openGL3, QShaderNode::Rule("vec4 $outputColor = $inputColor * pow(2.0, $exposure);"));
- protos.insert("exposureFunction", exposureFunction);
-
- return protos;
- }();
-
- const auto complexGraph = createGraph();
-
- QTest::newRow("ComplexGraph") << createBuffer(complexJson) << complexProtos << complexGraph << QShaderGraphLoader::Ready;
-}
-
-void tst_QShaderGraphLoader::shouldLoadFromJsonStream()
-{
- // GIVEN
- QFETCH(QBufferPointer, device);
- QFETCH(PrototypeHash, prototypes);
-
- auto loader = QShaderGraphLoader();
-
- // WHEN
- loader.setPrototypes(prototypes);
- loader.setDevice(device.data());
- loader.load();
-
- // THEN
- QFETCH(QShaderGraphLoader::Status, status);
- QCOMPARE(loader.status(), status);
-
- QFETCH(QShaderGraph, graph);
- const auto statements = loader.graph().createStatements({"foo", "bar", "baz"});
- const auto expected = graph.createStatements({"foo", "bar", "baz"});
- dumpStatementsIfNeeded(statements, expected);
- QCOMPARE(statements, expected);
-
- const auto sortedParameters = [](const QShaderNode &node) {
- auto res = node.parameterNames();
- res.sort();
- return res;
- };
-
- for (int i = 0; i < statements.size(); i++) {
- const auto actualNode = statements.at(i).node;
- const auto expectedNode = expected.at(i).node;
-
- QCOMPARE(actualNode.layers(), expectedNode.layers());
- QCOMPARE(actualNode.ports(), expectedNode.ports());
- QCOMPARE(sortedParameters(actualNode), sortedParameters(expectedNode));
- for (const auto &name : expectedNode.parameterNames()) {
- QCOMPARE(actualNode.parameter(name), expectedNode.parameter(name));
- }
- QCOMPARE(actualNode.availableFormats(), expectedNode.availableFormats());
- for (const auto &format : expectedNode.availableFormats()) {
- QCOMPARE(actualNode.rule(format), expectedNode.rule(format));
- }
- }
-}
-
-QTEST_MAIN(tst_QShaderGraphLoader)
-
-#include "tst_qshadergraphloader.moc"