[Bf-blender-cvs] [21f1e501a7b] functions: do less unnecessary data copies
Jacques Lucke
noreply at git.blender.org
Sat Apr 27 22:43:25 CEST 2019
Commit: 21f1e501a7be5aa79273f42a42cbe62c07a07b54
Author: Jacques Lucke
Date: Sat Apr 27 19:49:33 2019 +0200
Branches: functions
https://developer.blender.org/rB21f1e501a7be5aa79273f42a42cbe62c07a07b54
do less unnecessary data copies
===================================================================
M source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
===================================================================
diff --git a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
index a3aaba21748..617ca644c14 100644
--- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
+++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
@@ -241,21 +241,52 @@ class ExecuteFGraph : public TupleCallBody {
Tuple &fn_out) const
{
BLI_assert(output_inits[output_id]);
- auto target_ids = m_graph->targets_of_output(output_id);
+ auto possible_target_ids = m_graph->targets_of_output(output_id);
CPPTypeInfo *type_info = m_output_types[output_id];
void *value_src = output_values + m_output_offsets[output_id];
- for (uint target_id : target_ids) {
- BLI_assert(type_info == m_input_types[target_id]);
- if (!input_inits[target_id]) {
+ uint *target_ids = BLI_array_alloca(target_ids, possible_target_ids.size());
+ uint target_amount = 0;
+ for (uint possible_target_id : possible_target_ids) {
+ if (!input_inits[possible_target_id]) {
+ target_ids[target_amount] = possible_target_id;
+ target_amount++;
+ }
+ }
+
+ if (target_amount == 0) {
+ type_info->destruct_type(value_src);
+ output_inits[output_id] = false;
+ }
+ else if (target_amount == 1) {
+ uint target_id = target_ids[0];
+ void *value_dst = input_values + m_input_offsets[target_id];
+ type_info->relocate_to_uninitialized(value_src, value_dst);
+ output_inits[output_id] = false;
+ input_inits[target_id] = true;
+ }
+ else {
+ for (uint i = 1; i < target_amount; i++) {
+ uint target_id = target_ids[i];
void *value_dst = input_values + m_input_offsets[target_id];
type_info->copy_to_uninitialized(value_src, value_dst);
input_inits[target_id] = true;
+ }
- if (m_input_socket_flags[target_id].is_fn_output) {
- uint index = m_fgraph.outputs().index(DFGraphSocket::FromInput(target_id));
- fn_out.copy_in__dynamic(index, value_dst);
- }
+ uint target_id = target_ids[0];
+ void *value_dst = input_values + m_input_offsets[target_id];
+ type_info->copy_to_uninitialized(value_src, value_dst);
+ output_inits[output_id] = false;
+ input_inits[target_id] = true;
+ }
+
+ for (uint i = 0; i < target_amount; i++) {
+ uint target_id = target_ids[i];
+ BLI_assert(type_info == m_input_types[target_id]);
+ if (m_input_socket_flags[target_id].is_fn_output) {
+ uint index = m_fgraph.outputs().index(DFGraphSocket::FromInput(target_id));
+ void *value_ptr = input_values + m_input_offsets[target_id];
+ fn_out.copy_in__dynamic(index, value_ptr);
}
}
}
More information about the Bf-blender-cvs
mailing list