[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