[Bf-blender-cvs] [29106bdaee1] functions: simplify allocation in multi function network evaluation

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


Commit: 29106bdaee157307917d69a98afe091134f9052a
Author: Jacques Lucke
Date:   Fri Dec 6 11:48:40 2019 +0100
Branches: functions
https://developer.blender.org/rB29106bdaee157307917d69a98afe091134f9052a

simplify allocation in multi function 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 77c4bd14f04..550f10d9310 100644
--- a/source/blender/functions/intern/multi_functions/network.cc
+++ b/source/blender/functions/intern/multi_functions/network.cc
@@ -32,8 +32,8 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFMask mask,
               storage.set_virtual_list_for_input__non_owning(*target, input_list);
             }
             else if (param_type.is_mutable_single()) {
-              GenericMutableArrayRef array = this->allocate_array(
-                  param_type.data_type().single__cpp_type(), mask.min_array_size());
+              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]);
               }
@@ -61,13 +61,12 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_inputs_to_storage(MFMask mask,
               storage.set_virtual_list_list_for_input__non_owning(*target, input_list_list);
             }
             else if (param_type.is_mutable_vector()) {
-              GenericVectorArray *vector_array = new GenericVectorArray(
-                  param_type.data_type().vector__cpp_base_type(), mask.min_array_size());
+              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]);
+                vector_array.extend_single__copy(i, input_list_list[i]);
               }
               storage.set_vector_array_for_input__non_owning(*target, vector_array);
