[Bf-blender-cvs] [f14ad1eabfc] temp-lineart-contained: LineArt: Thread optimized memory pool

YimingWu noreply at git.blender.org
Sun Apr 3 12:04:13 CEST 2022


Commit: f14ad1eabfcb23a1854c58fbe174cdac4f1e246f
Author: YimingWu
Date:   Tue Mar 29 10:41:29 2022 +0800
Branches: temp-lineart-contained
https://developer.blender.org/rBf14ad1eabfcb23a1854c58fbe174cdac4f1e246f

LineArt: Thread optimized memory pool

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

M	source/blender/gpencil_modifiers/CMakeLists.txt
M	source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
A	source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
M	source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
M	source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
M	source/blender/gpencil_modifiers/intern/lineart/lineart_util.c

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

diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt
index 6108629183c..94df32478b0 100644
--- a/source/blender/gpencil_modifiers/CMakeLists.txt
+++ b/source/blender/gpencil_modifiers/CMakeLists.txt
@@ -1,6 +1,18 @@
 # SPDX-License-Identifier: GPL-2.0-or-later
 # Copyright 2018 Blender Foundation. All rights reserved.
 
+if(WITH_TBB)
+  add_definitions(-DWITH_TBB)
+
+  list(APPEND INC_SYS
+    ${TBB_INCLUDE_DIRS}
+  )
+
+  list(APPEND LIB
+    ${TBB_LIBRARIES}
+  )
+endif()
+
 set(INC
   .
   intern
@@ -24,10 +36,19 @@ set(INC
   ${CMAKE_BINARY_DIR}/source/blender/makesrna
 )
 
-set(INC_SYS
+list(APPEND INC_SYS
   ${ZLIB_INCLUDE_DIRS}
 )
 
+if(WITH_CYCLES_EMBREE)
+  add_definitions(-DWITH_EMBREE)
+  add_definitions(-DEMBREE_STATIC_LIB)
+  include_directories(
+    SYSTEM
+    ${EMBREE_INCLUDE_DIRS}
+  )
+endif()
+
 set(SRC
   intern/MOD_gpencil_ui_common.c
 
@@ -64,6 +85,7 @@ set(SRC
   intern/MOD_gpencil_util.h
 
   # Lineart code
+  intern/lineart/lineart_cpp_bridge.cpp
   intern/lineart/lineart_chain.c
   intern/lineart/lineart_cpu.c
   intern/lineart/lineart_ops.c
diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 3c6eb8a47af..1c69ed56afb 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -29,10 +29,12 @@ typedef struct LineartStaticMemPoolNode {
   /* User memory starts here */
 } LineartStaticMemPoolNode;
 
-typedef struct LineartStaticMemPool {
+typedef struct _LineartMemPool {
   ListBase pools;
   SpinLock lock_mem;
-} LineartStaticMemPool;
+} _LineartMemPool;
+
+typedef struct _LineartMemPool *LineartMemPool;
 
 typedef struct LineartTriangleAdjacent {
   struct LineartEdge *e[3];
@@ -244,13 +246,13 @@ typedef struct LineartRenderBuffer {
 
   ListBase intersecting_vertex_buffer;
   /** Use the one comes with Line Art. */
-  LineartStaticMemPool render_data_pool;
+  LineartMemPool render_data_pool;
   ListBase wasted_cuts;
   SpinLock lock_cuts;
 
   /* This is just a reference to LineartCache::chain_data_pool, which is not cleared after line art
    * completes which serves as a cache. */
-  LineartStaticMemPool *chain_data_pool;
+  LineartMemPool *chain_data_pool;
 
   /*  Render status */
   double view_vector[3];
@@ -340,7 +342,7 @@ typedef struct LineartRenderBuffer {
 typedef struct LineartCache {
   /** Separate memory pool for chain data, this goes to the cache, so when we free the main pool,
    * chains will still be available. */
-  LineartStaticMemPool chain_data_pool;
+  LineartMemPool chain_data_pool;
 
   /** A copy of rb->Chains after calculation is done, then we can destroy rb. */
   ListBase chains;
@@ -737,3 +739,15 @@ void MOD_lineart_gpencil_generate(LineartCache *cache,
 float MOD_lineart_chain_compute_length(LineartEdgeChain *ec);
 
 void ED_operatortypes_lineart(void);
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+LineartMemPool lineart_mem_init(void);
+LineartMemPool lineart_mem_local(LineartMemPool smp);
+void lineart_mem_destroy_internal(LineartMemPool *mp);
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
new file mode 100644
index 00000000000..ab372e7ab04
--- /dev/null
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp
@@ -0,0 +1,46 @@
+
+#include "MOD_lineart.h"
+
+#include "lineart_intern.h"
+
+#include "BLI_enumerable_thread_specific.hh"
+#include "BLI_task.h"
+#include "BLI_utildefines.h"
+#include "BLI_vector.hh"
+
+#include "MEM_guardedalloc.h"
+
+using blender::Vector;
+using blender::threading::EnumerableThreadSpecific;
+
+typedef EnumerableThreadSpecific<_LineartMemPool> _LineartStaticMemPoolThread;
+typedef struct _LineartMemPool *LineartMemPool;
+
+LineartMemPool lineart_mem_init()
+{
+  _LineartStaticMemPoolThread *result = new _LineartStaticMemPoolThread;
+  return (LineartMemPool)result;
+}
+
+LineartMemPool lineart_mem_local(LineartMemPool smp)
+{
+  _LineartStaticMemPoolThread *smp_thread = (_LineartStaticMemPoolThread *)smp;
+  return (LineartMemPool)&smp_thread->local();
+}
+
+void lineart_mem_destroy_internal(LineartMemPool *mp)
+{
+  if (!(*mp)) {
+    return;
+  }
+  for (const _LineartMemPool &local : (*(_LineartStaticMemPoolThread *)(*mp))) {
+    LineartStaticMemPoolNode *smpn;
+    _LineartMemPool *smp = (_LineartMemPool *)(&local);
+    while ((smpn = (LineartStaticMemPoolNode *)BLI_pophead(&smp->pools)) != NULL) {
+      MEM_freeN(smpn);
+    }
+  }
+  _LineartStaticMemPoolThread *smp_thread = (_LineartStaticMemPoolThread *)(*mp);
+  delete smp_thread;
+  (*mp) = NULL;
+}
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index 69b4eb0efc5..caf5bfccef8 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -2756,8 +2756,8 @@ static void lineart_object_load_worker(TaskPool *__restrict UNUSED(pool),
   //- Assign the number of objects instead of number of threads
   printf("thread start: %d\n", olti->thread_id);
   for (LineartObjectInfo *obi = olti->pending; obi; obi = obi->next) {
-    lineart_geometry_object_load_no_bmesh(obi, olti->rb);
-    // lineart_geometry_object_load(obi, olti->rb);
+    // lineart_geometry_object_load_no_bmesh(obi, olti->rb);
+    lineart_geometry_object_load(obi, olti->rb);
     printf("thread id: %d processed: %d\n", olti->thread_id, obi->original_me->totpoly);
   }
   printf("thread end: %d\n", olti->thread_id);
@@ -3823,7 +3823,7 @@ static void lineart_destroy_render_data(LineartRenderBuffer *rb)
 
   BLI_spin_end(&rb->lock_task);
   BLI_spin_end(&rb->lock_cuts);
-  BLI_spin_end(&rb->render_data_pool.lock_mem);
+  // BLI_spin_end(&rb->render_data_pool.lock_mem);
 
   for (int i = 0; i < rb->bounding_area_initial_count; i++) {
     BLI_spin_end(&rb->lock_bounding_areas[i]);
@@ -3989,7 +3989,7 @@ static LineartRenderBuffer *lineart_create_render_buffer(Scene *scene,
 
   BLI_spin_init(&rb->lock_task);
   BLI_spin_init(&rb->lock_cuts);
-  BLI_spin_init(&rb->render_data_pool.lock_mem);
+  // BLI_spin_init(&rb->render_data_pool.lock_mem);
 
   rb->thread_count = BKE_render_num_threads(&scene->r);
 
@@ -4093,7 +4093,7 @@ static void lineart_bounding_areas_connect_new(LineartRenderBuffer *rb, LineartB
 {
   LineartBoundingArea *ba = root->child, *tba;
   LinkData *lip2, *next_lip;
-  LineartStaticMemPool *mph = &rb->render_data_pool;
+  LineartMemPool *mph = &rb->render_data_pool;
 
   /* Inter-connection with newly created 4 child bounding areas. */
   lineart_list_append_pointer_pool(&ba[1].rp, mph, &ba[0]);
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h b/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
index 5f6cc5086e5..d2c38dd87b3 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
@@ -19,40 +19,33 @@
 
 struct LineartEdge;
 struct LineartRenderBuffer;
-struct LineartStaticMemPool;
+typedef struct _LineartMemPool *LineartMemPool;
 struct LineartStaticMemPoolNode;
 
-void *lineart_list_append_pointer_pool(ListBase *list,
-                                       struct LineartStaticMemPool *smp,
-                                       void *data);
+void *lineart_list_append_pointer_pool(ListBase *list, LineartMemPool *smp, void *data);
 void *lineart_list_append_pointer_pool_sized(ListBase *list,
-                                             struct LineartStaticMemPool *smp,
+                                             LineartMemPool *smp,
                                              void *data,
                                              int size);
-void *lineart_list_append_pointer_pool_thread(ListBase *list,
-                                              struct LineartStaticMemPool *smp,
-                                              void *data);
+void *lineart_list_append_pointer_pool_thread(ListBase *list, LineartMemPool *smp, void *data);
 void *lineart_list_append_pointer_pool_sized_thread(ListBase *list,
-                                                    LineartStaticMemPool *smp,
+                                                    LineartMemPool *smp,
                                                     void *data,
                                                     int size);
-void *list_push_pointer_static(ListBase *list, struct LineartStaticMemPool *smp, void *p);
-void *list_push_pointer_static_sized(ListBase *list,
-                                     struct LineartStaticMemPool *smp,
-                                     void *p,
-                                     int size);
+void *list_push_pointer_static(ListBase *list, LineartMemPool *smp, void *p);
+void *list_push_pointer_static_sized(ListBase *list, LineartMemPool *smp, void *p, int size);
 
 void *lineart_list_pop_pointer_no_free(ListBase *list);
 void lineart_list_remove_pointer_item_no_free(ListBase *list, LinkData *lip);
 
-struct LineartStaticMemPoolNode *lineart_mem_new_static_pool(struct LineartStaticMemPool *smp,
+struct LineartStaticMemPoolNode *lineart_mem_new_static_pool(struct _LineartMemPool *smp,
                                                              size_t size);
-void *lineart_mem_acquire(struct LineartStaticMemPool *smp, size_t size);
-void *lineart_mem_acquire_thread(struct LineartStaticMemPool *smp, size_t size);
-void lineart_mem_destroy(struct LineartStaticMemPool *smp);
+void *lineart_mem_acquire(LineartMemPool *mp, size_t size);
+void *lineart_mem_acquire_thread(LineartMemPool *mp, size_t size);
+void lineart_mem_destroy(LineartMemPool *mp);
 
 void lineart_prepend_edge_direct(void **list_head, void *node);
-void lineart_prepend_pool(LinkNode **first, struct LineartStaticMemPool *smp, void *link);
+void lineart_prepend_pool(LinkNode **first, LineartMemPool *smp, void *link);
 
 void lineart_matrix_ortho_44d(double (*mP

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list