[Bf-blender-cvs] [039a1134cd7] functions: cleanup data copying in network evaluation

Jacques Lucke noreply at git.blender.org
Fri Dec 6 13:02:20 CET 2019


Commit: 039a1134cd77450c1dc9ccb764ccd1edf8ef3b3c
Author: Jacques Lucke
Date:   Fri Dec 6 12:39:03 2019 +0100
Branches: functions
https://developer.blender.org/rB039a1134cd77450c1dc9ccb764ccd1edf8ef3b3c

cleanup data copying in network evaluation

===================================================================

M	source/blender/functions/intern/multi_functions/network.cc
M	source/blender/functions/intern/multi_functions/network.h

===================================================================

diff --git a/source/blender/functions/intern/multi_functions/network.cc b/source/blender/functions/intern/multi_functions/network.cc
index 41e02e51b3d..97684d25122 100644
--- a/source/blender/functions/intern/multi_functions/network.cc
+++ b/source/blender/functions/intern/multi_functions/network.cc
@@ -9,13 +9,12 @@ void MF_EvaluateNetwork::call(MFMask mask, MFParams params, MFContext context) c
   }
 
   Storage storage(mask);
-  this->copy_inputs_to_storage(mask, params, storage);
-  this->evaluate_network_to_compute_outputs(mask, context, storage);
-  this->copy_computed_values_to_outputs(mask, params, storage);
+  this->copy_inputs_to_storage(params, storage);
+  this->evaluate_network_to_compute_outputs(context, storage);
+  this->copy_computed_values_to_outputs(params, storage);
 }
 
-BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFMask mask,
-                                                             MFParams params,
+BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFParams params,
                                                              Storage &storage) const
 {
   for (uint input_index : m_inputs.index_iterator()) {
@@ -32,11 +31,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFMask mask,
               storage.set_virtual_list_for_input(*target, input_list);
             }
             else if (param_type.is_mutable_single()) {
-              GenericMutableArrayRef array = storage.allocate_array(
-                  param_type.data_type().single__cpp_type());
-              for (uint i : mask.indices()) {
-                array.copy_in__uninitialized(i, input_list[i]);
-              }
+              GenericMutableArrayRef array = storage.allocate_copy(input_list);
               storage.set_array_ref_for_input(*target, array);
             }
             else {
@@ -61,11 +56,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFMask mask,
               storage.set_virtual_list_list_for_input(*target, input_list_list);
             }
             else if (param_type.is_mutable_vector()) {
-              GenericVectorArray &vector_array = storage.allocate_vector_array(
-                  param_type.data_type().vector__cpp_base_type());
-              for (uint i : mask.indices()) {
-                vector_array.extend_single__copy(i, input_list_list[i]);
-              }
+              GenericVectorArray &vector_array = storage.allocate_copy(input_list_list);
               storage.set_vector_array_for_input(*target, vector_array);
             }
             else {
@@ -83,7 +74,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFMask mask,
 }
 
 BLI_NOINLINE void MF_EvaluateNetwork::evaluate_network_to_compute_outputs(
-    MFMask mask, MFContext &global_context, Storage &storage) const
+    MFContext &global_context, Storage &storage) const
 {
   Stack<const MFSocket *> sockets_to_compute;
 
@@ -118,7 +109,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::evaluate_network_to_compute_outputs(
 
       bool all_inputs_are_computed = not_computed_inputs_amount == 0;
       if (all_inputs_are_computed) {
-        this->compute_and_forward_outputs(mask, global_context, function_node, storage);
+        this->compute_and_forward_outputs(global_context, function_node, storage);
         sockets_to_compute.pop();
       }
     }
@@ -126,13 +117,10 @@ BLI_NOINLINE void MF_EvaluateNetwork::evaluate_network_to_compute_outputs(
 }
 
 BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
-    MFMask mask,
-    MFContext &global_context,
-    const MFFunctionNode &function_node,
-    Storage &storage) const
+    MFContext &global_context, const MFFunctionNode &function_node, Storage &storage) const
 {
   const MultiFunction &function = function_node.function();
-  MFParamsBuilder params_builder(function, mask.min_array_size());
+  MFParamsBuilder params_builder(function, storage.mask().min_array_size());
 
   for (uint param_index : function.param_indices()) {
     MFParamType param_type = function.param_type(param_index);
@@ -178,7 +166,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
     }
   }
 
