[Bf-blender-cvs] [6aa7a269ae7] functions: remove nodes after constant folding
Jacques Lucke
noreply at git.blender.org
Sat Jan 18 20:17:25 CET 2020
Commit: 6aa7a269ae75a932aa59b4fe038ecee632ad0731
Author: Jacques Lucke
Date: Sat Jan 11 13:21:18 2020 +0100
Branches: functions
https://developer.blender.org/rB6aa7a269ae75a932aa59b4fe038ecee632ad0731
remove nodes after constant folding
===================================================================
M source/blender/functions/FN_multi_function_network.h
M source/blender/functions/intern/multi_function_network.cc
M source/blender/functions/intern/multi_function_network_optimization.cc
===================================================================
diff --git a/source/blender/functions/FN_multi_function_network.h b/source/blender/functions/FN_multi_function_network.h
index 5ca9112a7de..7955542db69 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -149,6 +149,7 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
ArrayRef<StringRef> output_names);
void add_link(MFBuilderOutputSocket &from, MFBuilderInputSocket &to);
void remove_link(MFBuilderOutputSocket &from, MFBuilderInputSocket &to);
+ void remove_node(MFBuilderNode &node);
uint current_index_of(MFBuilderFunctionNode &node) const
{
diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc
index 9afda57bd30..21de6073fe7 100644
--- a/source/blender/functions/intern/multi_function_network.cc
+++ b/source/blender/functions/intern/multi_function_network.cc
@@ -152,6 +152,33 @@ void MFNetworkBuilder::remove_link(MFBuilderOutputSocket &from, MFBuilderInputSo
to.m_origin = nullptr;
}
+void MFNetworkBuilder::remove_node(MFBuilderNode &node)
+{
+ for (MFBuilderInputSocket *input_socket : node.inputs()) {
+ MFBuilderOutputSocket *origin = input_socket->origin();
+ if (origin != nullptr) {
+ origin->m_targets.remove_first_occurrence_and_reorder(input_socket);
+ }
+ input_socket->~MFBuilderInputSocket();
+ }
+ for (MFBuilderOutputSocket *output_socket : node.outputs()) {
+ for (MFBuilderInputSocket *target : output_socket->targets()) {
+ target->m_origin = nullptr;
+ }
+ output_socket->~MFBuilderOutputSocket();
+ }
+ if (node.is_dummy()) {
+ MFBuilderDummyNode &dummy_node = node.as_dummy();
+ m_dummy_nodes.remove(&dummy_node);
+ dummy_node.~MFBuilderDummyNode();
+ }
+ else {
+ MFBuilderFunctionNode &function_node = node.as_function();
+ m_function_nodes.remove(&function_node);
+ function_node.~MFBuilderFunctionNode();
+ }
+}
+
std::string MFNetworkBuilder::to_dot(const Set<MFBuilderNode *> &marked_nodes)
{
using BLI::DotExport::Utils::NodeWithSocketsWrapper;
diff --git a/source/blender/functions/intern/multi_function_network_optimization.cc b/source/blender/functions/intern/multi_function_network_optimization.cc
index 52013fd8d6f..13334b82d4f 100644
--- a/source/blender/functions/intern/multi_function_network_optimization.cc
+++ b/source/blender/functions/intern/multi_function_network_optimization.cc
@@ -173,6 +173,34 @@ void optimize_network__constant_folding(MFNetworkBuilder &network_builder,
}
}
+ Vector<MFBuilderFunctionNode *> inner_constant_nodes;
+ Vector<MFBuilderFunctionNode *> left_most_constant_nodes;
+
+ for (MFBuilderFunctionNode *constant_node : constant_nodes) {
+ if (constant_node->inputs().size() > 0) {
+ inner_constant_nodes.append(constant_node);
+ }
+ else {
+ left_most_constant_nodes.append(constant_node);
+ }
+ }
+ for (MFBuilderFunctionNode *node : inner_constant_nodes) {
+ network_builder.remove_node(*node);
+ }
+ for (MFBuilderFunctionNode *node : left_most_constant_nodes) {
+ uint target_amount = 0;
+ for (MFBuilderOutputSocket *output_socket : node->outputs()) {
+ target_amount += output_socket->targets().size();
+ }
+ if (target_amount == 0) {
+ network_builder.remove_node(*node);
+ }
+ }
+
+ for (MFBuilderDummyNode *dummy_node : dummy_nodes_to_compute) {
+ network_builder.remove_node(*dummy_node);
+ }
+
network_builder.to_dot__clipboard();
}
More information about the Bf-blender-cvs
mailing list