[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