Commit: 5860d4e240396a3a16d9b2b7f940214a8444c48a Author: YimingWu Date: Fri May 14 19:15:48 2021 +0800 Branches: temp-lineart-contained https://developer.blender.org/rB5860d4e240396a3a16d9b2b7f940214a8444c48a
LineArt: Use array instead of array for ba->linked_edge =================================================================== M source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h M source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c M source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c =================================================================== diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h index d3e3aa5ce92..7e980669a33 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h +++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h @@ -216,6 +216,7 @@ enum eLineArtTileRecursiveLimit { }; #define LRT_TILE_SPLITTING_TRIANGLE_LIMIT 100 +#define LRT_TILE_EDGE_COUNT_INITIAL 32 typedef struct LineartRenderBuffer { struct LineartRenderBuffer *prev, *next; @@ -470,11 +471,12 @@ typedef struct LineartBoundingArea { short triangle_count; short max_triangle_count; + short line_count; + short max_line_count; /* Use array for speeding up multiple accesses. */ struct LineartTriangle **linked_triangles; - - ListBase linked_lines; + struct LineartEdge **linked_lines; /** Reserved for image space reduction && multi-thread chaining. */ ListBase linked_chains; diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c index 53fb0b7333d..9b1f6becde5 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_chain.c @@ -41,8 +41,8 @@ static LineartEdge *lineart_line_get_connected(LineartBoundingArea *ba, int match_flag, unsigned char match_isec_mask) { - LISTBASE_FOREACH (LinkData *, lip, &ba->linked_lines) { - LineartEdge *n_e = lip->data; + for (int i = 0; i < ba->line_count; i++) { + LineartEdge *n_e = ba->linked_lines[i]; if ((!(n_e->flags & LRT_EDGE_FLAG_ALL_TYPE)) || (n_e->flags & LRT_EDGE_FLAG_CHAIN_PICKED)) { continue; diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c index 3abf5b0bb20..ed951ca43b8 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c @@ -335,6 +335,21 @@ static void lineart_bounding_area_triangle_add(LineartRenderBuffer *rb, ba->triangle_count++; } +static void lineart_bounding_area_line_add(LineartRenderBuffer *rb, + LineartBoundingArea *ba, + LineartEdge *rl) +{ + if (ba->line_count >= ba->max_line_count) { + LineartEdge **new_array = lineart_mem_aquire(&rb->render_data_pool, + sizeof(LineartEdge *) * ba->max_line_count * 2); + memcpy(new_array, ba->linked_lines, sizeof(LineartEdge *) * ba->max_line_count); + ba->max_line_count *= 2; + ba->linked_lines = new_array; + } + ba->linked_lines[ba->line_count] = rl; + ba->line_count++; +} + static void lineart_occlusion_single_line(LineartRenderBuffer *rb, LineartEdge *e, int thread_id) { double x = e->v1->fbcoord[0], y = e->v1->fbcoord[1]; @@ -3094,8 +3109,11 @@ static void lineart_main_bounding_area_make_initial(LineartRenderBuffer *rb) /* Init linked_triangles array. */ ba->max_triangle_count = LRT_TILE_SPLITTING_TRIANGLE_LIMIT; + ba->max_line_count = LRT_TILE_EDGE_COUNT_INITIAL; ba->linked_triangles = lineart_mem_aquire( - &rb->render_data_pool, sizeof(LineartTriangle *) * LRT_TILE_SPLITTING_TRIANGLE_LIMIT); + &rb->render_data_pool, sizeof(LineartTriangle *) * ba->max_triangle_count); + ba->linked_lines = lineart_mem_aquire(&rb->render_data_pool, + sizeof(LineartEdge *) * ba->max_line_count); /* Link adjacent ones. */ if (row) { @@ -3314,8 +3332,11 @@ static void lineart_bounding_area_split(LineartRenderBuffer *rb, /* Init linked_triangles array. */ for (int i = 0; i < 4; i++) { ba[i].max_triangle_count = LRT_TILE_SPLITTING_TRIANGLE_LIMIT; + ba[i].max_line_count = LRT_TILE_EDGE_COUNT_INITIAL; ba[i].linked_triangles = lineart_mem_aquire( &rb->render_data_pool, sizeof(LineartTriangle *) * LRT_TILE_SPLITTING_TRIANGLE_LIMIT); + ba[i].linked_lines = lineart_mem_aquire(&rb->render_data_pool, + sizeof(LineartEdge *) * LRT_TILE_EDGE_COUNT_INITIAL); } for (int i = 0; i < root->triangle_count; i++) { @@ -3340,7 +3361,8 @@ static void lineart_bounding_area_split(LineartRenderBuffer *rb, } } - while ((e = lineart_list_pop_pointer_no_free(&root->linked_lines)) != NULL) { + for (int i = 0; i < root->line_count; i++) { + e = root->linked_lines[i]; lineart_bounding_area_link_line(rb, root, e); } @@ -3488,7 +3510,7 @@ static void lineart_bounding_area_link_line(LineartRenderBuffer *rb, LineartEdge *e) { if (root_ba->child == NULL) { - lineart_list_append_pointer_pool(&root_ba->linked_lines, &rb->render_data_pool, e); + lineart_bounding_area_line_add(rb, root_ba, e); } else { if (lineart_bounding_area_line_intersect( _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org https://lists.blender.org/mailman/listinfo/bf-blender-cvs