[Bf-blender-cvs] [a4a46d8a973] functions-experimental-refactor: use monotonic allocator for vtree generation

Jacques Lucke noreply at git.blender.org
Thu Nov 7 15:06:18 CET 2019


Commit: a4a46d8a9738fc1fca9db4e39b5076e666bce869
Author: Jacques Lucke
Date:   Thu Nov 7 13:21:39 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rBa4a46d8a9738fc1fca9db4e39b5076e666bce869

use monotonic allocator for vtree generation

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

M	source/blender/blenkernel/BKE_virtual_node_tree.h
M	source/blender/blenkernel/intern/virtual_node_tree.cc
M	source/blender/blenlib/BLI_monotonic_allocator.h
M	source/blender/blenlib/BLI_resource_collector.h
M	source/blender/functions/intern/vtree_multi_function_network/builder.cc

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

diff --git a/source/blender/blenkernel/BKE_virtual_node_tree.h b/source/blender/blenkernel/BKE_virtual_node_tree.h
index a8da57949fa..331abeee820 100644
--- a/source/blender/blenkernel/BKE_virtual_node_tree.h
+++ b/source/blender/blenkernel/BKE_virtual_node_tree.h
@@ -6,6 +6,7 @@
 #include "BLI_array_cxx.h"
 #include "BLI_string_ref.h"
 #include "BLI_string_map.h"
+#include "BLI_resource_collector.h"
 
 #include "DNA_node_types.h"
 
