Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2019-10-11 01:44:29 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2019-10-11 02:26:56 +0300
commit00b6f8ef9079b54ab128413e9fda3d1435a45083 (patch)
tree5734009ba01c75b36b622d4fc1514b8f1f9a361d /source/blender/blenkernel/intern/pbvh_parallel.cc
parentb8f769fee80b8534f8f40e3af0b0d5e24a92f923 (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.cc48
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);