diff options
author | Nicolas Guichard <nicolas.guichard@kdab.com> | 2020-04-24 14:11:17 +0200 |
---|---|---|
committer | Nicolas Guichard <nicolas.guichard@kdab.com> | 2020-04-27 09:36:50 +0200 |
commit | 5e16aa067ac6a8b5f031ffcefc356777a0da34ad (patch) | |
tree | cdde252171520a8f11452cf05d78b8f45b9c8e5a /src/render/shadergraph | |
parent | 36ef85341aacd225839d58880d3f388f31e3100c (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')
-rw-r--r-- | src/render/shadergraph/qshadergraph.cpp | 22 |
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] { |