[Bf-blender-cvs] [7dad14ae793] functions: simplify constant folding

Jacques Lucke noreply at git.blender.org
Sat Jan 18 20:17:55 CET 2020


Commit: 7dad14ae793b9895999f7a67a3b567b7fe7e7a0d
Author: Jacques Lucke
Date:   Sat Jan 18 18:20:16 2020 +0100
Branches: functions
https://developer.blender.org/rB7dad14ae793b9895999f7a67a3b567b7fe7e7a0d

simplify 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 535b25de322..2ab363cceda 100644
--- a/source/blender/functions/FN_multi_function_network.h
+++ b/source/blender/functions/FN_multi_function_network.h
@@ -167,6 +167,8 @@ class MFNetworkBuilder : BLI::NonCopyable, BLI::NonMovable {
   Vector<MFBuilderNode *> find_nodes_not_to_the_left_of__exclusive__vector(
       ArrayRef<MFBuilderNode *> nodes);
 
+  Vector<MFBuilderNode *> nodes_by_id_inverted_id_mask(ArrayRef<bool> id_mask);
+
   uint current_index_of(MFBuilderFunctionNode &node) const
   {
     return m_function_nodes.index(&node);
diff --git a/source/blender/functions/intern/multi_function_network.cc b/source/blender/functions/intern/multi_function_network.cc
index f5bd1aceb7f..90fba815835 100644
--- a/source/blender/functions/intern/multi_function_network.cc
+++ b/source/blender/functions/intern/multi_function_network.cc
@@ -268,21 +268,25 @@ Array<bool> MFNetworkBuilder::find_nodes_to_the_left_of__inclusive__mask(
   return is_to_the_left;
 }
 
-Vector<MFBuilderNode *> MFNetworkBuilder::find_nodes_not_to_the_left_of__exclusive__vector(
-    ArrayRef<MFBuilderNode *> nodes)
+Vector<MFBuilderNode *> MFNetworkBuilder::nodes_by_id_inverted_id_mask(ArrayRef<bool> id_mask)
 {
-  Array<bool> is_to_the_left = this->find_nodes_to_the_left_of__inclusive__mask(nodes);
-
-  Vector<MFBuilderNode *> result;
-  for (uint id : is_to_the_left.index_range()) {
+  Vector<MFBuilderNode *> nodes;
+  for (uint id : id_mask.index_range()) {
     if (this->node_id_is_valid(id)) {
-      if (!is_to_the_left[id]) {
+      if (!id_mask[id]) {
         MFBuilderNode &node = this->node_by_id(id);
-        result.append(&node);
+        nodes.append(&node);
       }
     }
   }
+  return nodes;
+}
 
+Vector<MFBuilderNode *> MFNetworkBuilder::find_nodes_not_to_the_left_of__exclusive__vector(
+    ArrayRef<MFBuilderNode *> nodes)
+{
+  Array<bool> is_to_the_left = this->find_nodes_to_the_left_of__inclusive__mask(nodes);
+  Vector<MFBuilderNode *> result = this->nodes_by_id_inverted_id_mask(is_to_the_left);
   return result;
 }
 
@@ -311,7 +315,7 @@ std::string MFNetworkBuilder::to_dot(const Set<MFBuilderNode *> &marked_nodes)
     }
 
     if (node->is_dummy()) {
-      dot_node.set_background_color("#EEEEFF");
+      dot_node.set_background_color("#DDDDFF");
     }
     if (marked_nodes.contains(node)) {
       dot_node.set_background_color("#99EE99");
diff --git a/source/blender/functions/intern/multi_function_network_optimization.cc b/source/blender/functions/intern/multi_function_network_optimization.cc
index 70e1de464d3..c7a97f8eea8 100644
--- a/source/blender/functions/intern/multi_function_network_optimization.cc
+++ b/source/blender/functions/intern/multi_function_network_optimization.cc
@@ -19,60 +19,22 @@ void optimize_network__remove_unused_nodes(MFNetworkBuilder &network_builder)
 void optimize_network__constant_folding(MFNetworkBuilder &network_builder,
                                         ResourceCollector &resources)
 {
-  Array<bool> function_node_is_constant(network_builder.function_nodes().size(), true);
-
-  Stack<MFBuilderNode *> nodes_to_check;
-  nodes_to_check.push_multiple(network_builder.dummy_nodes());
-  nodes_to_check.push_multiple(network_builder.function_nodes());
-
-  while (!nodes_to_check.is_empty()) {
-    MFBuilderNode &current_node = *nodes_to_check.pop();
-
-    bool is_const = true;
-    if (current_node.is_dummy()) {
-      is_const = false;
-    }
-    else {
-      MFBuilderFunctionNode &function_node = current_node.as_function();
-      uint function_node_index = network_builder.current_index_of(function_node);
-      if (!function_node_is_constant[function_node_index]) {
-        is_const = false;
-      }
-      else {
-        const MultiFunction &fn = function_node.function();
-        if (fn.depends_on_context()) {
-          is_const = false;
-          function_node_is_constant[function_node_index] = false;
-        }
-      }
-    }
-
-    if (!is_const) {
-      current_node.foreach_target_socket([&](MFBuilderInputSocket &target_socket) {
-        MFBuilderNode &target_node = target_socket.node();
-        if (target_node.is_function()) {
-          bool &target_is_const = function_node_is_constant[network_builder.current_index_of(
-              target_node.as_function())];
-          if (target_is_const) {
-            target_is_const = false;
-            nodes_to_check.push(&target_node);
-          }
-        }
-      });
+  Vector<MFBuilderNode *> non_constant_nodes;
+  non_constant_nodes.extend(network_builder.dummy_nodes());
+  for (MFBuilderFunctionNode *node : network_builder.function_nodes()) {
+    if (node->function().depends_on_context()) {
+      non_constant_nodes.append(node);
     }
   }
 
-  Set<MFBuilderFunctionNode *> constant_nodes;
-  for (uint i : function_node_is_constant.index_range()) {
-    if (function_node_is_constant[i]) {
-      constant_nodes.add_new(network_builder.function_nodes()[i]);
-    }
-  }
-  // network_builder.to_dot__clipboard(*(Set<MFBuilderNode *> *)&constant_nodes);
+  Array<bool> node_is_not_constant = network_builder.find_nodes_to_the_right_of__inclusive__mask(
+      non_constant_nodes);
+  Vector<MFBuilderNode *> constant_builder_nodes = network_builder.nodes_by_id_inverted_id_mask(
+      node_is_not_constant);
+  // network_builder.to_dot__clipboard(constant_builder_nodes.as_ref());
 
-  Vector<MFBuilderOutputSocket *> builder_sockets_to_compute;
   Vector<MFBuilderDummyNode *> dummy_nodes_to_compute;
-  for (MFBuilderNode *node : constant_nodes) {
+  for (MFBuilderNode *node : constant_builder_nodes) {
     if (node->inputs().size() == 0) {
       continue;
     }
@@ -82,21 +44,15 @@ void optimize_network__constant_folding(MFNetworkBuilder &network_builder,
 
       for (MFBuilderInputSocket *target_socket : output_socket->targets()) {
         MFBuilderNode &target_node = target_socket->node();
-        if (target_node.is_dummy()) {
+        if (!node_is_not_constant[target_node.id()]) {
           continue;
         }
 
-        MFBuilderFunctionNode &target_function_node = target_node.as_function();
-        uint target_node_index = network_builder.current_index_of(target_function_node);
-
-        if (!function_node_is_constant[target_node_index]) {
-          MFBuilderDummyNode &dummy_node = network_builder.add_dummy(
-              "Dummy", {data_type}, {}, {"Value"}, {});
-          network_builder.add_link(*output_socket, dummy_node.input(0));
-          dummy_nodes_to_compute.append(&dummy_node);
-          builder_sockets_to_compute.append(output_socket);
-          break;
-        }
+        MFBuilderDummyNode &dummy_node = network_builder.add_dummy(
+            "Dummy", {data_type}, {}, {"Value"}, {});
+        network_builder.add_link(*output_socket, dummy_node.input(0));
+        dummy_nodes_to_compute.append(&dummy_node);
+        break;
       }
     }
   }
@@ -172,27 +128,15 @@ void optimize_network__constant_folding(MFNetworkBuilder &network_builder,
 
     MFBuilderFunctionNode &folded_node = network_builder.add_function(*constant_fn);
 
-    MFBuilderOutputSocket &original_socket = *builder_sockets_to_compute[param_index];
-    Vector<MFBuilderInputSocket *> targets = original_socket.targets();
+    MFBuilderOutputSocket &original_socket =
+        *dummy_nodes_to_compute[param_index]->input(0).origin();
 
-    for (MFBuilderInputSocket *target : targets) {
+    for (MFBuilderInputSocket *target : original_socket.targets()) {
       network_builder.remove_link(original_socket, *target);
       network_builder.add_link(folded_node.output(0), *target);
     }
   }
 
-  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 (MFBuilderDummyNode *dummy_node : dummy_nodes_to_compute) {
     network_builder.remove_node(*dummy_node);
   }



More information about the Bf-blender-cvs mailing list