[Bf-blender-cvs] [6e74907f4ff] sculpt-dev: Sculpt: Continue individual edge locks experiemnt
Joseph Eagar
noreply at git.blender.org
Thu Oct 21 02:30:10 CEST 2021
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. @@
More information about the Bf-blender-cvs
mailing list