[Bf-blender-cvs] [05985d98ff6] functions: put values in a struct that are accessed together

Jacques Lucke noreply at git.blender.org
Sat Apr 27 22:43:30 CEST 2019


Commit: 05985d98ff6fe3737aebdfb81ed43ded0c733e6d
Author: Jacques Lucke
Date:   Sat Apr 27 20:15:58 2019 +0200
Branches: functions
https://developer.blender.org/rB05985d98ff6fe3737aebdfb81ed43ded0c733e6d

put values in a struct that are accessed together

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

M	source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp

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

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 7183001399c..460bb58077a 100644
--- a/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
+++ b/source/blender/functions/backends/tuple_call/fgraph_tuple_call.cpp
@@ -32,26 +32,24 @@ class ExecuteFGraph : public TupleCallBody {
   SmallVector<uint> m_input_starts;
   SmallVector<uint> m_output_starts;
 
-  SmallVector<CPPTypeInfo *> m_input_types;
-  SmallVector<CPPTypeInfo *> m_output_types;
-  SmallVector<uint> m_input_offsets;
-  SmallVector<uint> m_output_offsets;
+  struct SocketInfo {
+    CPPTypeInfo *type;
+    uint offset;
+    uint is_fn_output : 1;
 
-  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_output : 1;
-
-    SocketFlag() : is_fn_output(false)
+    SocketInfo(CPPTypeInfo *type, uint offset, bool is_fn_output)
+        : type(type), offset(offset), is_fn_output(is_fn_output)
     {
     }
   };
 
-  SmallVector<SocketFlag> m_input_socket_flags;
-  SmallVector<SocketFlag> m_output_socket_flags;
+  SmallVector<SocketInfo> m_input_info;
+  SmallVector<SocketInfo> m_output_info;
+
+  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;
 
  public:
   ExecuteFGraph(FunctionGraph &fgraph) : m_fgraph(fgraph), m_graph(fgraph.graph().ptr())
@@ -67,21 +65,12 @@ class ExecuteFGraph : public TupleCallBody {
       m_input_starts.append(m_inputs_buffer_size);
       m_output_starts.append(m_outputs_buffer_size);
 
-      for (auto UNUSED(input_id) : m_graph->input_ids_of_node(node_id)) {
-        m_input_socket_flags.append(SocketFlag());
-      }
-      for (auto UNUSED(output_id) : m_graph->output_ids_of_node(node_id)) {
-        m_output_socket_flags.append(SocketFlag());
-      }
-
       if (body == nullptr) {
         for (auto param : fn->signature().inputs()) {
           CPPTypeInfo *type_info = param.type()->extension<CPPTypeInfo>();
           BLI_assert(type_info);
           uint type_size = type_info->size_of_type();
-
-          m_input_types.append(type_info);
-          m_input_offsets.append(m_inputs_buffer_size);
+          m_input_info.append(SocketInfo(type_info, m_inputs_init_buffer_size, false));
           m_inputs_buffer_size += type_size;
         }
 
@@ -89,24 +78,22 @@ class ExecuteFGraph : public TupleCallBody {
           CPPTypeInfo *type_info = param.type()->extension<CPPTypeInfo>();
           BLI_assert(type_info);
           uint type_size = type_info->size_of_type();
-
-          m_output_types.append(type_info);
-          m_output_offsets.append(m_outputs_buffer_size);
+          m_output_info.append(SocketInfo(type_info, m_outputs_buffer_size, false));
           m_outputs_buffer_size += type_size;
         }
       }
       else {
         SharedTupleMeta &meta_in = body->meta_in();
         for (uint i = 0; i < fn->signature().inputs().size(); i++) {
-          m_input_types.append(meta_in->type_infos()[i]);
-          m_input_offsets.append(m_inputs_buffer_size + meta_in->offsets()[i]);
+          m_input_info.append(SocketInfo(
+              meta_in->type_infos()[i], m_inputs_buffer_size + meta_in->offsets()[i], false));
         }
         m_inputs_buffer_size += meta_in->size_of_data();
 
         SharedTupleMeta &meta_out = body->meta_out();
         for (uint i = 0; i < fn->signature().outputs().size(); i++) {
-          m_output_types.append(meta_out->type_infos()[i]);
-          m_output_offsets.append(m_outputs_buffer_size + meta_out->offsets()[i]);
+          m_output_info.append(SocketInfo(
+              meta_out->type_infos()[i], m_outputs_buffer_size + meta_out->offsets()[i], false));
         }
         m_outputs_buffer_size += meta_out->size_of_data();
       }
@@ -114,10 +101,10 @@ class ExecuteFGraph : public TupleCallBody {
 
     for (auto socket : m_fgraph.outputs()) {
       if (socket.is_input()) {
-        m_input_socket_flags[socket.id()].is_fn_output = true;
+        m_input_info[socket.id()].is_fn_output = true;
       }
       else {
-        m_output_socket_flags[socket.id()].is_fn_output = true;
+        m_output_info[socket.id()].is_fn_output = true;
       }
     }
   }
@@ -135,21 +122,23 @@ class ExecuteFGraph : public TupleCallBody {
     for (uint i = 0; i < m_fgraph.inputs().size(); i++) {
       DFGraphSocket socket = m_fgraph.inputs()[i];
       if (socket.is_input()) {
-        fn_in.relocate_out__dynamic(i, input_values + m_input_offsets[socket.id()]);
+        SocketInfo &socket_info = m_input_info[socket.id()];
+        fn_in.relocate_out__dynamic(i, input_values + socket_info.offset);
         input_inits[socket.id()] = true;
 
-        if (m_input_socket_flags[socket.id()].is_fn_output) {
+        if (socket_info.is_fn_output) {
           uint index = m_fgraph.outputs().index(socket);
-          fn_out.copy_in__dynamic(index, input_values + m_input_offsets[socket.id()]);
+          fn_out.copy_in__dynamic(index, input_values + socket_info.offset);
         }
       }
       else {
-        fn_in.relocate_out__dynamic(i, output_values + m_output_offsets[socket.id()]);
+        SocketInfo &socket_info = m_output_info[socket.id()];
+        fn_in.relocate_out__dynamic(i, output_values + socket_info.offset);
         output_inits[socket.id()] = true;
 
-        if (m_output_socket_flags[socket.id()].is_fn_output) {
+        if (socket_info.is_fn_output) {
           uint index = m_fgraph.outputs().index(socket);
-          fn_out.copy_in__dynamic(index, output_values + m_output_offsets[socket.id()]);
+          fn_out.copy_in__dynamic(index, output_values + socket_info.offset);
         }
       }
     }
@@ -211,9 +200,10 @@ class ExecuteFGraph : public TupleCallBody {
             body->call__setup_stack(body_in, body_out, ctx, frame);
 
             for (uint output_id : m_graph->output_ids_of_node(node_id)) {
-              if (m_output_socket_flags[output_id].is_fn_output) {
+              SocketInfo &socket_info = m_output_info[output_id];
+              if (socket_info.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]);
+                fn_out.copy_in__dynamic(index, output_values + socket_info.offset);
               }
             }
 
@@ -225,14 +215,14 @@ class ExecuteFGraph : public TupleCallBody {
 
     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];
-        type_info->destruct_type(input_values + m_input_offsets[input_id]);
+        SocketInfo &socket_info = m_input_info[input_id];
+        socket_info.type->destruct_type(input_values + socket_info.offset);
       }
     }
     for (uint output_id = 0; output_id < m_outputs_init_buffer_size; output_id++) {
       if (output_inits[output_id]) {
-        CPPTypeInfo *type_info = m_output_types[output_id];
-        type_info->destruct_type(output_values + m_output_offsets[output_id]);
+        SocketInfo &socket_info = m_output_info[output_id];
+        socket_info.type->destruct_type(output_values + socket_info.offset);
       }
     }
   }
@@ -247,8 +237,10 @@ class ExecuteFGraph : public TupleCallBody {
   {
     BLI_assert(output_inits[output_id]);
     auto possible_target_ids = m_graph->targets_of_output(output_id);
-    CPPTypeInfo *type_info = m_output_types[output_id];
-    void *value_src = output_values + m_output_offsets[output_id];
+
+    SocketInfo &output_info = m_output_info[output_id];
+    CPPTypeInfo *type_info = output_info.type;
+    void *value_src = output_values + output_info.offset;
 
     uint *target_ids = BLI_array_alloca(target_ids, possible_target_ids.size());
     uint target_amount = 0;
@@ -265,7 +257,7 @@ class ExecuteFGraph : public TupleCallBody {
     }
     else if (target_amount == 1) {
       uint target_id = target_ids[0];
-      void *value_dst = input_values + m_input_offsets[target_id];
+      void *value_dst = input_values + m_input_info[target_id].offset;
       type_info->relocate_to_uninitialized(value_src, value_dst);
       output_inits[output_id] = false;
       input_inits[target_id] = true;
@@ -273,13 +265,13 @@ class ExecuteFGraph : public TupleCallBody {
     else {
       for (uint i = 1; i < target_amount; i++) {
         uint target_id = target_ids[i];
-        void *value_dst = input_values + m_input_offsets[target_id];
+        void *value_dst = input_values + m_input_info[target_id].offset;
         type_info->copy_to_uninitialized(value_src, value_dst);
         input_inits[target_id] = true;
       }
 
       uint target_id = target_ids[0];
-      void *value_dst = input_values + m_input_offsets[target_id];
+      void *value_dst = input_values + m_input_info[target_id].offset;
       type_info->copy_to_uninitialized(value_src, value_dst);
       output_inits[output_id] = false;
       input_inits[target_id] = true;
@@ -287,10 +279,11 @@ class ExecuteFGraph : public TupleCallBody {
 
     for (uint i = 0; i < target_amount; i++) {
       uint target_id = target_ids[i];
-      BLI_assert(type_info == m_input_types[target_id]);
-      if (m_input_socket_flags[target_id].is_fn_output) {
+      SocketInfo &socket_info = m_input_info[target_id];
+      BLI_assert(type_info == socket_info.type);
+      if (socket_info.is_fn_output) {
         uint index = m_fgraph.outputs().index(DFGraphSocket::FromInput(target_id));
-        void *value_ptr = input_values + m_input_offsets[target_id];
+        void *value_ptr = input_values + socket_info.offset;
         fn_out.copy_in__dynamic(index, value_ptr);
       }
     }



More information about the Bf-blender-cvs mailing list