[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