Changeset View
Changeset View
Standalone View
Standalone View
source/blender/depsgraph/intern/builder/deg_builder_remove_noop.cc
| Show All 29 Lines | |||||
| #include "intern/depsgraph.h" | #include "intern/depsgraph.h" | ||||
| #include "intern/depsgraph_type.h" | #include "intern/depsgraph_type.h" | ||||
| #include "intern/depsgraph_relation.h" | #include "intern/depsgraph_relation.h" | ||||
| #include "intern/debug/deg_debug.h" | #include "intern/debug/deg_debug.h" | ||||
| namespace DEG { | namespace DEG { | ||||
| static inline bool is_unused_noop(OperationNode *op_node) | |||||
| { | |||||
| if (op_node == nullptr) { | |||||
| return false; | |||||
| } | |||||
| if (op_node->flag & OperationFlag::DEPSOP_FLAG_PINNED) { | |||||
| return false; | |||||
| } | |||||
| return op_node->is_noop() && op_node->outlinks.empty(); | |||||
| } | |||||
| void deg_graph_remove_unused_noops(Depsgraph *graph) | void deg_graph_remove_unused_noops(Depsgraph *graph) | ||||
| { | { | ||||
| int num_removed_relations = 0; | int num_removed_relations = 0; | ||||
| deque<OperationNode *> queue; | deque<OperationNode *> queue; | ||||
| for (OperationNode *node : graph->operations) { | for (OperationNode *node : graph->operations) { | ||||
| if (node->is_noop() && node->outlinks.empty()) { | if (is_unused_noop(node)) { | ||||
| queue.push_back(node); | queue.push_back(node); | ||||
| } | } | ||||
| } | } | ||||
| while (!queue.empty()) { | while (!queue.empty()) { | ||||
| OperationNode *to_remove = queue.front(); | OperationNode *to_remove = queue.front(); | ||||
| queue.pop_front(); | queue.pop_front(); | ||||
| while (!to_remove->inlinks.empty()) { | while (!to_remove->inlinks.empty()) { | ||||
| Relation *rel_in = to_remove->inlinks[0]; | Relation *rel_in = to_remove->inlinks[0]; | ||||
| Node *dependency = rel_in->from; | Node *dependency = rel_in->from; | ||||
| /* Remove the relation. */ | /* Remove the relation. */ | ||||
| rel_in->unlink(); | rel_in->unlink(); | ||||
| OBJECT_GUARDED_DELETE(rel_in, Relation); | OBJECT_GUARDED_DELETE(rel_in, Relation); | ||||
| num_removed_relations++; | num_removed_relations++; | ||||
| /* Queue parent no-op node that has now become unused. */ | /* Queue parent no-op node that has now become unused. */ | ||||
| OperationNode *operation = dependency->get_exit_operation(); | OperationNode *operation = dependency->get_exit_operation(); | ||||
| if (operation != nullptr && operation->is_noop() && operation->outlinks.empty()) { | if (is_unused_noop(operation)) { | ||||
| queue.push_back(operation); | queue.push_back(operation); | ||||
| } | } | ||||
| } | } | ||||
| /* TODO(Sybren): Remove the node itself. */ | /* TODO(Sybren): Remove the node itself. */ | ||||
| } | } | ||||
| DEG_DEBUG_PRINTF( | DEG_DEBUG_PRINTF( | ||||
| (::Depsgraph *)graph, BUILD, "Removed %d relations to no-op nodes\n", num_removed_relations); | (::Depsgraph *)graph, BUILD, "Removed %d relations to no-op nodes\n", num_removed_relations); | ||||
| } | } | ||||
| } // namespace DEG | } // namespace DEG | ||||