[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