[Bf-blender-cvs] [d238e6410f6] functions: improve copying of generic data

Jacques Lucke noreply at git.blender.org
Thu Jan 2 17:09:08 CET 2020


Commit: d238e6410f63d4a1c82f04b0ba909c5831d34eeb
Author: Jacques Lucke
Date:   Thu Jan 2 17:09:02 2020 +0100
Branches: functions
https://developer.blender.org/rBd238e6410f63d4a1c82f04b0ba909c5831d34eeb

improve copying of generic data

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

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

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

diff --git a/source/blender/functions/FN_generic_virtual_list_ref.h b/source/blender/functions/FN_generic_virtual_list_ref.h
index 41c1cdb37d4..6544e221a2d 100644
--- a/source/blender/functions/FN_generic_virtual_list_ref.h
+++ b/source/blender/functions/FN_generic_virtual_list_ref.h
@@ -212,6 +212,25 @@ class GenericVirtualListRef {
   {
     return GenericVirtualListRef::FromSingle(*m_type, (*this)[index], new_virtual_size);
   }
+
+  void materialize_to_uninitialized(IndexMask index_mask, GenericMutableArrayRef r_array)
+  {
+    BLI_assert(this->size() >= index_mask.min_array_size());
+    BLI_assert(r_array.size() >= index_mask.min_array_size());
+
+    if (this->is_single_element()) {
+      m_type->fill_uninitialized_indices(this->as_single_element(), r_array.buffer(), index_mask);
+    }
+    else if (this->is_non_single_full_array()) {
+      m_type->copy_to_uninitialized_indices(
+          this->as_full_array().buffer(), r_array.buffer(), index_mask);
+    }
+    else {
+      for (uint i : index_mask) {
+        m_type->copy_to_uninitialized((*this)[i], r_array[i]);
+      }
+    }
+  }
 };
 
 }  // namespace FN
diff --git a/source/blender/functions/intern/multi_functions/network.cc b/source/blender/functions/intern/multi_functions/network.cc
index 96afd293f54..f7f5cd81542 100644
--- a/source/blender/functions/intern/multi_functions/network.cc
+++ b/source/blender/functions/intern/multi_functions/network.cc
@@ -73,9 +73,7 @@ class MF_EvaluateNetwork_Storage {
   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]);
-    }
+    array.materialize_to_uninitialized(m_mask, new_array);
     return new_array;
   }
 
@@ -107,9 +105,7 @@ class MF_EvaluateNetwork_Storage {
   {
     BLI_assert(array.size() == 1);
     GenericMutableArrayRef new_array = this->allocate_array(array.type());
-    for (uint i : m_mask.indices()) {
-      new_array.copy_in__uninitialized(i, array[0]);
-    }
+    array.type().fill_uninitialized_indices(array[0], new_array.buffer(), m_mask);
     return new_array;
   }
 
@@ -675,14 +671,11 @@ BLI_NOINLINE void MF_EvaluateNetwork::copy_computed_values_to_outputs(MFParams p
             global_param_index);
         if (values.size() < array_size) {
           BLI_assert(values.is_single_element());
-          for (uint i : storage.mask().indices()) {
-            output_values.copy_in__uninitialized(i, values[0]);
-          }
+          output_values.type().fill_uninitialized_indices(
+              values[0], output_values.buffer(), storage.mask());
         }
         else {
-          for (uint i : storage.mask().indices()) {
-            output_values.copy_in__uninitialized(i, values[i]);
-          }
+          values.materialize_to_uninitialized(storage.mask(), output_values);
         }
         break;
       }



More information about the Bf-blender-cvs mailing list