[Bf-blender-cvs] [43ccbe353ff] temp_bmesh_multires: Try to make SCULPT_orig_vert_data_init avoid allocating undo nodes, which calls into BMLog which, while now threadsafe (ish?) causes threads to get bogged down in lock contention.

Joseph Eagar noreply at git.blender.org
Sat Oct 31 03:18:25 CET 2020


Commit: 43ccbe353ffdd89241d7baa162388aa30ab86864
Author: Joseph Eagar
Date:   Fri Oct 30 19:17:03 2020 -0700
Branches: temp_bmesh_multires
https://developer.blender.org/rB43ccbe353ffdd89241d7baa162388aa30ab86864

Try to make SCULPT_orig_vert_data_init avoid allocating undo nodes,
which calls into BMLog which, while now threadsafe (ish?) causes
threads to get bogged down in lock contention.

===================================================================

M	source/blender/blenkernel/intern/pbvh_bmesh.c
M	source/blender/editors/sculpt_paint/sculpt.c
M	source/blender/editors/sculpt_paint/sculpt_intern.h
M	source/blender/editors/sculpt_paint/sculpt_paint_color.c
M	source/blender/gpu/intern/gpu_buffers.c

===================================================================

diff --git a/source/blender/blenkernel/intern/pbvh_bmesh.c b/source/blender/blenkernel/intern/pbvh_bmesh.c
index a6c00917e0c..08af3cf9eb9 100644
--- a/source/blender/blenkernel/intern/pbvh_bmesh.c
+++ b/source/blender/blenkernel/intern/pbvh_bmesh.c
@@ -911,11 +911,29 @@ static bool edge_queue_tri_in_sphere(const EdgeQueue *q, BMFace *f)
 
   /* Get closest point in triangle to sphere center */
   BM_face_as_array_vert_tri(f, v_tri);
+#if 0
+  /*
+  closest_on_tri_to_point_v3 is being slow
+  */
+
+  float mindis = 1e17;
+  float dis;
+  copy_v3_v3(c, q->center);
 
+  for (int i=0; i<3; i++) {
+    dis = len_squared_v3v3(v_tri[i]->co, c);
+    mindis = MIN2(mindis, dis);
+
+    dis = dist_squared_to_line_segment_v3(c, v_tri[i]->co, v_tri[(i+1)%3]->co);
+    mindis = MIN2(mindis, dis);
+  }
+  return mindis <= q->radius_squared;
+#else
   closest_on_tri_to_point_v3(c, q->center, v_tri[0]->co, v_tri[1]->co, v_tri[2]->co);
 
   /* Check if triangle intersects the sphere */
   return len_squared_v3v3(q->center, c) <= q->radius_squared;
+#endif
 }
 
 static bool edge_queue_tri_in_circle(const EdgeQueue *q, BMFace *f)
@@ -2584,7 +2602,7 @@ void BKE_pbvh_build_bmesh(PBVH *pbvh,
   pbvh->cd_vcol_offset = CustomData_get_offset(&bm->vdata, CD_PROP_COLOR);
 
   /* TODO: choose leaf limit better */
-  pbvh->leaf_limit = 3000;
+  pbvh->leaf_limit = 1000;
 
   BMIter iter;
   BMVert *v;
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c
index 736a21ec702..d4a609c7751 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -1332,6 +1332,7 @@ void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, Object *ob, Scul
     data->bm_log = ss->bm_log;
   }
   else {
+    data->datatype = data->unode->type;
     data->coords = data->unode->co;
     data->normals = data->unode->no;
     data->vmasks = data->unode->mask;
@@ -1345,10 +1346,15 @@ void SCULPT_orig_vert_data_unode_init(SculptOrigVertData *data, Object *ob, Scul
  */
 void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *node)
 {
-  SculptUndoNode *unode;
+  SculptUndoNode *unode = NULL;
   data->ss = ob->sculpt;
-  unode = SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
+
+  if (!ob->sculpt->bm) {
+    unode = SCULPT_undo_push_node(ob, node, SCULPT_UNDO_COORDS);
+  }
+
   SCULPT_orig_vert_data_unode_init(data, ob, unode);
+  data->datatype = SCULPT_UNDO_COORDS;
 }
 
 /**
@@ -1356,7 +1362,7 @@ void SCULPT_orig_vert_data_init(SculptOrigVertData *data, Object *ob, PBVHNode *
  */
 void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter *iter)
 {
-  if (orig_data->unode->type == SCULPT_UNDO_COORDS) {
+  if (orig_data->datatype == SCULPT_UNDO_COORDS) {
     if (orig_data->bm_log) {
       orig_data->co = BM_ELEM_CD_GET_VOID_P(iter->bm_vert, orig_data->ss->cd_origco_offset);
 
@@ -1376,7 +1382,7 @@ void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter
       orig_data->no = orig_data->normals[iter->i];
     }
   }
-  else if (orig_data->unode->type == SCULPT_UNDO_COLOR) {
+  else if (orig_data->datatype == SCULPT_UNDO_COLOR) {
     if (orig_data->bm_log) {
       orig_data->col = BM_ELEM_CD_GET_VOID_P(iter->bm_vert, orig_data->ss->cd_origvcol_offset);
 
@@ -1386,7 +1392,7 @@ void SCULPT_orig_vert_data_update(SculptOrigVertData *orig_data, PBVHVertexIter
       orig_data->col = orig_data->colors[iter->i];
     }
   }
-  else if (orig_data->unode->type == SCULPT_UNDO_MASK) {
+  else if (orig_data->datatype == SCULPT_UNDO_MASK) {
     if (orig_data->bm_log) {
       orig_data->mask = BM_log_original_mask(orig_data->bm_log, iter->bm_vert);
     }
diff --git a/source/blender/editors/sculpt_paint/sculpt_intern.h b/source/blender/editors/sculpt_paint/sculpt_intern.h
index cc3e84a74e9..ba9e11d6704 100644
--- a/source/blender/editors/sculpt_paint/sculpt_intern.h
+++ b/source/blender/editors/sculpt_paint/sculpt_intern.h
@@ -226,6 +226,7 @@ typedef struct {
   struct BMLog *bm_log;
 
   struct SculptUndoNode *unode;
+  int datatype;
   float (*coords)[3];
   short (*normals)[3];
   const float *vmasks;
diff --git a/source/blender/editors/sculpt_paint/sculpt_paint_color.c b/source/blender/editors/sculpt_paint/sculpt_paint_color.c
index f5232a262a2..cffa3d5f1c3 100644
--- a/source/blender/editors/sculpt_paint/sculpt_paint_color.c
+++ b/source/blender/editors/sculpt_paint/sculpt_paint_color.c
@@ -124,6 +124,7 @@ static void do_paint_brush_task_cb_ex(void *__restrict userdata,
 
   SculptOrigVertData orig_data;
   SCULPT_orig_vert_data_init(&orig_data, data->ob, data->nodes[n]);
+  orig_data.datatype = SCULPT_UNDO_COLOR;
 
   color_buffer = BKE_pbvh_node_color_buffer_get(data->nodes[n]);
 
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 1fa1acbe88b..5e785501102 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -932,6 +932,7 @@ void GPU_pbvh_update_attribute_names(CustomData *vdata, CustomData *ldata)
       cl += cl->active;
 
       DRW_make_cdlayer_attr_aliases(&g_vbo_id.format, "c", vdata, cl);
+      GPU_vertformat_alias_add(&g_vbo_id.format, "ac");
     }
 
     g_vbo_id.fset = GPU_vertformat_attr_add(



More information about the Bf-blender-cvs mailing list