@@ -15,6 +16,7 @@ namespace BKE {
 
 using BLI::Array;
 using BLI::ArrayRef;
+using BLI::ResourceCollector;
 using BLI::StringMap;
 using BLI::StringRef;
 using BLI::StringRefNull;
@@ -62,11 +64,11 @@ class VBSocket : BLI::NonCopyable, BLI::NonMovable {
   uint id();
 };
 
-class VBInputSocket : public VBSocket {
+class VBInputSocket final : public VBSocket {
  public:
 };
 
-class VBOutputSocket : public VBSocket {
+class VBOutputSocket final : public VBSocket {
  public:
 };
 
@@ -101,6 +103,7 @@ class VBLink : BLI::NonCopyable, BLI::NonMovable {
 
 class VirtualNodeTreeBuilder : BLI::NonCopyable, BLI::NonMovable {
  private:
+  BLI::MonotonicAllocator<> m_allocator;
   Vector<VBNode *> m_nodes_by_id;
   Vector<VBSocket *> m_sockets_by_id;
   Vector<VBInputSocket *> m_input_sockets;
@@ -167,13 +170,13 @@ class VSocket : BLI::NonCopyable, BLI::NonMovable {
   bNodeTree *btree() const;
 };
 
-class VInputSocket : public VSocket {
+class VInputSocket final : public VSocket {
  public:
   ArrayRef<const VOutputSocket *> linked_sockets() const;
   ArrayRef<const VOutputSocket *> directly_linked_sockets() const;
 };
 
-class VOutputSocket : public VSocket {
+class VOutputSocket final : public VSocket {
  public:
   ArrayRef<const VInputSocket *> linked_sockets() const;
   ArrayRef<const VInputSocket *> directly_linked_sockets() const;
@@ -211,6 +214,7 @@ class VNode : BLI::NonCopyable, BLI::NonMovable {
 
 class VirtualNodeTree : BLI::NonCopyable, BLI::NonMovable {
  private:
+  BLI::MonotonicAllocator<> m_allocator;
   Array<VNode *> m_nodes_by_id;
   Array<VSocket *> m_sockets_by_id;
   Vector<VInputSocket *> m_input_sockets;
diff --git a/source/blender/blenkernel/intern/virtual_node_tree.cc b/source/blender/blenkernel/intern/virtual_node_tree.cc
index 34d475b357d..5235c70b77e 100644
--- a/source/blender/blenkernel/intern/virtual_node_tree.cc
+++ b/source/blender/blenkernel/intern/virtual_node_tree.cc
@@ -13,65 +13,65 @@ using BLinkList = BLI::IntrusiveListBaseWrapper<bNodeLink>;
 VirtualNodeTreeBuilder::~VirtualNodeTreeBuilder()
 {
   for (VBNode *node : m_nodes_by_id) {
-    delete node;
+    node->~VBNode();
   }
   for (VBInputSocket *socket : m_input_sockets) {
-    delete socket;
+    socket->~VBInputSocket();
   }
   for (VBOutputSocket *socket : m_output_sockets) {
-    delete socket;
+    socket->~VBOutputSocket();
   }
   for (VBLink *link : m_links) {
-    delete link;
+    link->~VBLink();
   }
 }
 
 VBNode &VirtualNodeTreeBuilder::add_node(bNodeTree *btree, bNode *bnode)
 {
-  VBNode *node = new VBNode();
-  node->m_vtree = this;
-  node->m_id = m_nodes_by_id.size();
-  node->m_btree = btree;
-  node->m_bnode = bnode;
+  VBNode &node = *m_allocator.construct<VBNode>().release();
+  node.m_vtree = this;
+  node.m_id = m_nodes_by_id.size();
+  node.m_btree = btree;
+  node.m_bnode = bnode;
 
   for (bNodeSocket *bsocket : BSocketList(bnode->inputs)) {
-    VBInputSocket *socket = new VBInputSocket();
-    socket->m_node = node;
-    socket->m_is_input = true;
-    socket->m_id = m_sockets_by_id.size();
-    socket->m_btree = btree;
-    socket->m_bsocket = bsocket;
-    socket->m_index = node->m_inputs.size();
+    VBInputSocket &socket = *m_allocator.construct<VBInputSocket>().release();
+    socket.m_node = &node;
+    socket.m_is_input = true;
+    socket.m_id = m_sockets_by_id.size();
+    socket.m_btree = btree;
+    socket.m_bsocket = bsocket;
+    socket.m_index = node.m_inputs.size();
 
-    m_input_sockets.append(socket);
-    m_sockets_by_id.append(socket);
-    node->m_inputs.append(socket);
+    m_input_sockets.append(&socket);
+    m_sockets_by_id.append(&socket);
+    node.m_inputs.append(&socket);
   }
 
   for (bNodeSocket *bsocket : BSocketList(bnode->outputs)) {
-    VBOutputSocket *socket = new VBOutputSocket();
-    socket->m_node = node;
-    socket->m_is_input = false;
-    socket->m_id = m_sockets_by_id.size();
-    socket->m_btree = btree;
-    socket->m_bsocket = bsocket;
-    socket->m_index = node->m_outputs.size();
+    VBOutputSocket &socket = *m_allocator.construct<VBOutputSocket>().release();
+    socket.m_node = &node;
+    socket.m_is_input = false;
+    socket.m_id = m_sockets_by_id.size();
+    socket.m_btree = btree;
+    socket.m_bsocket = bsocket;
+    socket.m_index = node.m_outputs.size();
 
-    m_output_sockets.append(socket);
-    m_sockets_by_id.append(socket);
-    node->m_outputs.append(socket);
+    m_output_sockets.append(&socket);
+    m_sockets_by_id.append(&socket);
+    node.m_outputs.append(&socket);
   }
 
-  m_nodes_by_id.append(node);
-  return *node;
+  m_nodes_by_id.append(&node);
+  return node;
 }
 
 void VirtualNodeTreeBuilder::add_link(VBOutputSocket &from, VBInputSocket &to)
 {
-  VBLink *link = new VBLink();
-  link->m_from = &from;
-  link->m_to = &to;
-  m_links.append(link);
+  VBLink &link = *m_allocator.construct<VBLink>().release();
+  link.m_from = &from;
+  link.m_to = &to;
+  m_links.append(&link);
 }
 
 void VirtualNodeTreeBuilder::add_all_of_node_tree(bNodeTree *btree)
@@ -114,46 +114,46 @@ std::unique_ptr<VirtualNodeTree> VirtualNodeTreeBuilder::build()
 void VirtualNodeTreeBuilder::build__copy_nodes_and_sockets(VirtualNodeTree &vtree)
 {
   for (VBNode *vbnode : m_nodes_by_id) {
-    VNode *vnode = new VNode();
-    vnode->m_bnode = vbnode->m_bnode;
-    vnode->m_btree = vbnode->m_btree;
-    vnode->m_id = vbnode->m_id;
-    vnode->m_vtree = &vtree;
-    RNA_pointer_create((ID *)vnode->m_btree, &RNA_Node, vnode->m_bnode, &vnode->m_rna);
+    VNode &vnode = *vtree.m_allocator.construct<VNode>().release();
+    vnode.m_bnode = vbnode->m_bnode;
+    vnode.m_btree = vbnode->m_btree;
+    vnode.m_id = vbnode->m_id;
+    vnode.m_vtree = &vtree;
+    RNA_pointer_create((ID *)vnode.m_btree, &RNA_Node, vnode.m_bnode, &vnode.m_rna);
 
     for (VBInputSocket *vbsocket : vbnode->m_inputs) {
-      VInputSocket *vsocket = new VInputSocket();
-      vsocket->m_bsocket = vbsocket->m_bsocket;
-      vsocket->m_btree = vbsocket->m_btree;
-      vsocket->m_id = vbsocket->m_id;
-      vsocket->m_index = vbsocket->m_index;
-      vsocket->m_node = vnode;
-      vsocket->m_is_input = true;
+      VInputSocket &vsocket = *vtree.m_allocator.construct<VInputSocket>().release();
+      vsocket.m_bsocket = vbsocket->m_bsocket;
+      vsocket.m_btree = vbsocket->m_btree;
+      vsocket.m_id = vbsocket->m_id;
+      vsocket.m_index = vbsocket->m_index;
+      vsocket.m_node = &vnode;
+      vsocket.m_is_input = true;
       RNA_pointer_create(
-          (ID *)vsocket->m_btree, &RNA_NodeSocket, vsocket->m_bsocket, &vsocket->m_rna);
+          (ID *)vsocket.m_btree, &RNA_NodeSocket, vsocket.m_bsocket, &vsocket.m_rna);
 
-      vnode->m_inputs.append(vsocket);
-      vtree.m_sockets_by_id[vsocket->m_id] = vsocket;
-      vtree.m_input_sockets.append(vsocket);
+      vnode.m_inputs.append(&vsocket);
+      vtree.m_sockets_by_id[vsocket.m_id] = &vsocket;
+      vtree.m_input_sockets.append(&vsocket);
     }
 
     for (VBOutputSocket *vbsocket : vbnode->m_outputs) {
-      VOutputSocket *vsocket = new VOutputSocket();
-      vsocket->m_bsocket = vbsocket->m_bsocket;
-      vsocket->m_btree = vbsocket->m_btree;
-      vsocket->m_id = vbsocket->m_id;
-      vsocket->m_index = vbsocket->m_index;
-      vsocket->m_node = vnode;
-      vsocket->m_is_input = false;
+      VOutputSocket &vsocket = *vtree.m_allocator.construct<VOutputSocket>().release();
+      vsocket.m_bsocket = vbsocket->m_bsocket;
+      vsocket.m_btree = vbsocket->m_btree;
+      vsocket.m_id = vbsocket->m_id;
+      vsocket.m_index = vbsocket->m_index;
+      vsocket.m_node = &vnode;
+      vsocket.m_is_input = false;
       RNA_pointer_create(
-          (ID *)vsocket->m_btree, &RNA_NodeSocket, vsocket->m_bsocket, &vsocket->m_rna);
+          (ID *)vsocket.m_btree, &RNA_NodeSocket, vsocket.m_bsocket, &vsocket.m_rna);
 
-      vnode->m_outputs.append(vsocket);
-      vtree.m_sockets_by_id[vsocket->m_id] = vsocket;
-      vtree.m_output_sockets.append(vsocket);
+      vnode.m_outputs.append(&vsocket);
+      vtree.m_sockets_by_id[vsocket.m_id] = &vsocket;
+      vtree.m_output_sockets.append(&vsocket);
     }
 
-    vtree.m_nodes_by_id[vnode->m_id] = vnode;
+    vtree.m_nodes_by_id[vnode.m_id] = &vnode;
   }
 }
 
@@ -216,13 +216,13 @@ void VirtualNodeTreeBuilder::build__create_idname_to_nodes_mapping(VirtualNodeTr
 VirtualNodeTree::~VirtualNodeTree()
 {
   for (VNode *node : m_nodes_by_id) {
-    delete node;
+    node->~VNode();
   }
   for (VInputSocket *socket : m_input_sockets) {
-    delete socket;
+    socket->~VInputSocket();
   }
   for (VOutputSocket *socket : m_output_sockets) {
-    delete socket;
+    socket->~VOutputSocket();
   }
 }
 
diff --git a/source/blender/blenlib/BLI_monotonic_allocator.h b/source/blender/blenlib/BLI_monotonic_allocator.h
index 74fb6ea1d72..cbc4c54eaf1 100644
--- a/source/blender/blenlib/BLI_monotonic_allocator.h
+++ b/source/blender/blenlib/BLI_monotonic_allocator.h
@@ -26,6 +26,7 @@
 
 #include "BLI_vector.h"
 #include "BLI_utility_mixins.h"
+#include "BLI_timeit.h"
 
 namespace BLI {
 
@@ -45,7 +46,7 @@ class MonotonicAllocator : NonCopyable, NonMovable {
   MonotonicAllocator()
       : m_current_buffer(m_inline_buffer.ptr()),
         m_remaining_capacity(N),
-        m_next_min_alloc_size(N * 2)
+        m_next_min_alloc_size(std::max<uint>(N * 2, 16))
   {
   }
 
@@ -89,11 +90,18 @@ class MonotonicAllocator : NonCopyable, NonMovable {
     }
   };
 
+  template<typename T, typename... Args> destruct_ptr<T> construct(Args &&... args)
+  {
+    void *buffer = this->allocate(sizeof(T), alignof(T));
+    T *value = new (buffer) T(std::forward<Args>(args)...);
+    return destruct_ptr<T>(value);
+  }
+
  private:
   void allocate_new_buffer(uint min_allocatio

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list