[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 &params_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 &params_builder) const;



More information about the Bf-blender-cvs mailing list