[Bf-blender-cvs] [e2c8be0b3fe] lineart-fn-thread-loading: LineArt: Fix memory leaking issue in threaded loading.
YimingWu
noreply at git.blender.org
Tue Jun 1 15:32:25 CEST 2021
Commit: e2c8be0b3fe777001a05c0063a4f9488e545fbe1
Author: YimingWu
Date: Thu Apr 29 22:17:14 2021 +0800
Branches: lineart-fn-thread-loading
https://developer.blender.org/rBe2c8be0b3fe777001a05c0063a4f9488e545fbe1
LineArt: Fix memory leaking issue in threaded loading.
===================================================================
M source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
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/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
index 82f10c16113..ab9574982df 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h
@@ -313,7 +313,7 @@ typedef struct LineartRenderBuffer {
#define DBL_TRIANGLE_LIM 1e-8
#define DBL_EDGE_LIM 1e-9
-#define LRT_MEMORY_POOL_64MB (1 << 26)
+#define LRT_MEMORY_POOL_1MB (1 << 20)
typedef enum eLineartTriangleFlags {
LRT_CULL_DONT_CARE = 0,
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
index b753f7c66e9..2f4a89889ea 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c
@@ -1589,7 +1589,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
orig_ob = obi->original_ob;
BLI_spin_lock(&rb->lock_task);
- reln = lineart_list_append_pointer_pool_sized(
+ reln = lineart_list_append_pointer_pool_sized_thread(
&rb->vertex_buffer_pointers, &rb->render_data_pool, orv, sizeof(LineartElementLinkNode));
BLI_spin_unlock(&rb->lock_task);
@@ -1611,9 +1611,10 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
}
BLI_spin_lock(&rb->lock_task);
- reln = lineart_list_append_pointer_pool_sized(
+ reln = lineart_list_append_pointer_pool_sized_thread(
&rb->triangle_buffer_pointers, &rb->render_data_pool, ort, sizeof(LineartElementLinkNode));
BLI_spin_unlock(&rb->lock_task);
+
reln->element_count = bm->totface;
reln->object_ref = orig_ob;
reln->flags |= (usage == OBJECT_LRT_NO_INTERSECTION ? LRT_ELEMENT_NO_INTERSECTION : 0);
@@ -1621,7 +1622,10 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
/* Note this memory is not from pool, will be deleted after culling. */
orta = MEM_callocN(sizeof(LineartTriangleAdjacent) * bm->totface, "LineartTriangleAdjacent");
/* Link is minimal so we use pool anyway. */
- lineart_list_append_pointer_pool(&rb->triangle_adjacent_pointers, &rb->render_data_pool, orta);
+ BLI_spin_lock(&rb->lock_task);
+ lineart_list_append_pointer_pool_thread(
+ &rb->triangle_adjacent_pointers, &rb->render_data_pool, orta);
+ BLI_spin_unlock(&rb->lock_task);
for (i = 0; i < bm->totvert; i++) {
v = BM_vert_at_index(bm, i);
@@ -1692,7 +1696,7 @@ static void lineart_geometry_object_load(LineartObjectInfo *obi, LineartRenderBu
o_la_s = lineart_mem_aquire_thread(&rb->render_data_pool,
sizeof(LineartLineSegment) * allocate_la_e);
BLI_spin_lock(&rb->lock_task);
- reln = lineart_list_append_pointer_pool_sized(
+ reln = lineart_list_append_pointer_pool_sized_thread(
&rb->line_buffer_pointers, &rb->render_data_pool, o_la_e, sizeof(LineartElementLinkNode));
BLI_spin_unlock(&rb->lock_task);
reln->element_count = allocate_la_e;
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h b/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
index 47ca6e45bd5..4c37056babd 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h
@@ -43,6 +43,13 @@ void *lineart_list_append_pointer_pool_sized(ListBase *h,
struct LineartStaticMemPool *smp,
void *data,
int size);
+void *lineart_list_append_pointer_pool_thread(ListBase *h,
+ struct LineartStaticMemPool *smp,
+ void *data);
+void *lineart_list_append_pointer_pool_sized_thread(ListBase *h,
+ LineartStaticMemPool *smp,
+ void *data,
+ int size);
void *list_push_pointer_static(ListBase *h, struct LineartStaticMemPool *smp, void *p);
void *list_push_pointer_static_sized(ListBase *h,
struct LineartStaticMemPool *smp,
diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_util.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_util.c
index dcb1f9cde5d..a9b0a6e9ce0 100644
--- a/source/blender/gpencil_modifiers/intern/lineart/lineart_util.c
+++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_util.c
@@ -62,6 +62,31 @@ void *lineart_list_append_pointer_pool_sized(ListBase *h,
BLI_addtail(h, lip);
return lip;
}
+void *lineart_list_append_pointer_pool_thread(ListBase *h, LineartStaticMemPool *smp, void *data)
+{
+ LinkData *lip;
+ if (h == NULL) {
+ return 0;
+ }
+ lip = lineart_mem_aquire_thread(smp, sizeof(LinkData));
+ lip->data = data;
+ BLI_addtail(h, lip);
+ return lip;
+}
+void *lineart_list_append_pointer_pool_sized_thread(ListBase *h,
+ LineartStaticMemPool *smp,
+ void *data,
+ int size)
+{
+ LinkData *lip;
+ if (h == NULL) {
+ return 0;
+ }
+ lip = lineart_mem_aquire_thread(smp, size);
+ lip->data = data;
+ BLI_addtail(h, lip);
+ return lip;
+}
void *lineart_list_pop_pointer_no_free(ListBase *h)
{
@@ -82,10 +107,10 @@ void lineart_list_remove_pointer_item_no_free(ListBase *h, LinkData *lip)
LineartStaticMemPoolNode *lineart_mem_new_static_pool(LineartStaticMemPool *smp, size_t size)
{
size_t set_size = size;
- if (set_size < LRT_MEMORY_POOL_64MB) {
- set_size = LRT_MEMORY_POOL_64MB; /* Prevent too many small allocations. */
+ if (set_size < LRT_MEMORY_POOL_1MB) {
+ set_size = LRT_MEMORY_POOL_1MB; /* Prevent too many small allocations. */
}
- size_t total_size = size + sizeof(LineartStaticMemPoolNode);
+ size_t total_size = set_size + sizeof(LineartStaticMemPoolNode);
LineartStaticMemPoolNode *smpn = MEM_callocN(total_size, "mempool");
smpn->size = total_size;
smpn->used_byte = sizeof(LineartStaticMemPoolNode);
@@ -211,7 +236,7 @@ void lineart_count_and_print_render_buffer_memory(LineartRenderBuffer *rb)
LISTBASE_FOREACH (LineartStaticMemPoolNode *, smpn, &rb->render_data_pool.pools) {
count_this++;
- sum_this += LRT_MEMORY_POOL_64MB;
+ sum_this += LRT_MEMORY_POOL_1MB;
}
printf("LANPR Memory allocated %zu Standalone nodes, total %zu Bytes.\n", count_this, sum_this);
total += sum_this;
More information about the Bf-blender-cvs
mailing list