Commit: 5ba3e6001fe046b432b4c3aa0e321471e70ad626 Author: YimingWu Date: Mon Apr 25 16:56:06 2022 +0800 Branches: lineart-object-load https://developer.blender.org/rB5ba3e6001fe046b432b4c3aa0e321471e70ad626
LineArt: Try using sort/parallel_sort but crashes =================================================================== 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 =================================================================== diff --git a/source/blender/gpencil_modifiers/CMakeLists.txt b/source/blender/gpencil_modifiers/CMakeLists.txt index 6108629183c..3b6f00b56d8 100644 --- a/source/blender/gpencil_modifiers/CMakeLists.txt +++ b/source/blender/gpencil_modifiers/CMakeLists.txt @@ -68,12 +68,29 @@ set(SRC intern/lineart/lineart_cpu.c intern/lineart/lineart_ops.c intern/lineart/lineart_util.c + intern/lineart/lineart_cpp_bridge.cpp intern/lineart/MOD_lineart.h intern/lineart/lineart_intern.h ) +if(WITH_TBB) +add_definitions(-DWITH_TBB) +if(WIN32) + # TBB includes Windows.h which will define min/max macros + # that will collide with the stl versions. + add_definitions(-DNOMINMAX) +endif() +list(APPEND INC_SYS + ${TBB_INCLUDE_DIRS} +) + +list(APPEND LIB + ${TBB_LIBRARIES} +) +endif() + set(LIB ) diff --git a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h index 830066ac0fb..a30ec4490cf 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h +++ b/source/blender/gpencil_modifiers/intern/lineart/MOD_lineart.h @@ -197,6 +197,12 @@ typedef struct LineartChainRegisterEntry { char is_left; } LineartChainRegisterEntry; +typedef struct LineartAdjacentItem { + unsigned int v1; + unsigned int v2; + unsigned int e; +} LineartAdjacentItem; + enum eLineArtTileRecursiveLimit { /* If tile gets this small, it's already much smaller than a pixel. No need to continue * splitting. */ 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..2a630e69665 --- /dev/null +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpp_bridge.cpp @@ -0,0 +1,28 @@ +#include "BLI_sort.hh" +#include "BLI_vector.hh" +#include "MOD_lineart.h" +#include "lineart_intern.h" + +static int cmp_adjacent_items(const LineartAdjacentItem &p1, const LineartAdjacentItem &p2) +{ + int a = (int)p1.v1 - (int)p2.v1; + int b = (int)p1.v2 - (int)p2.v2; + return a ? a : b; +} + +void lineart_sort_adjacent_items(LineartAdjacentItem *ai, int length) +{ + blender::Vector<LineartAdjacentItem> _ai; + _ai.reserve(length); + for (int i = 0; i < length; i++) { + _ai[i] = ai[i]; + printf("(%d %d %d)", _ai[i].v1, _ai[i].v2, _ai[i].e); + } + _ai.resize(length); + printf("\n"); + std::sort(ai, ai + length, cmp_adjacent_items); + for (int i = 0; i < length; i++) { + ai[i] = _ai[i]; + printf("(%d %d %d)", _ai[i].v1, _ai[i].v2, _ai[i].e); + } +} diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c index 88ac80e153f..b6639f80f63 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_cpu.c @@ -1452,12 +1452,6 @@ static void lineart_vert_transform_me( mul_v4_m4v3_db(vt->fbcoord, mvp_mat, co); } -typedef struct LineartAdjacentItem { - unsigned int v1; - unsigned int v2; - unsigned int e; -} LineartAdjacentItem; - typedef struct LineartEdgeNeighbor { int e; short flags; @@ -1517,7 +1511,6 @@ typedef struct EdgeFeatData { LineartTriangle *tri_array; LineartVert *v_array; float crease_threshold; - float **poly_normals; bool use_auto_smooth; bool use_freestyle_face; int freestyle_face_index; @@ -1537,8 +1530,9 @@ static void feat_data_sum_reduce(const void *__restrict UNUSED(userdata), feat_chunk_join->feat_edges += feat_chunk->feat_edges; } -__attribute__((optimize("O0"))) static void lineart_identify_mlooptri_feature_edges( - void *__restrict userdata, const int i, const TaskParallelTLS *__restrict tls) +static void lineart_identify_mlooptri_feature_edges(void *__restrict userdata, + const int i, + const TaskParallelTLS *__restrict tls) { EdgeFeatData *e_feat_data = (EdgeFeatData *)userdata; EdgeFeatReduceData *reduce_data = (EdgeFeatReduceData *)tls->userdata_chunk; @@ -1698,18 +1692,16 @@ static uint16_t lineart_identify_medge_feature_edges( return edge_flag_result; } -__attribute__((optimize("O0"))) static uint16_t lineart_identify_feature_line_me( - LineartRenderBuffer *rb, - int eindex, - LineartTriangle *rt_array, - LineartVert *rv_array, - float crease_threshold, - bool use_auto_smooth, - bool use_freestyle_edge, - bool use_freestyle_face, - Mesh *me, - LineartEdgeNeighbor *en, - float (*normals)[3]) +static uint16_t lineart_identify_feature_line_me(LineartRenderBuffer *rb, + int eindex, + LineartTriangle *rt_array, + LineartVert *rv_array, + float crease_threshold, + bool use_auto_smooth, + bool use_freestyle_edge, + bool use_freestyle_face, + Mesh *me, + LineartEdgeNeighbor *en) { MPoly *ll = NULL, *lr = NULL; @@ -1980,14 +1972,6 @@ static void lineart_load_tri_task(void *__restrict userdata, tri->intersecting_verts = (void *)&tri_task_data->tri_adj[i]; } -static int cmp_adjacent_items(const void *ps1, const void *ps2) -{ - LineartAdjacentItem *p1 = (LineartAdjacentItem *)ps1; - LineartAdjacentItem *p2 = (LineartAdjacentItem *)ps2; - int a = (int)p1->v1 - (int)p2->v1; - int b = (int)p1->v2 - (int)p2->v2; - return a ? a : b; -} static LineartEdgeNeighbor *lineart_build_edge_neighbor(Mesh *me, int total_edges) { /* Because the mesh is traingulated, so me->totedge should be reliable? */ @@ -2011,7 +1995,8 @@ static LineartEdgeNeighbor *lineart_build_edge_neighbor(Mesh *me, int total_edge en[i].v2 = ai[i].v2; } - qsort(ai, total_edges, sizeof(LineartAdjacentItem), cmp_adjacent_items); + lineart_sort_adjacent_items(ai, total_edges); + // qsort(ai, total_edges, sizeof(LineartAdjacentItem), cmp_adjacent_items); if (0) { printf("Edge Adjacent tuples "); @@ -2032,8 +2017,8 @@ static LineartEdgeNeighbor *lineart_build_edge_neighbor(Mesh *me, int total_edge return en; } -__attribute__((optimize("O0"))) static void lineart_geometry_object_load_no_bmesh( - LineartObjectInfo *ob_info, LineartRenderBuffer *re_buf) +static void lineart_geometry_object_load_no_bmesh(LineartObjectInfo *ob_info, + LineartRenderBuffer *re_buf) { LineartElementLinkNode *elem_link_node; LineartVert *la_v_arr; @@ -2322,7 +2307,6 @@ static void lineart_geometry_object_load_edge_neighbor(LineartObjectInfo *obi, Mesh *me = obi->original_me; BKE_mesh_runtime_looptri_ensure(me); - float(*poly_normals)[3] = BKE_mesh_poly_normals_ensure(me); const int tot_tri = me->runtime.looptris.len; unsigned int total_edges = me->runtime.looptris.len * 3; @@ -2459,7 +2443,7 @@ static void lineart_geometry_object_load_edge_neighbor(LineartObjectInfo *obi, /* Because e->head.hflag is char, so line type flags should not exceed positive 7 bits. */ uint16_t eflag = lineart_identify_feature_line_me( - rb, i, ort, orv, use_crease, use_auto_smooth, false, false, me, en, poly_normals); + rb, i, ort, orv, use_crease, use_auto_smooth, false, false, me, en); if (eflag) { /* Only allocate for feature lines (instead of all lines) to save memory. * If allow duplicated edges, one edge gets added multiple times if it has multiple types. diff --git a/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h b/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h index 508061d5d98..43da4bd56dd 100644 --- a/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h +++ b/source/blender/gpencil_modifiers/intern/lineart/lineart_intern.h @@ -121,3 +121,13 @@ void lineart_count_and_print_render_buffer_memory(struct LineartRenderBuffer *rb /* Initial bounding area row/column count, setting 4 is the simplest way algorithm could function * efficiently. */ #define LRT_BA_ROWS 4 + +#ifdef __cplusplus +extern "C" { +#endif + +void lineart_sort_adjacent_items(LineartAdjacentItem *ai, int length); + +#ifdef __cplusplus +} +#endif _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs