Commit: 0b157f7c6cf3b0dfd7b3f2d0317739dc0dc1f236
Author: Bastien Montagne
Date:   Mon Jan 4 17:16:13 2016 +0100
Branches: master
https://developer.blender.org/rB0b157f7c6cf3b0dfd7b3f2d0317739dc0dc1f236

Sculpt: OMP -> BLI_task, step III.

The remaining bits in editors' sculpt.c, which is now free from OMP.

All in all, changes in this file allow from below 2% to above %20 speedup per 
stroke, depending
on brush complexity, size, and definition of the mesh below it...

Note that this commit also unifies all 'threaded data' into a single struct, a 
few more
floats/pointers do not hurt here, and it makes code a bit simpler.

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

M       source/blender/editors/sculpt_paint/sculpt.c

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

diff --git a/source/blender/editors/sculpt_paint/sculpt.c 
b/source/blender/editors/sculpt_paint/sculpt.c
index 8781b46..2b708a8 100644
--- a/source/blender/editors/sculpt_paint/sculpt.c
+++ b/source/blender/editors/sculpt_paint/sculpt.c
@@ -414,57 +414,105 @@ static bool sculpt_stroke_is_dynamic_topology(
 
 /*** paint mesh ***/
 
-static void paint_mesh_restore_co(Sculpt *sd, Object *ob)
+/* Single struct used by all BLI_task threaded callbacks, let's avoid adding 
10's of those... */
+typedef struct SculptThreadedTaskData {
+       Sculpt *sd;
+       Object *ob;
+       Brush *brush;
+    PBVHNode **nodes;
+       int totnode;
+
+       /* Data specific to some callbacks. */
+       /* Note: even if only one or two of those are used at a time, keeping 
them separated, names help figuring out
+        *       what it is, and memory overhead is ridiculous anyway... */
+       float flippedbstrength;
+       float angle;
+       float strength;
+       bool smooth_mask;
+       bool has_bm_orco;
+
+       SculptProjectVector *spvc;
+       float *offset;
+       float *grab_delta;
+       float *cono;
+       float *area_no;
+       float *area_no_sp;
+       float *area_co;
+       float (*mat)[4];
+       float (*vertCos)[3];
+
+       /* 0=towards view, 1=flipped */
+       float (*area_cos)[3];
+       float (*area_nos)[3];
+       int *count;
+
+       ThreadMutex mutex;
+} SculptThreadedTaskData;
+
+static void paint_mesh_restore_co_task_cb(void *userdata, void 
*UNUSED(userdata_chunk), int n)
 {
-       SculptSession *ss = ob->sculpt;
-       const Brush *brush = BKE_paint_brush(&sd->paint);
+       SculptThreadedTaskData *data = userdata;
+       SculptSession *ss = data->ob->sculpt;
 
-       PBVHNode **nodes;
-       int n, totnode;
+       SculptUndoNode *unode;
+       SculptUndoType type = (data->brush->sculpt_tool == SCULPT_TOOL_MASK ? 
SCULPT_UNDO_MASK : SCULPT_UNDO_COORDS);
 
-       BKE_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
+       if (ss->bm) {
+               unode = sculpt_undo_push_node(data->ob, data->nodes[n], type);
+       }
+       else {
+               unode = sculpt_undo_get_node(data->nodes[n]);
+       }
 
-       /* Disable OpenMP when dynamic-topology is enabled. Otherwise, new
-        * entries might be inserted by sculpt_undo_push_node() into the
-        * GHash used internally by BM_log_original_vert_co() by a
-        * different thread. [#33787] */
-#pragma omp parallel for schedule(guided) if ((sd->flags & SCULPT_USE_OPENMP) 
&& !ss->bm && totnode > SCULPT_OMP_LIMIT)
-       for (n = 0; n < totnode; n++) {
-               SculptUndoNode *unode;
-               SculptUndoType type = (brush->sculpt_tool == SCULPT_TOOL_MASK ?
-                                      SCULPT_UNDO_MASK : SCULPT_UNDO_COORDS);
+       if (unode) {
+               PBVHVertexIter vd;
+               SculptOrigVertData orig_data;
 
-               if (ss->bm) {
-                       unode = sculpt_undo_push_node(ob, nodes[n], type);
-               }
-               else {
-                       unode = sculpt_undo_get_node(nodes[n]);
-               }
-               if (unode) {
-                       PBVHVertexIter vd;
-                       SculptOrigVertData orig_data;
+               sculpt_orig_vert_data_unode_init(&orig_data, data->ob, unode);
 
-                       sculpt_orig_vert_data_unode_init(&orig_data, ob, unode);
-               
-                       BKE_pbvh_vertex_iter_begin(ss->pbvh, nodes[n], vd, 
PBVH_ITER_UNIQUE)
-                       {
-                               sculpt_orig_vert_data_update(&orig_data, &vd);
+               BKE_pbvh_vertex_iter_begin(ss->pbvh, data->nodes[n], vd, 
PBVH_ITER_UNIQUE)
+               {
+                       sculpt_orig_vert_data_update(&orig_data, &vd);
 
-                               if (orig_data.unode->type == 
SCULPT_UNDO_COORDS) {
-                                       copy_v3_v3(vd.co, orig_data.co);
-                                       if (vd.no) copy_v3_v3_short(vd.no, 
orig_data.no);
-                                       else normal_short_to_float_v3(vd.fno, 
orig_data.no);
-                               }
-                               else if (orig_data.unode->type == 
SCULPT_UNDO_MASK) {
-                                       *vd.mask = orig_data.mask;
-                               }
-                               if (vd.mvert) vd.mvert->flag |= 
ME_VERT_PBVH_UPDATE;
+                       if (orig_data.unode->type == SCULPT_UNDO_COORDS) {
+                               copy_v3_v3(vd.co, orig_data.co);
+                               if (vd.no)
+                                       copy_v3_v3_short(vd.no, orig_data.no);
+                               else
+                                       normal_short_to_float_v3(vd.fno, 
orig_data.no);
+                       }
+                       else if (orig_data.unode->type == SCULPT_UNDO_MASK) {
+                               *vd.mask = orig_data.mask;
                        }
-                       BKE_pbvh_vertex_iter_end;
 
-                       BKE_pbvh_node_mark_update(nodes[n]);
+                       if (vd.mvert)
+                               vd.mvert->flag |= ME_VERT_PBVH_UPDATE;
                }
+               BKE_pbvh_vertex_iter_end;
+
+               BKE_pbvh_node_mark_update(data->nodes[n]);
        }
+}
+
+static void paint_mesh_restore_co(Sculpt *sd, Object *ob)
+{
+       SculptSession *ss = ob->sculpt;
+       Brush *brush = BKE_paint_brush(&sd->paint);
+
+       PBVHNode **nodes;
+       int totnode;
+
+       BKE_pbvh_search_gather(ss->pbvh, NULL, NULL, &nodes, &totnode);
+
+       /* Disable OpenMP when dynamic-topology is enabled. Otherwise, new 
entries might be inserted by
+        * sculpt_undo_push_node() into the GHash used internally by 
BM_log_original_vert_co() by a different thread.
+        * See T33787. */
+       SculptThreadedTaskData data = {
+               .sd = sd, .ob = ob, .brush = brush, .nodes = nodes,
+       };
+
+       BLI_task_parallel_range_ex(0, totnode, &data, NULL, 0, 
paint_mesh_restore_co_task_cb,
+                                  ((sd->flags & SCULPT_USE_OPENMP) && !ss->bm 
&& totnode > SCULPT_OMP_LIMIT), false);
 
        if (nodes)
                MEM_freeN(nodes);
@@ -771,25 +819,13 @@ static float calc_symmetry_feather(Sculpt *sd, 
StrokeCache *cache)
  * \note These are all _very_ similar, when changing one, check others.
  * \{ */
 
-typedef struct SculptCalcAreaData {
-       Sculpt *sd;
-       Object *ob;
-    PBVHNode **nodes;
-       int totnode;
-       bool has_bm_orco;
-
-       /* 0=towards view, 1=flipped */
-       float (*area_co)[3];
-       float (*area_no)[3];
-       int *count;
-
-       ThreadMutex mutex;
-} SculptCalcAreaData;
-
-static void calc_area_normal_and_centr_task_cb(void *userdata, void 
*UNUSED(userdata_chunk), int n)
+static void calc_area_normal_and_center_task_cb(void *userdata, void 
*UNUSED(userdata_chunk), int n)
 {
-       SculptCalcAreaData *data = userdata;
+       SculptThreadedTaskData *data = userdata;
        SculptSession *ss = data->ob->sculpt;
+       float (*area_nos)[3] = data->area_nos;
+       float (*area_cos)[3] = data->area_cos;
+
        PBVHVertexIter vd;
        SculptBrushTest test;
        SculptUndoNode *unode;
@@ -812,9 +848,7 @@ static void calc_area_normal_and_centr_task_cb(void 
*userdata, void *UNUSED(user
                int     orco_tris_num;
                int i;
 
-               BKE_pbvh_node_get_bm_orco_data(
-                       data->nodes[n],
-                       &orco_tris, &orco_tris_num, &orco_coords);
+               BKE_pbvh_node_get_bm_orco_data(data->nodes[n], &orco_tris, 
&orco_tris_num, &orco_coords);
 
                for (i = 0; i < orco_tris_num; i++) {
                        const float *co_tri[3] = {
@@ -833,9 +867,9 @@ static void calc_area_normal_and_centr_task_cb(void 
*userdata, void *UNUSED(user
                                normal_tri_v3(no, UNPACK3(co_tri));
 
                                flip_index = (dot_v3v3(ss->cache->view_normal, 
no) <= 0.0f);
-                               if (data->area_co)
+                               if (area_cos)
                                        add_v3_v3(private_co[flip_index], co);
-                               if (data->area_no)
+                               if (area_nos)
                                        add_v3_v3(private_no[flip_index], no);
                                private_count[flip_index] += 1;
                        }
@@ -880,9 +914,9 @@ static void calc_area_normal_and_centr_task_cb(void 
*userdata, void *UNUSED(user
                                }
 
                                flip_index = (dot_v3v3(ss->cache->view_normal, 
no) <= 0.0f);
-                               if (data->area_co)
+                               if (area_cos)
                                        add_v3_v3(private_co[flip_index], co);
-                               if (data->area_no)
+                               if (area_nos)
                                        add_v3_v3(private_no[flip_index], no);
                                private_count[flip_index] += 1;
                        }
@@ -893,15 +927,15 @@ static void calc_area_normal_and_centr_task_cb(void 
*userdata, void *UNUSED(user
        BLI_mutex_lock(&data->mutex);
 
        /* for flatten center */
-       if (data->area_co) {
-               add_v3_v3(data->area_co[0], private_co[0]);
-               add_v3_v3(data->area_co[1], private_co[1]);
+       if (area_cos) {
+               add_v3_v3(area_cos[0], private_co[0]);
+               add_v3_v3(area_cos[1], private_co[1]);
        }
 
        /* for area normal */
-       if (data->area_no) {
-               add_v3_v3(data->area_no[0], private_no[0]);
-               add_v3_v3(data->area_no[1], private_no[1]);
+       if (area_nos) {
+               add_v3_v3(area_nos[0], private_no[0]);
+               add_v3_v3(area_nos[1], private_no[1]);
        }
 
        /* weights */
@@ -922,25 +956,25 @@ static void calc_area_center(
        int n;
 
        /* 0=towards view, 1=flipped */
-       float area_co[2][3] = {{0.0f}};
+       float area_cos[2][3] = {{0.0f}};
 
        int count[2] = {0};
 
-       SculptCalcAreaData data = {
-               .sd = sd, .ob = ob, .nodes = nodes, .totnode = totnode, 
.has_bm_orco = has_bm_orco,
-               .area_co = area_co, .area_no = NULL, .count = count,
+       SculptThreadedTaskData data = {
+               .sd = sd, .ob = ob, .nodes = nodes, .totnode = totnode,
+           .has_bm_orco = has_bm_orco, .area_cos = area_cos, .area_nos = NULL, 
.count = count,
        };
        BLI_mutex_init(&data.mutex);
 
-       BLI_task_parallel_range_ex(0, totnode, &data, NULL, 0, 
calc_area_normal_and_centr_task_cb,
+       BLI_task_parallel_range_ex(0, totnode, &data, NULL, 0, 
calc_area_normal_and_center_task_cb,
                                   ((sd->flags & SCULPT_USE_OPENMP) && totnode 
> SCULPT_OMP_LIMIT), false);
 
        BLI_mutex_end(&data.mutex);
 
        /* for flatten center */
-       for (n = 0; n < ARRAY_SIZE(area_co); n++) {
+       for (n = 0; n < ARRAY_SIZE(area_cos); n++) {
                if (count[n] != 0) {
-                       mul_v3_v3fl(r_area_co, area_co[n], 1.0f / count[n]);
+                       mul_v3_v3fl(r_area_co, area_cos[n], 1.0f / count[n]);
                        break;
                }
        }
@@ -961,24 +995,24 @@ static void calc_area_normal(
        int n;
 
        /* 0=towards view, 1=flipped */
-       float area_no[2][3] = {{0.0f}};
+       float area_nos[2][3] = {{0.0f}};
 
        int count[2] = {0};
 
-       SculptCalcAreaData data = {
-               .sd = sd, .ob = ob, .nodes = nodes, .totnode = totnode, 
.has_bm_orco = has_bm_orco,
-               .area_co = NULL, .area_no = area_no, .count = count,
+       SculptThreadedTaskData data = {
+               .sd = sd, .ob = ob, .nodes = nodes, .totnode = totnode,
+           .has_bm_orco = has_bm_orco, .area_cos = NULL, .area_nos = area_nos, 
.count = count,
        };
        BLI_mutex_init(&data.mutex);
 
-       BLI_task_parallel_range_ex(0, totnode, &data, NULL, 0, 
calc_area_normal_and_centr_task_cb,
+       BLI_task_parallel_range_ex(0, totnode, &data, NULL, 0, 
calc_area_normal_and_center_task_cb,
                                   ((sd->flags & SCULPT_USE_OPENMP) && totnode 
> SCULPT_OMP_LIMIT), false);
 
        BLI_mutex_end(&data.mutex);
 
        /* for area normal */
-       for (n = 0; n < ARRAY_SIZE(area_no); n++) {
-               if (normalize_v3_v3(r_area_no, area_no[n]) != 0.0f) {
+       for (n = 0; n < ARRAY_SIZE(area_nos); n++) {
+               if (normalize_v3_v3(r_area_no, area_nos[n]) != 0.0f) {
                        break;
                }
        }
@@ -997,26 +1031,26 @@ static void calc_area_normal_and_center(
        int n;
 
        /* 0=towards view, 1=flipped */
-       float area_co[2][3] = {{0.0f}};
-       float area_no[2][3] = {{0.0f}};

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to