diff options
author | Kevin Ottens <kevin.ottens@kdab.com> | 2017-04-03 17:27:52 +0200 |
---|---|---|
committer | Kevin Ottens <kevin.ottens@kdab.com> | 2017-06-20 21:35:40 +0000 |
commit | ad2faa3c6378a6270e120137ec4eb0449b0d5690 (patch) | |
tree | 062a7761bfe69fe6ece57e688972bec6d11955f9 /src/gui/util | |
parent | 42124518844034f786ac1c434dd54c0a300b0999 (diff) |
[Shader Graph Gen.] Introduce QShaderGenerator
This class is meant to generate code from shader graphs
Change-Id: I1cf22352387f3f9f55e7589aa77a296689836911
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/gui/util')
-rw-r--r-- | src/gui/util/qshadergenerator.cpp | 104 | ||||
-rw-r--r-- | src/gui/util/qshadergenerator_p.h | 75 | ||||
-rw-r--r-- | src/gui/util/util.pri | 2 |
3 files changed, 181 insertions, 0 deletions
diff --git a/src/gui/util/qshadergenerator.cpp b/src/gui/util/qshadergenerator.cpp new file mode 100644 index 0000000000..5d6a05e2a0 --- /dev/null +++ b/src/gui/util/qshadergenerator.cpp @@ -0,0 +1,104 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** 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-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qshadergenerator_p.h" + +QT_BEGIN_NAMESPACE + +QByteArray QShaderGenerator::createShaderCode() const +{ + auto code = QByteArrayList(); + + if (format.isValid()) { + const auto isGLES = format.api() == QShaderFormat::OpenGLES; + const auto major = format.version().majorVersion(); + const auto minor = format.version().minorVersion(); + + const auto version = major == 2 && isGLES ? 100 + : major == 3 && isGLES ? 300 + : major == 2 ? 100 + 10 * (minor + 1) + : major == 3 && minor <= 2 ? 100 + 10 * (minor + 3) + : major * 100 + minor * 10; + + const auto profile = isGLES ? QByteArrayLiteral(" es") + : version >= 150 && format.api() == QShaderFormat::OpenGLCoreProfile ? QByteArrayLiteral(" core") + : version >= 150 && format.api() == QShaderFormat::OpenGLCompatibilityProfile ? QByteArrayLiteral(" compatibility") + : QByteArray(); + + code << (QByteArrayLiteral("#version ") + QByteArray::number(version) + profile); + code << QByteArray(); + } + + for (const auto &node : graph.nodes()) { + for (const auto &snippet : node.rule(format).headerSnippets) { + code << snippet; + } + } + + code << QByteArray(); + code << QByteArrayLiteral("void main()"); + code << QByteArrayLiteral("{"); + + for (const auto &statement : graph.createStatements()) { + const auto node = statement.node; + auto line = node.rule(format).substitution; + for (const auto &port : node.ports()) { + const auto portName = port.name; + const auto portDirection = port.direction; + const auto isInput = port.direction == QShaderNodePort::Input; + + const auto portIndex = statement.portIndex(portDirection, portName); + const auto variableIndex = isInput ? statement.inputs.at(portIndex) + : statement.outputs.at(portIndex); + if (variableIndex < 0) + continue; + + const auto placeholder = QByteArray(QByteArrayLiteral("$") + portName.toUtf8()); + const auto variable = QByteArray(QByteArrayLiteral("v") + QByteArray::number(variableIndex)); + line.replace(placeholder, variable); + } + code << QByteArrayLiteral(" ") + line; + } + + code << QByteArrayLiteral("}"); + code << QByteArray(); + return code.join('\n'); +} + +QT_END_NAMESPACE diff --git a/src/gui/util/qshadergenerator_p.h b/src/gui/util/qshadergenerator_p.h new file mode 100644 index 0000000000..392c3532df --- /dev/null +++ b/src/gui/util/qshadergenerator_p.h @@ -0,0 +1,75 @@ +/**************************************************************************** +** +** Copyright (C) 2017 Klaralvdalens Datakonsult AB (KDAB). +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the QtGui module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** 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 Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 3 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL3 included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 3 requirements +** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 2.0 or (at your option) the GNU General +** Public license version 3 or any later version approved by the KDE Free +** Qt Foundation. The licenses are as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 +** 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-2.0.html and +** https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QSHADERGENERATOR_P_H +#define QSHADERGENERATOR_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the Qt API. It exists purely as an +// implementation detail. This header file may change from version to +// version without notice, or even be removed. +// +// We mean it. +// + +#include <QtGui/private/qtguiglobal_p.h> + +#include <QtGui/private/qshadergraph_p.h> + +QT_BEGIN_NAMESPACE + +class QShaderGenerator +{ +public: + Q_GUI_EXPORT QByteArray createShaderCode() const; + + QShaderGraph graph; + QShaderFormat format; +}; + +Q_DECLARE_TYPEINFO(QShaderGenerator, Q_MOVABLE_TYPE); + +QT_END_NAMESPACE + +Q_DECLARE_METATYPE(QShaderGenerator) + +#endif // QSHADERGENERATOR_P_H diff --git a/src/gui/util/util.pri b/src/gui/util/util.pri index 96b25df4f9..e7feda9a4a 100644 --- a/src/gui/util/util.pri +++ b/src/gui/util/util.pri @@ -8,6 +8,7 @@ HEADERS += \ util/qabstractlayoutstyleinfo_p.h \ util/qlayoutpolicy_p.h \ util/qshaderformat_p.h \ + util/qshadergenerator_p.h \ util/qshadergraph_p.h \ util/qshadernode_p.h \ util/qshadernodeport_p.h @@ -19,6 +20,7 @@ SOURCES += \ util/qabstractlayoutstyleinfo.cpp \ util/qlayoutpolicy.cpp \ util/qshaderformat.cpp \ + util/qshadergenerator.cpp \ util/qshadergraph.cpp \ util/qshadernode.cpp \ util/qshadernodeport.cpp |