[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