diff options
author | Germano Cavalcante <germano.costa@ig.com.br> | 2021-06-10 17:13:01 +0300 |
---|---|---|
committer | Germano Cavalcante <germano.costa@ig.com.br> | 2021-06-11 16:49:50 +0300 |
commit | 0eb9351296dbed5e7ac10ca56132d5e51e5f388d (patch) | |
tree | 48de5ef4538c9346d1cc9130ffe50ee8c052fc32 /source/blender/draw/intern/draw_cache_extract_mesh.cc | |
parent | 2330cec2c6a7632459c21f51723497e349a042bf (diff) |
Refactor: use 'BLI_task_parallel_range' in Draw Cache
One drawback to trying to predict the number of threads that will be
used in the `task_graph` is that we are only sure of the number when the
threads are running.
Using `BLI_task_parallel_range` allows the driver to
choose the best thread distribution through `parallel_reduce`.
The benefit is most evident on hardware with fewer cores.
This is the result on an 4-core laptop:
||before:|after:
|---|---|---|
|large_mesh_editing:|Average: 5.203638 FPS|Average: 5.398925 FPS
||rdata 15ms iter 43ms (frame 193ms)|rdata 14ms iter 36ms (frame 187ms)
Differential Revision: https://developer.blender.org/D11558
Diffstat (limited to 'source/blender/draw/intern/draw_cache_extract_mesh.cc')
-rw-r--r-- | source/blender/draw/intern/draw_cache_extract_mesh.cc | 26 |
1 files changed, 13 insertions, 13 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.cc b/source/blender/draw/intern/draw_cache_extract_mesh.cc index c6303d541b3..c6b749fe11a 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.cc +++ b/source/blender/draw/intern/draw_cache_extract_mesh.cc @@ -50,7 +50,7 @@ # include "PIL_time_utildefines.h" #endif -#define CHUNK_SIZE 1024 +#define MIM_RANGE_LEN 1024 namespace blender::draw { @@ -439,18 +439,18 @@ static void extract_task_range_run(void *__restrict taskdata) const eMRIterType iter_type = data->iter_type; const bool is_mesh = data->mr->extract_type != MR_EXTRACT_BMESH; + size_t userdata_chunk_size = data->extractors->data_size_total(); + char *userdata_chunk = new char[userdata_chunk_size]; + TaskParallelSettings settings; BLI_parallel_range_settings_defaults(&settings); - settings.func_reduce = extract_task_reduce; - settings.min_iter_per_thread = CHUNK_SIZE; settings.use_threading = data->use_threading; + settings.userdata_chunk = userdata_chunk; + settings.userdata_chunk_size = userdata_chunk_size; + settings.func_reduce = extract_task_reduce; + settings.min_iter_per_thread = MIM_RANGE_LEN; - size_t chunk_size = data->extractors->data_size_total(); - char *chunk = new char[chunk_size]; - extract_init(data->mr, data->cache, *data->extractors, data->mbc, (void *)chunk); - - settings.userdata_chunk = chunk; - settings.userdata_chunk_size = chunk_size; + extract_init(data->mr, data->cache, *data->extractors, data->mbc, (void *)userdata_chunk); if (iter_type & MR_ITER_LOOPTRI) { extract_task_range_run_iter(data->mr, data->extractors, MR_ITER_LOOPTRI, is_mesh, &settings); @@ -465,14 +465,14 @@ static void extract_task_range_run(void *__restrict taskdata) extract_task_range_run_iter(data->mr, data->extractors, MR_ITER_LVERT, is_mesh, &settings); } - extract_finish(data->mr, data->cache, *data->extractors, (void *)chunk); - delete[] chunk; + extract_finish(data->mr, data->cache, *data->extractors, (void *)userdata_chunk); + delete[] userdata_chunk; } /** \} */ /* ---------------------------------------------------------------------- */ -/** \name Extract Single Thread +/** \name Extract In Parallel Ranges * \{ */ static struct TaskNode *extract_task_node_create(struct TaskGraph *task_graph, @@ -705,7 +705,7 @@ static void mesh_buffer_cache_create_requested(struct TaskGraph *task_graph, task_graph, mr, iter_type, data_flag); /* Simple heuristic. */ - const bool use_thread = (mr->loop_len + mr->loop_loose_len) > CHUNK_SIZE; + const bool use_thread = (mr->loop_len + mr->loop_loose_len) > MIM_RANGE_LEN; if (use_thread) { /* First run the requested extractors that do not support asynchronous ranges. */ |