[Bf-blender-cvs] [bbede5b3bd7] functions: copy computed value to fn_out immediatly
Jacques Lucke
noreply at git.blender.org
Sat Apr 27 22:43:23 CEST 2019
Commit: bbede5b3bd7aa09a65e230f95583f8ff629798b9
Author: Jacques Lucke
Date: Sat Apr 27 19:34:49 2019 +0200
Branches: functions
https://developer.blender.org/rBbbede5b3bd7aa09a65e230f95583f8ff629798b9
copy computed value to fn_out immediatly
===================================================================
M source/blender/blenlib/BLI_shared.hpp
M source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
M source/blender/functions/backends/tuple_call/tuple.hpp
M source/blender/functions/types/lists.hpp
===================================================================
diff --git a/source/blender/blenlib/BLI_shared.hpp b/source/blender/blenlib/BLI_shared.hpp
index db7b242977a..5ec672ccbb4 100644
--- a/source/blender/blenlib/BLI_shared.hpp
+++ b/source/blender/blenlib/BLI_shared.hpp
@@ -165,4 +165,4 @@ template<typename T> struct hash<BLI::AutoRefCount<T>> {
return std::hash<T>{}(*v.ptr());
}
};
-} // namespace std
\ No newline at end of file
+} // namespace std
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 2a17dedcac8..a3aaba21748 100644
--- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
+++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
@@ -34,14 +34,22 @@ class ExecuteFGraph : public TupleCallBody {
SmallVector<CPPTypeInfo *> m_input_types;
SmallVector<CPPTypeInfo *> m_output_types;
- uint m_inputs_buffer_size = 0;
- uint m_outputs_buffer_size = 0;
SmallVector<uint> m_input_offsets;
SmallVector<uint> m_output_offsets;
+ uint m_inputs_buffer_size = 0;
+ uint m_outputs_buffer_size = 0;
uint m_inputs_init_buffer_size = 0;
uint m_outputs_init_buffer_size = 0;
+ struct SocketFlag {
+ char is_fn_input : 1;
+ char is_fn_output : 1;
+ };
+
+ SmallVector<SocketFlag> m_input_socket_flags;
+ SmallVector<SocketFlag> m_output_socket_flags;
+
public:
ExecuteFGraph(FunctionGraph &fgraph) : m_fgraph(fgraph), m_graph(fgraph.graph().ptr())
{
@@ -56,6 +64,20 @@ class ExecuteFGraph : public TupleCallBody {
m_input_starts.append(m_inputs_buffer_size);
m_output_starts.append(m_outputs_buffer_size);
+ for (auto socket : m_graph->inputs_of_node(node_id)) {
+ SocketFlag flag;
+ flag.is_fn_input = fgraph.inputs().contains(socket);
+ flag.is_fn_output = fgraph.outputs().contains(socket);
+ m_input_socket_flags.append(flag);
+ }
+
+ for (auto socket : m_graph->outputs_of_node(node_id)) {
+ SocketFlag flag;
+ flag.is_fn_input = fgraph.inputs().contains(socket);
+ flag.is_fn_output = fgraph.outputs().contains(socket);
+ m_output_socket_flags.append(flag);
+ }
+
if (body == nullptr) {
for (auto param : fn->signature().inputs()) {
CPPTypeInfo *type_info = param.type()->extension<CPPTypeInfo>();
@@ -90,7 +112,7 @@ class ExecuteFGraph : public TupleCallBody {
m_output_types.append(meta_out->type_infos()[i]);
m_output_offsets.append(m_outputs_buffer_size + meta_out->offsets()[i]);
}
- m_outputs_buffer_size += meta_in->size_of_data();
+ m_outputs_buffer_size += meta_out->size_of_data();
}
}
}
@@ -110,10 +132,20 @@ class ExecuteFGraph : public TupleCallBody {
if (socket.is_input()) {
fn_in.relocate_out__dynamic(i, input_values + m_input_offsets[socket.id()]);
input_inits[socket.id()] = true;
+
+ if (m_input_socket_flags[socket.id()].is_fn_output) {
+ uint index = m_fgraph.outputs().index(socket);
+ fn_out.copy_in__dynamic(index, input_values + m_input_offsets[socket.id()]);
+ }
}
else {
fn_in.relocate_out__dynamic(i, output_values + m_output_offsets[socket.id()]);
output_inits[socket.id()] = true;
+
+ if (m_output_socket_flags[socket.id()].is_fn_output) {
+ uint index = m_fgraph.outputs().index(socket);
+ fn_out.copy_in__dynamic(index, output_values + m_output_offsets[socket.id()]);
+ }
}
}
@@ -131,13 +163,18 @@ class ExecuteFGraph : public TupleCallBody {
}
else {
DFGraphSocket origin = m_graph->origin_of_input(socket);
- sockets_to_compute.push(origin);
+ if (output_inits[origin.id()]) {
+ this->forward_output(
+ origin.id(), input_values, output_values, input_inits, output_inits, fn_out);
+ sockets_to_compute.pop();
+ }
+ else {
+ sockets_to_compute.push(origin);
+ }
}
}
else {
if (output_inits[socket.id()]) {
- this->forward_output(
- socket.id(), input_values, output_values, input_inits, output_inits);
sockets_to_compute.pop();
}
else {
@@ -157,18 +194,22 @@ class ExecuteFGraph : public TupleCallBody {
Tuple body_in(body->meta_in(),
input_values + m_input_starts[node_id],
input_inits + m_graph->first_input_id_of_node(node_id),
+ true,
true);
Tuple body_out(body->meta_out(),
output_values + m_output_starts[node_id],
output_inits + m_graph->first_output_id_of_node(node_id),
- true);
+ true,
+ false);
SourceInfoStackFrame frame(m_graph->source_info_of_node(node_id));
body->call__setup_stack(body_in, body_out, ctx, frame);
for (uint output_id : m_graph->output_ids_of_node(node_id)) {
- this->forward_output(
- output_id, input_values, output_values, input_inits, output_inits);
+ if (m_output_socket_flags[output_id].is_fn_output) {
+ uint index = m_fgraph.outputs().index(DFGraphSocket::FromOutput(output_id));
+ fn_out.copy_in__dynamic(index, output_values + m_output_offsets[output_id]);
+ }
}
sockets_to_compute.pop();
@@ -177,20 +218,6 @@ class ExecuteFGraph : public TupleCallBody {
}
}
- for (uint i = 0; i < m_fgraph.outputs().size(); i++) {
- DFGraphSocket socket = m_fgraph.outputs()[i];
- if (socket.is_input()) {
- BLI_assert(input_inits[socket.id()]);
- fn_out.relocate_in__dynamic(i, input_values + m_input_offsets[socket.id()]);
- input_inits[socket.id()] = false;
- }
- else {
- BLI_assert(output_inits[socket.id()]);
- fn_out.relocate_in__dynamic(i, output_values + m_input_offsets[socket.id()]);
- output_inits[socket.id()] = false;
- }
- }
-
for (uint input_id = 0; input_id < m_inputs_init_buffer_size; input_id++) {
if (input_inits[input_id]) {
CPPTypeInfo *type_info = m_input_types[input_id];
@@ -210,7 +237,8 @@ class ExecuteFGraph : public TupleCallBody {
char *input_values,
char *output_values,
bool *input_inits,
- bool *output_inits) const
+ bool *output_inits,
+ Tuple &fn_out) const
{
BLI_assert(output_inits[output_id]);
auto target_ids = m_graph->targets_of_output(output_id);
@@ -223,6 +251,11 @@ class ExecuteFGraph : public TupleCallBody {
void *value_dst = input_values + m_input_offsets[target_id];
type_info->copy_to_uninitialized(value_src, value_dst);
input_inits[target_id] = true;
+
+ if (m_input_socket_flags[target_id].is_fn_output) {
+ uint index = m_fgraph.outputs().index(DFGraphSocket::FromInput(target_id));
+ fn_out.copy_in__dynamic(index, value_dst);
+ }
}
}
}
diff --git a/source/blender/functions/backends/tuple_call/tuple.hpp b/source/blender/functions/backends/tuple_call/tuple.hpp
index 83bba1bc7c1..8df5d6ebe22 100644
--- a/source/blender/functions/backends/tuple_call/tuple.hpp
+++ b/source/blender/functions/backends/tuple_call/tuple.hpp
@@ -151,6 +151,23 @@ class Tuple {
m_initialized[index] = true;
}
+ inline void copy_in__dynamic(uint index, void *src)
+ {
+ BLI_assert(index < m_meta->element_amount());
+ BLI_assert(src != nullptr);
+
+ void *dst = this->element_ptr(index);
+ auto *type_info = m_meta->type_infos()[index];
+
+ if (m_initialized[index]) {
+ type_info->copy_to_initialized(src, dst);
+ }
+ else {
+ type_info->copy_to_uninitialized(src, dst);
+ m_initialized[index] = true;
+ }
+ }
+
template<typename T> inline void move_in(uint index, T &value)
{
BLI_assert(index < m_meta->element_amount());
@@ -163,9 +180,8 @@ class Tuple {
}
else {
std::uninitialized_copy_n(std::make_move_iterator(&value), 1, dst);
+ m_initialized[index] = true;
}
-
- m_initialized[index] = true;
}
inline void relocate_in__dynamic(uint index, void *src)
@@ -181,9 +197,8 @@ class Tuple {
}
else {
type_info->relocate_to_uninitialized(src, dst);
+ m_initialized[index] = true;
}
-
- m_initialized[index] = true;
}
template<typename T> inline void set(uint index, const T &value)
diff --git a/source/blender/functions/types/lists.hpp b/source/blender/functions/types/lists.hpp
index 67439beefce..f09ea531a75 100644
--- a/source/blender/functions/types/lists.hpp
+++ b/source/blender/functions/types/lists.hpp
@@ -18,7 +18,7 @@ template<typename T> class List : public BLI::SharedImmutable {
~List()
{
if (DEBUG_ALLOCATIONS) {
- std::cout << "List Freed" << std::endl;
+ std::cout << "List Freed: " << (void *)this << std::endl;
}
}
@@ -26,7 +26,7 @@ template<typename T> class List : public BLI::SharedImmutable {
List() : BLI::SharedImmutable()
{
if (DEBUG_ALLOCATIONS) {
- std::cout << "List Allocated" << std::endl;
+ std::cout << "List Allocated: " << (void *)this << std::endl;
}
}
More information about the Bf-blender-cvs
mailing list