[Bf-blender-cvs] [00b6f8ef907] master: Fix T70715: sculpt brush jitter after recent TBB changes

Brecht Van Lommel noreply at git.blender.org
Fri Oct 11 01:28:26 CEST 2019


Commit: 00b6f8ef9079b54ab128413e9fda3d1435a45083
Author: Brecht Van Lommel
Date:   Fri Oct 11 00:44:29 2019 +0200
Branches: master
https://developer.blender.org/rB00b6f8ef9079b54ab128413e9fda3d1435a45083

Fix T70715: sculpt brush jitter after recent TBB changes

Fix error in the splitting constructor, and some refactoring.

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

M	source/blender/blenkernel/intern/pbvh_parallel.cc

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

diff --git a/source/blender/blenkernel/intern/pbvh_parallel.cc b/source/blender/blenkernel/intern/pbvh_parallel.cc
index 60503c9bad0..59225f0cc33 100644
--- a/source/blender/blenkernel/intern/pbvh_parallel.cc
+++ b/source/blender/blenkernel/intern/pbvh_parallel.cc
@@ -36,32 +36,42 @@ struct PBVHTask {
   void *userdata_chunk;
   bool userdata_chunk_free;
 
-  PBVHTask()
+  /* Root constructor. */
+  PBVHTask(PBVHParallelRangeFunc func, void *userdata, const PBVHParallelSettings *settings)
+      : func(func), userdata(userdata), settings(settings)
   {
+    init_chunk(settings->userdata_chunk);
   }
 
+  /* Copy constructor. */
   PBVHTask(const PBVHTask &other)
-      : func(other.func),
-        userdata(other.userdata),
-        settings(other.settings),
-        userdata_chunk(0),
-        userdata_chunk_free(false)
+      : func(other.func), userdata(other.userdata), settings(other.settings)
   {
-    if (other.userdata_chunk) {
-      userdata_chunk = MEM_mallocN(settings->userdata_chunk_size, "PBVHTask");
-      memcpy(userdata_chunk, other.userdata_chunk, settings->userdata_chunk_size);
-      userdata_chunk_free = true;
-    }
+    init_chunk(other.userdata_chunk);
   }
 
-  PBVHTask(PBVHTask &other, tbb::split) : PBVHTask(other)
+  /* Splitting constructor for parallel reduce. */
+  PBVHTask(PBVHTask &other, tbb::split)
+      : func(other.func), userdata(other.userdata), settings(other.settings)
   {
+    init_chunk(settings->userdata_chunk);
   }
 
   ~PBVHTask()
   {
-    if (userdata_chunk_free) {
-      MEM_freeN(userdata_chunk);
+    MEM_SAFE_FREE(userdata_chunk);
+  }
+
+  void init_chunk(void *from_chunk)
+  {
+    if (from_chunk) {
+      userdata_chunk = MEM_mallocN(settings->userdata_chunk_size, "PBVHTask");
+      memcpy(userdata_chunk, from_chunk, settings->userdata_chunk_size);
+      userdata_chunk_free = true;
+    }
+    else {
+      userdata_chunk = NULL;
+      userdata_chunk_free = false;
     }
   }
 
@@ -111,15 +121,13 @@ void BKE_pbvh_parallel_range(const int start,
 #ifdef WITH_TBB
   /* Multithreading. */
   if (settings->use_threading) {
-    PBVHTask task;
-    task.func = func;
-    task.userdata = userdata;
-    task.settings = settings;
-    task.userdata_chunk = settings->userdata_chunk;
-    task.userdata_chunk_free = false;
+    PBVHTask task(func, userdata, settings);
 
     if (settings->func_reduce) {
       parallel_reduce(tbb::blocked_range<int>(start, stop), task);
+      if (settings->userdata_chunk) {
+        memcpy(settings->userdata_chunk, task.userdata_chunk, settings->userdata_chunk_size);
+      }
     }
     else {
       parallel_for(tbb::blocked_range<int>(start, stop), task);



More information about the Bf-blender-cvs mailing list