Commit: 2f6eca4af35fec898dc258f79c3b14a0dcd37a08 Author: YimingWu Date: Thu Apr 29 22:17:14 2021 +0800 Branches: temp-lineart-contained https://developer.blender.org/rB2f6eca4af35fec898dc258f79c3b14a0dcd37a08
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 696623f9ef9..e5e01f3a813 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h +++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h @@ -346,7 +346,7 @@ typedef struct LineartCache { #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 73a79093d20..31a6ba8b416 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c @@ -1622,7 +1622,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); @@ -1644,9 +1644,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); @@ -1654,7 +1655,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); @@ -1725,7 +1729,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 2c3130b46c9..9562d52a336 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 4d136fe0d0e..909c02d74ca 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; _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs