diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-10-11 01:44:29 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2019-10-11 02:26:56 +0300 |
commit | 00b6f8ef9079b54ab128413e9fda3d1435a45083 (patch) | |
tree | 5734009ba01c75b36b622d4fc1514b8f1f9a361d /source/blender/blenkernel/intern/pbvh_parallel.cc | |
parent | b8f769fee80b8534f8f40e3af0b0d5e24a92f923 (diff) |
Fix T70715: sculpt brush jitter after recent TBB changes
Fix error in the splitting constructor, and some refactoring.
Diffstat (limited to 'source/blender/blenkernel/intern/pbvh_parallel.cc')
-rw-r--r-- | source/blender/blenkernel/intern/pbvh_parallel.cc | 48 |
1 files changed, 28 insertions, 20 deletions
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); |