-              storage.take_vector_array_ownership(vector_array);
             }
             else {
               BLI_assert(false);
@@ -132,10 +131,8 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
     const MFFunctionNode &function_node,
     Storage &storage) const
 {
-  uint array_size = mask.min_array_size();
-
   const MultiFunction &function = function_node.function();
-  MFParamsBuilder params_builder(function, array_size);
+  MFParamsBuilder params_builder(function, mask.min_array_size());
 
   Vector<std::pair<const MFOutputSocket *, GenericMutableArrayRef>> single_outputs_to_forward;
   Vector<std::pair<const MFOutputSocket *, GenericVectorArray *>> vector_outputs_to_forward;
@@ -157,18 +154,18 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
       }
       case MFParamType::SingleOutput: {
         const MFOutputSocket &output_socket = function_node.output_for_param(param_index);
-        GenericMutableArrayRef values_destination = this->allocate_array(
-            output_socket.data_type().single__cpp_type(), array_size);
+        GenericMutableArrayRef values_destination = storage.allocate_array(
+            output_socket.data_type().single__cpp_type());
         params_builder.add_single_output(values_destination);
         single_outputs_to_forward.append({&output_socket, values_destination});
         break;
       }
       case MFParamType::VectorOutput: {
         const MFOutputSocket &output_socket = function_node.output_for_param(param_index);
-        auto *values_destination = new GenericVectorArray(
-            output_socket.data_type().vector__cpp_base_type(), array_size);
-        params_builder.add_vector_output(*values_destination);
-        vector_outputs_to_forward.append({&output_socket, values_destination});
+        GenericVectorArray &values_destination = storage.allocate_vector_array(
+            output_socket.data_type().vector__cpp_base_type());
+        params_builder.add_vector_output(values_destination);
+        vector_outputs_to_forward.append({&output_socket, &values_destination});
         break;
       }
       case MFParamType::MutableVector: {
@@ -197,7 +194,6 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
   for (auto single_forward_info : single_outputs_to_forward) {
     const MFOutputSocket &output_socket = *single_forward_info.first;
     GenericMutableArrayRef values = single_forward_info.second;
-    storage.take_array_ref_ownership__not_twice(values);
 
     for (const MFInputSocket *target : output_socket.targets()) {
       const MFNode &target_node = target->node();
@@ -209,11 +205,10 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
         }
         else if (param_type.is_mutable_single()) {
           const CPPType &type = param_type.data_type().single__cpp_type();
-          GenericMutableArrayRef copied_values = this->allocate_array(type, array_size);
+          GenericMutableArrayRef copied_values = storage.allocate_array(type);
           for (uint i : mask.indices()) {
             type.copy_to_uninitialized(values[i], copied_values[i]);
           }
-          storage.take_array_ref_ownership(copied_values);
           storage.set_array_ref_for_input__non_owning(*target, copied_values);
         }
         else {
@@ -229,7 +224,6 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
   for (auto vector_forward_info : vector_outputs_to_forward) {
     const MFOutputSocket &output_socket = *vector_forward_info.first;
     GenericVectorArray *values = vector_forward_info.second;
-    storage.take_vector_array_ownership__not_twice(values);
 
     for (const MFInputSocket *target : output_socket.targets()) {
       const MFNode &target_node = target->node();
@@ -240,12 +234,10 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
           storage.set_virtual_list_list_for_input__non_owning(*target, *values);
         }
         else if (param_type.is_mutable_vector()) {
-          GenericVectorArray *copied_values = new GenericVectorArray(values->type(),
-                                                                     values->size());
+          GenericVectorArray &copied_values = storage.allocate_vector_array(values->type());
           for (uint i : mask.indices()) {
-            copied_values->extend_single__copy(i, (*values)[i]);
+            copied_values.extend_single__copy(i, (*values)[i]);
           }
-          storage.take_vector_array_ownership(copied_values);
           storage.set_vector_array_for_input__non_owning(*target, copied_values);
         }
         else {
diff --git a/source/blender/functions/intern/multi_functions/network.h b/source/blender/functions/intern/multi_functions/network.h
index 92bbda223a5..9659e08fbc1 100644
--- a/source/blender/functions/intern/multi_functions/network.h
+++ b/source/blender/functions/intern/multi_functions/network.h
@@ -75,31 +75,21 @@ class MF_EvaluateNetwork final : public MultiFunction {
       }
     }
 
-    void take_array_ref_ownership(GenericMutableArrayRef array)
+    GenericMutableArrayRef allocate_array(const CPPType &type)
     {
+      uint size = m_mask.min_array_size();
+      void *buffer = MEM_malloc_arrayN(size, type.size(), __func__);
+      GenericMutableArrayRef array(type, buffer, size);
       m_arrays.append(array);
+      return array;
     }
 
-    void take_array_ref_ownership__not_twice(GenericMutableArrayRef array)
-    {
-      for (GenericMutableArrayRef other : m_arrays) {
-        if (other.buffer() == array.buffer()) {
-          return;
-        }
-      }
-      m_arrays.append(array);
-    }
-
-    void take_vector_array_ownership(GenericVectorArray *vector_array)
+    GenericVectorArray &allocate_vector_array(const CPPType &type)
     {
+      uint size = m_mask.min_array_size();
+      GenericVectorArray *vector_array = new GenericVectorArray(type, size);
       m_vector_arrays.append(vector_array);
-    }
-
-    void take_vector_array_ownership__not_twice(GenericVectorArray *vector_array)
-    {
-      if (!m_vector_arrays.contains(vector_array)) {
-        m_vector_arrays.append(vector_array);
-      }
+      return *vector_array;
     }
 
     void set_array_ref_for_input__non_owning(const MFInputSocket &socket,
@@ -121,9 +111,9 @@ class MF_EvaluateNetwork final : public MultiFunction {
     }
 
     void set_vector_array_for_input__non_owning(const MFInputSocket &socket,
-                                                GenericVectorArray *vector_array)
+                                                GenericVectorArray &vector_array)
     {
-      m_vector_array_for_inputs.add_new(socket.id(), vector_array);
+      m_vector_array_for_inputs.add_new(socket.id(), &vector_array);
     }
 
     GenericVirtualListRef get_virtual_list_for_input(const MFInputSocket &socket) const
@@ -175,12 +165,6 @@ class MF_EvaluateNetwork final : public MultiFunction {
                                    Storage &storage) const;
 
   void copy_computed_values_to_outputs(MFMask mask, MFParams params, Storage &storage) const;
-
-  GenericMutableArrayRef allocate_array(const CPPType &type, uint size) const
-  {
-    void *buffer = MEM_malloc_arrayN(size, type.size(), __func__);
-    return GenericMutableArrayRef(type, buffer, size);
-  }
 };
 
 }  // namespace FN



More information about the Bf-blender-cvs mailing list