Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/depsgraph/intern/builder/deg_builder_remove_noop.cc')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_remove_noop.cc76
1 files changed, 76 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_remove_noop.cc b/source/blender/depsgraph/intern/builder/deg_builder_remove_noop.cc
new file mode 100644
index 00000000000..33de20133db
--- /dev/null
+++ b/source/blender/depsgraph/intern/builder/deg_builder_remove_noop.cc
@@ -0,0 +1,76 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2020 Blender Foundation.
+ * All rights reserved.
+ */
+
+/** \file
+ * \ingroup depsgraph
+ */
+
+#include "intern/builder/deg_builder_remove_noop.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "intern/node/deg_node.h"
+#include "intern/node/deg_node_operation.h"
+
+#include "intern/depsgraph.h"
+#include "intern/depsgraph_type.h"
+#include "intern/depsgraph_relation.h"
+#include "intern/debug/deg_debug.h"
+
+namespace DEG {
+
+void deg_graph_remove_unused_noops(Depsgraph *graph)
+{
+ int num_removed_relations = 0;
+ deque<OperationNode *> queue;
+
+ for (OperationNode *node : graph->operations) {
+ if (node->is_noop() && node->outlinks.empty()) {
+ queue.push_back(node);
+ }
+ }
+
+ while (!queue.empty()) {
+ OperationNode *to_remove = queue.front();
+ queue.pop_front();
+
+ while (!to_remove->inlinks.empty()) {
+ Relation *rel_in = to_remove->inlinks[0];
+ Node *dependency = rel_in->from;
+
+ /* Remove the relation. */
+ rel_in->unlink();
+ OBJECT_GUARDED_DELETE(rel_in, Relation);
+ num_removed_relations++;
+
+ /* Queue parent no-op node that has now become unused. */
+ OperationNode *operation = dependency->get_exit_operation();
+ if (operation != nullptr && operation->is_noop() && operation->outlinks.empty()) {
+ queue.push_back(operation);
+ }
+ }
+
+ /* TODO(Sybren): Remove the node itself. */
+ }
+
+ DEG_DEBUG_PRINTF(
+ (::Depsgraph *)graph, BUILD, "Removed %d relations to no-op nodes\n", num_removed_relations);
+}
+
+} // namespace DEG