[Bf-blender-cvs] [56dce4ae436] functions: initital check for whether a function can be called once only
Jacques Lucke
noreply at git.blender.org
Fri Dec 6 13:55:08 CET 2019
Commit: 56dce4ae436f2a24e59b05f3a046710237a707a3
Author: Jacques Lucke
Date: Fri Dec 6 13:55:03 2019 +0100
Branches: functions
https://developer.blender.org/rB56dce4ae436f2a24e59b05f3a046710237a707a3
initital check for whether a function can be called once only
===================================================================
M source/blender/functions/FN_multi_function.h
M source/blender/functions/intern/multi_functions/network.cc
M source/blender/functions/intern/multi_functions/network.h
===================================================================
diff --git a/source/blender/functions/FN_multi_function.h b/source/blender/functions/FN_multi_function.h
index 39e248291b5..1d5e819fa81 100644
--- a/source/blender/functions/FN_multi_function.h
+++ b/source/blender/functions/FN_multi_function.h
@@ -67,11 +67,6 @@ class MFSignature {
}
}
- bool depends_on_per_element_context() const
- {
- return m_depends_on_per_element_context;
- }
-
ArrayRef<MFParamType> param_types() const
{
return m_param_types;
@@ -202,6 +197,11 @@ class MultiFunction {
return m_signature.m_function_name;
}
+ bool depends_on_per_element_context() const
+ {
+ return m_signature.m_depends_on_per_element_context;
+ }
+
protected:
void set_signature(MFSignatureBuilder &signature_builder)
{
diff --git a/source/blender/functions/intern/multi_functions/network.cc b/source/blender/functions/intern/multi_functions/network.cc
index b15c748395d..fd22ef7f887 100644
--- a/source/blender/functions/intern/multi_functions/network.cc
+++ b/source/blender/functions/intern/multi_functions/network.cc
@@ -7,6 +7,7 @@ class MF_EvaluateNetwork_Storage {
MFMask m_mask;
Vector<GenericVectorArray *> m_vector_arrays;
Vector<GenericMutableArrayRef> m_arrays;
+ Vector<GenericMutableArrayRef> m_single_element_arrays;
Map<uint, GenericVectorArray *> m_vector_array_for_inputs;
Map<uint, GenericVirtualListRef> m_virtual_list_for_inputs;
Map<uint, GenericVirtualListListRef> m_virtual_list_list_for_inputs;
@@ -26,6 +27,10 @@ class MF_EvaluateNetwork_Storage {
array.destruct_indices(m_mask.indices());
MEM_freeN(array.buffer());
}
+ for (GenericMutableArrayRef array : m_single_element_arrays) {
+ array.destruct_indices({0});
+ MEM_freeN(array.buffer());
+ }
}
MFMask &mask()
@@ -42,6 +47,14 @@ class MF_EvaluateNetwork_Storage {
return array;
}
+ GenericMutableArrayRef allocate_array__single_element(const CPPType &type)
+ {
+ void *buffer = MEM_mallocN(type.size(), __func__);
+ GenericMutableArrayRef array(type, buffer, 1);
+ m_single_element_arrays.append(array);
+ return array;
+ }
+
GenericVectorArray &allocate_vector_array(const CPPType &type)
{
uint size = m_mask.min_array_size();
@@ -50,6 +63,13 @@ class MF_EvaluateNetwork_Storage {
return *vector_array;
}
+ GenericVectorArray &allocate_vector_array__single_element(const CPPType &type)
+ {
+ GenericVectorArray *vector_array = new GenericVectorArray(type, 1);
+ m_vector_arrays.append(vector_array);
+ return *vector_array;
+ }
+
GenericMutableArrayRef allocate_copy(GenericVirtualListRef array)
{
GenericMutableArrayRef new_array = this->allocate_array(array.type());
@@ -315,6 +335,22 @@ BLI_NOINLINE void MF_EvaluateNetwork::compute_and_forward_outputs(
this->forward_computed_values(function_node, storage, params_builder);
}
+BLI_NOINLINE bool MF_EvaluateNetwork::can_evaluate_function_only_ones(
+ const MFFunctionNode &function_node, Storage &storage)
+{
+ if (function_node.function().depends_on_per_element_context()) {
+ return false;
+ }
+
+ for (const MFInputSocket *socket : function_node.inputs()) {
+ if (!storage.function_input_has_single_element(*socket)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
BLI_NOINLINE void MF_EvaluateNetwork::prepare_function_params(
const MFFunctionNode &function_node, Storage &storage, MFParamsBuilder ¶ms_builder) const
{
diff --git a/source/blender/functions/intern/multi_functions/network.h b/source/blender/functions/intern/multi_functions/network.h
index 9b97a7f4f3d..32dc2402f8e 100644
--- a/source/blender/functions/intern/multi_functions/network.h
+++ b/source/blender/functions/intern/multi_functions/network.h
@@ -38,6 +38,7 @@ class MF_EvaluateNetwork final : public MultiFunction {
void compute_and_forward_outputs(MFContext &global_context,
const MFFunctionNode &function_node,
Storage &storage) const;
+ bool can_evaluate_function_only_ones(const MFFunctionNode &function_node, Storage &storage);
void prepare_function_params(const MFFunctionNode &function_node,
Storage &storage,
MFParamsBuilder ¶ms_builder) const;
More information about the Bf-blender-cvs
mailing list