-  function.call(mask, params_builder, global_context);
+  function.call(storage.mask(), params_builder, global_context);
 
   for (uint param_index : function.param_indices()) {
     MFParamType param_type = function.param_type(param_index);
@@ -203,11 +191,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
               storage.set_virtual_list_for_input(*target, computed_values);
             }
             else if (target_param_type.is_mutable_single()) {
-              const CPPType &type = param_type.data_type().single__cpp_type();
-              GenericMutableArrayRef copied_values = storage.allocate_array(type);
-              for (uint i : mask.indices()) {
-                type.copy_to_uninitialized(computed_values[i], copied_values[i]);
-              }
+              GenericMutableArrayRef copied_values = storage.allocate_copy(computed_values);
               storage.set_array_ref_for_input(*target, copied_values);
             }
             else {
@@ -233,11 +217,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
               storage.set_vector_array_for_input(*target, computed_values);
             }
             else if (target_param_type.is_mutable_vector()) {
-              const CPPType &type = param_type.data_type().vector__cpp_base_type();
-              GenericVectorArray &copied_values = storage.allocate_vector_array(type);
-              for (uint i : mask.indices()) {
-                copied_values.extend_single__copy(i, computed_values[i]);
-              }
+              GenericVectorArray &copied_values = storage.allocate_copy(computed_values);
               storage.set_vector_array_for_input(*target, copied_values);
             }
             else {
@@ -251,8 +231,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
   }
 }
 
-BLI_NOINLINE void MF_EvaluateNetwork::copy_computed_values_to_outputs(MFMask mask,
-                                                                      MFParams params,
+BLI_NOINLINE void MF_EvaluateNetwork::copy_computed_values_to_outputs(MFParams params,
                                                                       Storage &storage) const
 {
   for (uint output_index : m_outputs.index_iterator()) {
@@ -263,7 +242,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_computed_values_to_outputs(MFMask mas
         GenericVirtualListRef values = storage.get_virtual_list_for_input(socket);
         GenericMutableArrayRef output_values = params.uninitialized_single_output(
             global_param_index, "Output");
-        for (uint i : mask.indices()) {
+        for (uint i : storage.mask().indices()) {
           output_values.copy_in__uninitialized(i, values[i]);
         }
         break;
@@ -271,7 +250,7 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_computed_values_to_outputs(MFMask mas
       case MFDataType::Vector: {
         GenericVirtualListListRef values = storage.get_virtual_list_list_for_input(socket);
         GenericVectorArray &output_values = params.vector_output(global_param_index, "Output");
-        for (uint i : mask.indices()) {
+        for (uint i : storage.mask().indices()) {
           output_values.extend_single__copy(i, values[i]);
         }
         break;
diff --git a/source/blender/functions/intern/multi_functions/network.h b/source/blender/functions/intern/multi_functions/network.h
index c96ab9e1bde..0b75df5db2a 100644
--- a/source/blender/functions/intern/multi_functions/network.h
+++ b/source/blender/functions/intern/multi_functions/network.h
@@ -75,6 +75,11 @@ class MF_EvaluateNetwork final : public MultiFunction {
       }
     }
 
+    MFMask &mask()
+    {
+      return m_mask;
+    }
+
     GenericMutableArrayRef allocate_array(const CPPType &type)
     {
       uint size = m_mask.min_array_size();
@@ -92,6 +97,24 @@ class MF_EvaluateNetwork final : public MultiFunction {
       return *vector_array;
     }
 
+    GenericMutableArrayRef allocate_copy(GenericVirtualListRef array)
+    {
+      GenericMutableArrayRef new_array = this->allocate_array(array.type());
+      for (uint i : m_mask.indices()) {
+        new_array.copy_in__uninitialized(i, array[i]);
+      }
+      return new_array;
+    }
+
+    GenericVectorArray &allocate_copy(GenericVirtualListListRef vector_array)
+    {
+      GenericVectorArray &new_vector_array = this->allocate_vector_array(vector_array.type());
+      for (uint i : m_mask.indices()) {
+        new_vector_array.extend_single__copy(i, vector_array[i]);
+      }
+      return new_vector_array;
+    }
+
     void set_array_ref_for_input(const MFInputSocket &socket, GenericMutableArrayRef array)
     {
       m_array_ref_for_inputs.add_new(socket.id(), array);
@@ -150,18 +173,15 @@ class MF_EvaluateNetwork final : public MultiFunction {
   void call(MFMask mask, MFParams params, MFContext context) const override;
 
  private:
-  void copy_inputs_to_storage(MFMask mask, MFParams params, Storage &storage) const;
+  void copy_inputs_to_storage(MFParams params, Storage &storage) const;
 
-  void evaluate_network_to_compute_outputs(MFMask mask,
-                                           MFContext &global_context,
-                                           Storage &storage) const;
+  void evaluate_network_to_compute_outputs(MFContext &global_context, Storage &storage) const;
 
-  void compute_and_forward_outputs(MFMask mask,
-                                   MFContext &global_context,
+  void compute_and_forward_outputs(MFContext &global_context,
                                    const MFFunctionNode &function_node,
                                    Storage &storage) const;
 
-  void copy_computed_values_to_outputs(MFMask mask, MFParams params, Storage &storage) const;
+  void copy_computed_values_to_outputs(MFParams params, Storage &storage) const;
 };
 
 }  // namespace FN



More information about the Bf-blender-cvs mailing list