[Bf-blender-cvs] [b4291561318] functions: experimental reloadable function inputs

Jacques Lucke noreply at git.blender.org
Wed Aug 7 11:07:11 CEST 2019


Commit: b4291561318714e200a6f8a87e0f520aff1e39b7
Author: Jacques Lucke
Date:   Wed Aug 7 11:04:30 2019 +0200
Branches: functions
https://developer.blender.org/rBb4291561318714e200a6f8a87e0f520aff1e39b7

experimental reloadable function inputs

===================================================================

M	source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.cpp
M	source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.hpp

===================================================================

diff --git a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.cpp b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.cpp
index 803e76ca27c..b7ea6f83a06 100644
--- a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.cpp
+++ b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.cpp
@@ -89,8 +89,8 @@ void DynamicSocketLoader::insert(VTreeDataGraphBuilder &builder,
   auto fn = fn_builder.build("Input Sockets");
   fn->add_body<SocketLoaderBody>(btrees, bsockets, loaders);
   fn->add_body<SocketLoaderDependencies>(btrees, bsockets);
-  BuilderNode *node = builder.insert_function(fn);
 
+  BuilderNode *node = builder.insert_function(fn);
   r_new_origins.copy_from(node->outputs());
 }
 
@@ -187,5 +187,92 @@ void ConstantInputsHandler::insert(VTreeDataGraphBuilder &builder,
   r_new_origins.copy_from(node->outputs());
 }
 
+class LoadFromAddresses : public TupleCallBody {
+ private:
+  Vector<void *> m_addresses;
+  bool m_addresses_exist = true;
+
+ public:
+  LoadFromAddresses(ArrayRef<void *> addresses) : m_addresses(addresses)
+  {
+  }
+
+  void set_deallocated()
+  {
+    m_addresses_exist = false;
+  }
+
+  void call(Tuple &UNUSED(fn_in), Tuple &fn_out, ExecutionContext &UNUSED(ctx)) const override
+  {
+    BLI_assert(m_addresses_exist);
+    uint amount = m_addresses.size();
+    for (uint i = 0; i < amount; i++) {
+      fn_out.copy_in__dynamic(i, m_addresses[i]);
+    }
+  }
+};
+
+ReloadableInputs::~ReloadableInputs()
+{
+  for (SharedFunction &fn : m_functions) {
+    LoadFromAddresses &body = fn->body<LoadFromAddresses>();
+    body.set_deallocated();
+  }
+}
+
+void ReloadableInputs::insert(VTreeDataGraphBuilder &builder,
+                              ArrayRef<VirtualSocket *> unlinked_inputs,
+                              ArrayRef<BuilderOutputSocket *> r_new_origins)
+{
+  BLI_assert(m_tuple.get() == nullptr);
+
+  auto &socket_loaders = MAPPING_socket_loaders();
+
+  FunctionBuilder fn_builder;
+  for (VirtualSocket *vsocket : unlinked_inputs) {
+    SharedType &type = builder.query_socket_type(vsocket);
+    CPPTypeInfo &type_info = type->extension<CPPTypeInfo>();
+    fn_builder.add_output(vsocket->name(), type);
+
+    m_loaders.append(socket_loaders->get_loader(vsocket->idname()));
+    m_types.append(type);
+    m_addresses.append(m_allocator.allocate_aligned(type_info.size(), type_info.alignment()));
+    m_bsockets.append(vsocket->bsocket());
+    m_btrees.append(vsocket->btree());
+  }
+
+  ArrayRef<void *> new_addresses = ArrayRef<void *>(m_addresses).take_back(unlinked_inputs.size());
+
+  SharedFunction fn = fn_builder.build("Unlinked Inputs");
+  fn->add_body<LoadFromAddresses>(new_addresses);
+  m_functions.append(fn);
+
+  BuilderNode *node = builder.insert_function(fn);
+  r_new_origins.copy_from(node->outputs());
+}
+
+void ReloadableInputs::load()
+{
+  uint amount = m_types.size();
+  if (m_tuple.get() == nullptr) {
+    SharedTupleMeta meta = SharedTupleMeta::New(m_types);
+    Tuple *tuple = new Tuple(std::move(meta));
+    m_tuple = std::unique_ptr<Tuple>(tuple);
+  }
+  else {
+    for (uint i = 0; i < amount; i++) {
+      CPPTypeInfo &type_info = m_types[i]->extension<CPPTypeInfo>();
+      type_info.destruct(m_addresses[i]);
+    }
+  }
+
+  for (uint i = 0; i < amount; i++) {
+    PointerRNA rna;
+    RNA_pointer_create(&m_btrees[i]->id, &RNA_NodeSocket, m_bsockets[i], &rna);
+    m_loaders[i](&rna, *m_tuple, i);
+    m_tuple->relocate_out__dynamic(i, m_addresses[i]);
+  }
+}
+
 }  // namespace DataFlowNodes
 }  // namespace FN
diff --git a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.hpp b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.hpp
index 2788365cb29..081e261d689 100644
--- a/source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.hpp
+++ b/source/blender/functions/frontends/data_flow_nodes/unlinked_input_inserters.hpp
@@ -19,5 +19,27 @@ class ConstantInputsHandler : public UnlinkedInputsInserter {
               ArrayRef<BuilderOutputSocket *> r_new_origins) override;
 };
 
+class ReloadableInputs : public UnlinkedInputsInserter {
+ private:
+  MonotonicAllocator m_allocator;
+  Vector<void *> m_addresses;
+  Vector<SocketLoader> m_loaders;
+  Vector<SharedType> m_types;
+  Vector<bNodeTree *> m_btrees;
+  Vector<bNodeSocket *> m_bsockets;
+  std::unique_ptr<Tuple> m_tuple;
+
+  Vector<SharedFunction> m_functions;
+
+ public:
+  ~ReloadableInputs();
+
+  void insert(VTreeDataGraphBuilder &builder,
+              ArrayRef<VirtualSocket *> unlinked_inputs,
+              ArrayRef<BuilderOutputSocket *> r_new_origins) override;
+
+  void load();
+};
+
 }  // namespace DataFlowNodes
 }  // namespace FN



More information about the Bf-blender-cvs mailing list