[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