Commit: 8f70d4986e2468105ec41c9706c13609d1b32ef9 Author: Jacques Lucke Date: Sun Apr 28 21:15:43 2019 +0200 Branches: functions https://developer.blender.org/rB8f70d4986e2468105ec41c9706c13609d1b32ef9
splitup forwarding function =================================================================== 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 b4e3d6b8e2e..70d384a8b9f 100644 --- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp +++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp @@ -440,47 +440,96 @@ class ExecuteFGraph : public TupleCallBody { SocketInfo &output_info = m_output_info[output_id]; CPPTypeInfo *type_info = output_info.type; - void *value_src = storage.output_value_ptr(output_id); uint *target_ids = BLI_array_alloca(target_ids, possible_target_ids.size()); + uint target_amount = this->filter_uninitialized_targets( + possible_target_ids, storage, target_ids); + + this->forward_output_to_targets(output_id, target_ids, target_amount, type_info, storage); + this->copy_targets_to_final_output_if_necessary(target_ids, target_amount, storage, fn_out); + } + + uint filter_uninitialized_targets(ArrayRef<uint> &possible_target_ids, + SocketValueStorage &storage, + uint *r_target_ids) const + { uint target_amount = 0; for (uint possible_target_id : possible_target_ids) { if (!storage.is_input_initialized(possible_target_id)) { - target_ids[target_amount] = possible_target_id; + r_target_ids[target_amount] = possible_target_id; target_amount++; } } + return target_amount; + } + void forward_output_to_targets(uint output_id, + uint *target_ids, + uint target_amount, + CPPTypeInfo *type_info, + SocketValueStorage &storage) const + { if (target_amount == 0) { - type_info->destruct_type(value_src); - storage.set_output_initialized(output_id, false); + this->destruct_output(output_id, type_info, storage); } else if (target_amount == 1) { - uint target_id = target_ids[0]; - void *value_dst = storage.input_value_ptr(target_id); - type_info->relocate_to_uninitialized(value_src, value_dst); - storage.set_output_initialized(output_id, false); - storage.set_input_initialized(target_id, true); + this->relocate_output_to_input(output_id, target_ids[0], type_info, storage); } else { - for (uint i = 1; i < target_amount; i++) { - uint target_id = target_ids[i]; - void *value_dst = storage.input_value_ptr(target_id); - type_info->copy_to_uninitialized(value_src, value_dst); - storage.set_input_initialized(target_id, true); - } + this->forward_output_to_multiple_inputs( + output_id, target_ids, target_amount, type_info, storage); + } + } + + void destruct_output(uint output_id, CPPTypeInfo *type_info, SocketValueStorage &storage) const + { + void *value_ptr = storage.output_value_ptr(output_id); + type_info->destruct_type(value_ptr); + storage.set_output_initialized(output_id, false); + } + + void relocate_output_to_input(uint output_id, + uint target_id, + CPPTypeInfo *type_info, + SocketValueStorage &storage) const + { + void *value_src = storage.output_value_ptr(output_id); + void *value_dst = storage.input_value_ptr(target_id); + type_info->relocate_to_uninitialized(value_src, value_dst); + storage.set_output_initialized(output_id, false); + storage.set_input_initialized(target_id, true); + } + + void forward_output_to_multiple_inputs(uint output_id, + uint *target_ids, + uint target_amount, + CPPTypeInfo *type_info, + SocketValueStorage &storage) const + { + void *value_src = storage.output_value_ptr(output_id); - uint target_id = target_ids[0]; + for (uint i = 1; i < target_amount; i++) { + uint target_id = target_ids[i]; void *value_dst = storage.input_value_ptr(target_id); type_info->copy_to_uninitialized(value_src, value_dst); - storage.set_output_initialized(output_id, false); storage.set_input_initialized(target_id, true); } + uint target_id = target_ids[0]; + void *value_dst = storage.input_value_ptr(target_id); + type_info->copy_to_uninitialized(value_src, value_dst); + storage.set_output_initialized(output_id, false); + storage.set_input_initialized(target_id, true); + } + + void copy_targets_to_final_output_if_necessary(uint *target_ids, + uint target_amount, + SocketValueStorage &storage, + Tuple &fn_out) const + { for (uint i = 0; i < target_amount; i++) { uint target_id = target_ids[i]; SocketInfo &socket_info = m_input_info[target_id]; - BLI_assert(type_info == socket_info.type); if (socket_info.is_fn_output) { uint index = m_fgraph.outputs().index(DFGraphSocket::FromInput(target_id)); void *value_ptr = storage.input_value_ptr(target_id); _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs