Edit Mesh: multi-thread auto-smooth & custom normal calculations
Supported multi-threading for bm_mesh_loops_calc_normals. This is done by operating on vertex-loops instead of face-loops. Single threaded operation still loops over faces since iterating over vertices adds some overhead in the case of custom-normals as the order used for accessing loops must be the same as iterating of a faces loops. From isolated timing tests of bm_mesh_loops_calc_normals on high poly models, this gives between 3.5x to 10x speedup, with larger gains for meshes with custom-normals. NOTE: this is part one of two patches for multi-threaded auto-smooth, tagging edges as sharp is still single threaded. Reviewed By: mont29 Ref D11928
This commit is contained in:
parent
3fb47956c0
commit
4ba06ad0a8
Notes:
blender-bot
2023-02-14 09:03:55 +01:00
Referenced by commit 39b2a7bb7e
, Edit Mesh: multi-thread auto-smooth sharp-edge calculation
Referenced by issue #90332, Convex Hull crash blender
Referenced by issue #88550, Mesh Optimization Project Progress
|
@ -399,6 +399,12 @@ void BKE_lnor_spacearr_init(MLoopNorSpaceArray *lnors_spacearr,
|
|||
const char data_type);
|
||||
void BKE_lnor_spacearr_clear(MLoopNorSpaceArray *lnors_spacearr);
|
||||
void BKE_lnor_spacearr_free(MLoopNorSpaceArray *lnors_spacearr);
|
||||
|
||||
void BKE_lnor_spacearr_tls_init(MLoopNorSpaceArray *lnors_spacearr,
|
||||
MLoopNorSpaceArray *lnors_spacearr_tls);
|
||||
void BKE_lnor_spacearr_tls_join(MLoopNorSpaceArray *lnors_spacearr,
|
||||
MLoopNorSpaceArray *lnors_spacearr_tls);
|
||||
|
||||
MLoopNorSpace *BKE_lnor_space_create(MLoopNorSpaceArray *lnors_spacearr);
|
||||
void BKE_lnor_space_define(MLoopNorSpace *lnor_space,
|
||||
const float lnor[3],
|
||||
|
|
|
@ -530,6 +530,36 @@ void BKE_lnor_spacearr_init(MLoopNorSpaceArray *lnors_spacearr,
|
|||
lnors_spacearr->data_type = data_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility for multi-threaded calculation that ensures
|
||||
* `lnors_spacearr_tls` doesn't share memory with `lnors_spacearr`
|
||||
* that would cause it not to be thread safe.
|
||||
*
|
||||
* \note This works as long as threads never operate on the same loops at once.
|
||||
*/
|
||||
void BKE_lnor_spacearr_tls_init(MLoopNorSpaceArray *lnors_spacearr,
|
||||
MLoopNorSpaceArray *lnors_spacearr_tls)
|
||||
{
|
||||
*lnors_spacearr_tls = *lnors_spacearr;
|
||||
lnors_spacearr_tls->mem = BLI_memarena_new(BLI_MEMARENA_STD_BUFSIZE, __func__);
|
||||
}
|
||||
|
||||
/**
|
||||
* Utility for multi-threaded calculation
|
||||
* that merges `lnors_spacearr_tls` into `lnors_spacearr`.
|
||||
*/
|
||||
void BKE_lnor_spacearr_tls_join(MLoopNorSpaceArray *lnors_spacearr,
|
||||
MLoopNorSpaceArray *lnors_spacearr_tls)
|
||||
{
|
||||
BLI_assert(lnors_spacearr->data_type == lnors_spacearr_tls->data_type);
|
||||
BLI_assert(lnors_spacearr->mem != lnors_spacearr_tls->mem);
|
||||
lnors_spacearr->num_spaces += lnors_spacearr_tls->num_spaces;
|
||||
BLI_memarena_merge(lnors_spacearr->mem, lnors_spacearr_tls->mem);
|
||||
BLI_memarena_free(lnors_spacearr_tls->mem);
|
||||
lnors_spacearr_tls->mem = nullptr;
|
||||
BKE_lnor_spacearr_clear(lnors_spacearr_tls);
|
||||
}
|
||||
|
||||
void BKE_lnor_spacearr_clear(MLoopNorSpaceArray *lnors_spacearr)
|
||||
{
|
||||
lnors_spacearr->num_spaces = 0;
|
||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue