Commit: 6e74907f4ffc0942f918278b50d1b48c7861a4ed Author: Joseph Eagar Date: Wed Oct 20 17:16:12 2021 -0700 Branches: sculpt-dev https://developer.blender.org/rB6e74907f4ffc0942f918278b50d1b48c7861a4ed
Sculpt: Continue individual edge locks experiemnt =================================================================== M source/blender/blenkernel/intern/armature_deform.c M source/blender/blenkernel/intern/customdata.c M source/blender/blenkernel/intern/dyntopo.c M source/blender/blenkernel/intern/lattice_deform.c M source/blender/blenkernel/intern/pbvh_bmesh.c M source/blender/blenkernel/intern/pbvh_intern.h M source/blender/blenlib/BLI_mempool_lockfree.h M source/blender/blenlib/BLI_task.h M source/blender/blenlib/intern/lockfree_mempool.cc M source/blender/blenlib/intern/task_iterator.c M source/blender/bmesh/bmesh_class.h M source/blender/bmesh/intern/bmesh_construct.c M source/blender/bmesh/intern/bmesh_core.c M source/blender/bmesh/intern/bmesh_interp.c M source/blender/bmesh/intern/bmesh_iterators.c M source/blender/bmesh/intern/bmesh_iterators.h M source/blender/bmesh/intern/bmesh_iterators_inline.h M source/blender/bmesh/intern/bmesh_log.c M source/blender/bmesh/intern/bmesh_mesh.c M source/blender/bmesh/intern/bmesh_mesh.h M source/blender/bmesh/intern/bmesh_mesh_convert.c M source/blender/bmesh/intern/bmesh_mesh_convert_threaded.c M source/blender/bmesh/intern/bmesh_operators.c M source/blender/editors/sculpt_paint/paint_mask.c M source/blender/editors/sculpt_paint/sculpt_dyntopo.c M source/blender/editors/sculpt_paint/sculpt_smooth.c =================================================================== diff --git a/source/blender/blenkernel/intern/armature_deform.c b/source/blender/blenkernel/intern/armature_deform.c index 5f721b49361..ad9882ecf9b 100644 --- a/source/blender/blenkernel/intern/armature_deform.c +++ b/source/blender/blenkernel/intern/armature_deform.c @@ -601,11 +601,11 @@ static void armature_deform_coords_impl(const Object *ob_arm, BLI_parallel_mempool_settings_defaults(&settings); if (use_dverts) { - BLI_task_parallel_mempool( + BM_task_parallel_mempool( em_target->bm->vpool, &data, armature_vert_task_editmesh, &settings); } else { - BLI_task_parallel_mempool( + BM_task_parallel_mempool( em_target->bm->vpool, &data, armature_vert_task_editmesh_no_dvert, &settings); } } diff --git a/source/blender/blenkernel/intern/customdata.c b/source/blender/blenkernel/intern/customdata.c index d6c41fd66bd..10dd35ce2d0 100644 --- a/source/blender/blenkernel/intern/customdata.c +++ b/source/blender/blenkernel/intern/customdata.c @@ -3980,7 +3980,12 @@ void CustomData_bmesh_init_pool_ex(CustomData *data, /* If there are no layers, no pool is needed just yet */ if (data->totlayer) { +#ifndef BM_LOCKFREE_MEMPOOL data->pool = BLI_mempool_create_ex(data->totsize, totelem, chunksize, BLI_MEMPOOL_NOP, memtag); +#else + data->pool = (BLI_mempool *)BM_mempool_create( + data->totsize, totelem, chunksize, BLI_MEMPOOL_NOP); +#endif } } @@ -4068,7 +4073,7 @@ bool CustomData_bmesh_merge(const CustomData *source, } if (destold.pool) { - BLI_mempool_destroy(destold.pool); + BM_mempool_destroy(destold.pool); } if (destold.layers) { MEM_freeN(destold.layers); @@ -4096,7 +4101,7 @@ void CustomData_bmesh_free_block(CustomData *data, void **block) } if (data->totsize) { - BLI_mempool_free(data->pool, *block); + BM_mempool_free((BM_mempool *)data->pool, *block); } *block = NULL; @@ -4137,7 +4142,7 @@ static void CustomData_bmesh_alloc_block(CustomData *data, void **block) } if (data->totsize > 0) { - *block = BLI_mempool_alloc(data->pool); + *block = BM_mempool_alloc((BM_mempool *)data->pool); CustomData_bmesh_asan_poison(data, *block); diff --git a/source/blender/blenkernel/intern/dyntopo.c b/source/blender/blenkernel/intern/dyntopo.c index f59a93e9cbd..e78c86a4739 100644 --- a/source/blender/blenkernel/intern/dyntopo.c +++ b/source/blender/blenkernel/intern/dyntopo.c @@ -34,7 +34,6 @@ #include <stdio.h> -#define DYNTOPO_EDGE_LOCKS //#define DYNTOPO_REPORT //#define WITH_ADAPTIVE_CURVATURE @@ -196,11 +195,11 @@ static bool bm_elem_is_free(BMElem *elem, int htype); extern char dyntopop_node_idx_layer_id[]; extern char dyntopop_faces_areas_layer_id[]; -#ifdef DYNTOPO_EDGE_LOCKS +#ifdef WITH_DYNTOPO_EDGE_LOCKS char *cdlayer_lock_attr_name = "__bm_lock"; -static int cdlayer_lock_begin(PBVH *pbvh, BMesh *bm) +ATTR_NO_OPT static int cdlayer_lock_begin(PBVH *pbvh, BMesh *bm) { int idx = CustomData_get_named_layer_index(&bm->edata, CD_PROP_INT32, cdlayer_lock_attr_name); @@ -208,7 +207,7 @@ static int cdlayer_lock_begin(PBVH *pbvh, BMesh *bm) BM_data_layer_add_named(bm, &bm->edata, CD_PROP_INT32, cdlayer_lock_attr_name); idx = CustomData_get_named_layer_index(&bm->edata, CD_PROP_INT32, cdlayer_lock_attr_name); - bm->vdata.layers[idx].flag |= CD_FLAG_TEMPORARY | CD_FLAG_ELEM_NOCOPY | CD_FLAG_ELEM_NOINTERP; + bm->edata.layers[idx].flag |= CD_FLAG_TEMPORARY | CD_FLAG_ELEM_NOCOPY | CD_FLAG_ELEM_NOINTERP; pbvh->cd_vert_node_offset = CustomData_get_named_layer_index( &pbvh->bm->vdata, CD_PROP_INT32, dyntopop_node_idx_layer_id); @@ -219,13 +218,17 @@ static int cdlayer_lock_begin(PBVH *pbvh, BMesh *bm) pbvh->cd_face_node_offset = bm->pdata.layers[pbvh->cd_face_node_offset].offset; } - return bm->vdata.layers[idx].offset; + return bm->edata.layers[idx].offset; } -static bool cdlayer_elem_lock(BMElem *elem, int cd_lock, int thread_nr) +ATTR_NO_OPT static bool cdlayer_elem_lock(BMElem *elem, int cd_lock, int thread_nr) { thread_nr++; + if (bm_elem_is_free(elem, BM_EDGE)) { + return false; + } + int *lock = BM_ELEM_CD_GET_VOID_P(elem, cd_lock); int old = *lock; @@ -233,9 +236,16 @@ static bool cdlayer_elem_lock(BMElem *elem, int cd_lock, int thread_nr) return true; } - while (old != atomic_cas_int32(lock, old, thread_nr)) { - if (elem->head.htype != BM_EDGE) { - // element was freed + int i = 0; + + while (old > 0 || old != atomic_cas_int32(lock, old, thread_nr)) { + if (bm_elem_is_free(elem, BM_EDGE)) { + return false; + } + + old = *lock; + + if (i++ > 100000) { return false; } } @@ -253,16 +263,15 @@ static void cdlayer_elem_unlock(BMElem *elem, int cd_lock, int thread_nr) *lock = 0; } -static bool cdlayer_lock_edge(BMEdge *e, int cd_lock, int thread_nr) +ATTR_NO_OPT static bool cdlayer_lock_edge(BMEdge *e, int cd_lock, int thread_nr) { - if (BM_ELEM_CD_GET_INT(e, cd_lock) == thread_nr + 1) { - return true; - } - if (!cdlayer_elem_lock((BMElem *)e, cd_lock, thread_nr)) { return false; } + BMEdge **es = NULL; + BLI_array_staticdeclare(es, 32); + for (int i = 0; i < 2; i++) { BMVert *v = i ? e->v2 : e->v1; @@ -271,21 +280,52 @@ static bool cdlayer_lock_edge(BMEdge *e, int cd_lock, int thread_nr) BMLoop *l = e2->l; if (!l) { - cdlayer_elem_lock((BMElem *)e2, cd_lock, thread_nr); + if (!cdlayer_elem_lock((BMElem *)e2, cd_lock, thread_nr)) { + return false; + } + + BLI_array_append(es, e2); continue; } do { BMLoop *l2 = l; do { - cdlayer_elem_lock((BMElem *)l2->e, cd_lock, thread_nr); + if (BM_elem_is_free((BMElem *)l2, BM_LOOP)) { + return false; + } + + if (!cdlayer_elem_lock((BMElem *)l2->e, cd_lock, thread_nr)) { + return false; + } + BLI_array_append(es, l2->e); } while ((l2 = l2->next) != l); - } while ((l = l->next) != e2->l); + } while ((l = l->radial_next) != e2->l); } while ((e2 = BM_DISK_EDGE_NEXT(e2, v)) != v->e); } + BLI_array_free(es); return true; + +error: + for (int i = 0; i < BLI_array_len(es); i++) { + if (!es[i]) { + continue; + } + + // eliminate duplicates + for (int j = i + 1; j < BLI_array_len(es); j++) { + if (es[i] == es[j]) { + es[j] = NULL; + } + } + + cdlayer_elem_unlock((BMElem *)es[i], cd_lock, thread_nr); + } + + BLI_array_free(es); + return false; } static void cdlayer_unlock_edge(BMEdge *e, int cd_lock, int thread_nr) @@ -315,7 +355,7 @@ static void cdlayer_unlock_edge(BMEdge *e, int cd_lock, int thread_nr) do { l2->e->head.hflag &= ~tag; } while ((l2 = l2->next) != l); - } while ((l = l->next) != e2->l); + } while ((l = l->radial_next) != e2->l); } while ((e2 = BM_DISK_EDGE_NEXT(e2, v)) != v->e); } @@ -339,7 +379,7 @@ static void cdlayer_unlock_edge(BMEdge *e, int cd_lock, int thread_nr) BLI_array_append(es, l2->e); } } while ((l2 = l2->next) != l); - } while ((l = l->next) != e2->l); + } while ((l = l->radial_next) != e2->l); } while ((e2 = BM_DISK_EDGE_NEXT(e2, v)) != v->e); } @@ -352,6 +392,69 @@ static void cdlayer_unlock_edge(BMEdge *e, int cd_lock, int thread_nr) cdlayer_elem_unlock((BMElem *)e2, cd_lock, thread_nr); } } + + BLI_array_free(es); +} + +static void cdlayer_unlock_vert(BMVert *v, int cd_lock, int thread_nr) +{ + BMEdge **es = NULL; + BLI_array_staticdeclare(es, 32); + + if (!v->e) { + return; + } + const int tag = BM_ELEM_TAG_ALT; + + BMEdge *e2 = v->e; + do { + BMLoop *l = e2->l; + if (!l) { + e2->head.hflag &= ~tag; + continue; + } + + do { + BMLoop *l2 = l; + do { + l2->e->head.hflag &= ~tag; + + } while ((l2 = l2->next) != l); + } while ((l = l->radial_next) != e2->l); + + } while ((e2 = BM_DISK_EDGE_NEXT(e2, v)) != v->e); + + e2 = v->e; + do { + BMLoop *l = e2->l; + if (!l) { + e2->head.hflag |= tag; + BLI_array_append(es, e2); + continue; + } + + do { + BMLoop *l2 = l; + do { + if (!(l2->e->head.hflag & tag)) { + l2->e->head.hflag |= tag; + BLI_array_append(es, l2->e); + } + } while ((l2 = l2->next) != l); + } while ((l = l->radial_next) != e2->l); + + } while ((e2 = BM_DISK_EDGE_NEXT(e2, v)) != v->e); + + for (int i = 0; i < BLI_array_len(es); i++) { + BMEdge *e2 = es[i]; + + if (!bm_elem_is_free((BMElem *)e2, BM_EDGE) && + BM_ELEM_CD_GET_INT(e2, cd_lock) == thread_nr + 1) { + cdlayer_elem_unlock((BMElem *)e2, cd_lock, thread_nr); + } + } + + BLI_array_free(es); } #endif @@ -982,6 +1085,10 @@ static BMVert *pbvh_bmesh_vert_create(PBVH *pbvh, BLI_assert((pbvh->totnode == 1 || node_index) && node_index <= pbvh->totnode); +#ifdef WITH_DYNTOPO_EDGE_LOCKS + BLI_ticket_mutex_lock(node->lock); +#endif + /* avoid initializing customdata because its quite involved */ BMVert *v = BM_vert_create(pbvh->bm, co, NULL, BM_CREATE_NOP); MSculptVert *mv = BKE_PBVH_SCULPTVERT(pbvh->cd_sculpt_vert, v); @@ -1019,6 +1126,10 @@ static BMVert *pbvh_bmesh_vert_create(PBVH *pbvh, BM_log_vert_added(pbvh->bm_log, v, cd_vert_mask_offset); v->head.index = pbvh->bm->totvert; // set provisional index +#ifdef WITH_DYNTOPO_EDGE_LOCKS + BLI_ticket_mutex_unlock(node->lock); +#endif + return v; } @@ -1345,6 +1456,7 @@ static bool pbvh_bmesh_vert_relink(PBVH *pbvh, BMVert *v) static void pbvh_bmesh_vert_remove(PBVH *pbvh, BMVert *v) { + /* never match for first time */ int f_node_index_prev = DYNTOPO_NODE_NONE; const int updateflag = PBVH_UpdateDrawBuffers | PBVH_UpdateBB | PBVH_UpdateTris | @@ -1353,6 +1465,10 @@ static void pbvh_bmesh_vert_remove(PBVH *pbvh, BMVert *v) PBVHNode *v_node = pbvh_bmesh_node_from_vert(pbvh, v); if (v_node) { +#ifdef WITH_DYNTOPO_EDGE_LOCKS + BLI_ticket_mutex_lock(v_node->lock); +#endif + BLI_t @@ Diff output truncated at 10240 characters. @@ _______________________________________________ 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