summaryrefslogtreecommitdiffstats
path: root/src/render/shadergraph/qshadergraph.cpp
diff options
context:
space:
mode:
authorNicolas Guichard <nicolas.guichard@kdab.com>2020-04-24 14:11:17 +0200
committerNicolas Guichard <nicolas.guichard@kdab.com>2020-04-27 09:36:50 +0200
commit5e16aa067ac6a8b5f031ffcefc356777a0da34ad (patch)
treecdde252171520a8f11452cf05d78b8f45b9c8e5a /src/render/shadergraph/qshadergraph.cpp
parent36ef85341aacd225839d58880d3f388f31e3100c (diff)
QShaderGraph: disable edges connected to disabled nodesv5.15.0-rc2v5.15.0-rc1v5.15.0
This graph failed to generate statements with enabledLayers = {"0"}: _edge0i__ function0 __edge0o__ / \ input output \_edge1i__ function1 __edge1o__/ with function0 and edge0o on layer "0" only and function1 and edge1o on layer "1" only and all other nodes and edges on all layers. The issue was that when only layer "0" is enabled, edge1i didn't get properly discarded and Kahn's algorithm didn't ever schedule input. Task-number: QTBUG-83766 Change-Id: Idb8705d487c3748153e0c4b3330b9589e827139e Reviewed-by: Paul Lemire <paul.lemire@kdab.com>
Diffstat (limited to 'src/render/shadergraph/qshadergraph.cpp')
-rw-r--r--src/render/shadergraph/qshadergraph.cpp22
1 files changed, 12 insertions, 10 deletions
diff --git a/src/render/shadergraph/qshadergraph.cpp b/src/render/shadergraph/qshadergraph.cpp
index c2f3c343e..285aff116 100644
--- a/src/render/shadergraph/qshadergraph.cpp
+++ b/src/render/shadergraph/qshadergraph.cpp
@@ -242,16 +242,6 @@ QVector<QShaderGraph::Statement> QShaderGraph::createStatements(const QStringLis
return res;
}();
- const QVector<Edge> enabledEdges = [this, intersectsEnabledLayers] {
- auto res = QVector<Edge>();
- std::copy_if(m_edges.cbegin(), m_edges.cend(),
- std::back_inserter(res),
- [intersectsEnabledLayers] (const Edge &edge) {
- return intersectsEnabledLayers(edge.layers);
- });
- return res;
- }();
-
const QHash<QUuid, Statement> idHash = [enabledNodes] {
auto nextVarId = 0;
auto res = QHash<QUuid, Statement>();
@@ -260,6 +250,18 @@ QVector<QShaderGraph::Statement> QShaderGraph::createStatements(const QStringLis
return res;
}();
+ const QVector<Edge> enabledEdges = [this, intersectsEnabledLayers, &idHash] {
+ auto res = QVector<Edge>();
+ std::copy_if(m_edges.cbegin(), m_edges.cend(),
+ std::back_inserter(res),
+ [intersectsEnabledLayers, &idHash] (const Edge &edge) {
+ return intersectsEnabledLayers(edge.layers)
+ && idHash.contains(edge.sourceNodeUuid)
+ && idHash.contains(edge.targetNodeUuid);
+ });
+ return res;
+ }();
+
auto result = QVector<Statement>();
QVector<Edge> currentEdges = enabledEdges;
QVector<QUuid> currentUuids = [enabledNodes, enabledEdges] {