Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/mesh_evaluate.c
| Show First 20 Lines • Show All 1,294 Lines • ▼ Show 20 Lines | if (data->e2l_prev) { | ||||
| split_loop_nor_fan_do(common_data, data); | split_loop_nor_fan_do(common_data, data); | ||||
| } | } | ||||
| else { | else { | ||||
| /* No need for edge_vectors for 'single' case! */ | /* No need for edge_vectors for 'single' case! */ | ||||
| split_loop_nor_single_do(common_data, data); | split_loop_nor_single_do(common_data, data); | ||||
| } | } | ||||
| } | } | ||||
| static void loop_split_worker(TaskPool *__restrict pool, void *taskdata, int UNUSED(threadid)) | static void loop_split_worker(TaskPool *__restrict pool, void *taskdata) | ||||
| { | { | ||||
| LoopSplitTaskDataCommon *common_data = BLI_task_pool_userdata(pool); | LoopSplitTaskDataCommon *common_data = BLI_task_pool_tbb_user_data(pool); | ||||
| LoopSplitTaskData *data = taskdata; | LoopSplitTaskData *data = taskdata; | ||||
| /* Temp edge vectors stack, only used when computing lnor spacearr. */ | /* Temp edge vectors stack, only used when computing lnor spacearr. */ | ||||
| BLI_Stack *edge_vectors = common_data->lnors_spacearr ? | BLI_Stack *edge_vectors = common_data->lnors_spacearr ? | ||||
| BLI_stack_new(sizeof(float[3]), __func__) : | BLI_stack_new(sizeof(float[3]), __func__) : | ||||
| NULL; | NULL; | ||||
| #ifdef DEBUG_TIME | #ifdef DEBUG_TIME | ||||
| ▲ Show 20 Lines • Show All 236 Lines • ▼ Show 20 Lines | #endif | ||||
| if (lnors_spacearr) { | if (lnors_spacearr) { | ||||
| data->lnor_space = BKE_lnor_space_create(lnors_spacearr); | data->lnor_space = BKE_lnor_space_create(lnors_spacearr); | ||||
| } | } | ||||
| } | } | ||||
| if (pool) { | if (pool) { | ||||
| data_idx++; | data_idx++; | ||||
| if (data_idx == LOOP_SPLIT_TASK_BLOCK_SIZE) { | if (data_idx == LOOP_SPLIT_TASK_BLOCK_SIZE) { | ||||
| BLI_task_pool_push(pool, loop_split_worker, data_buff, true, NULL); | BLI_task_pool_tbb_push(pool, loop_split_worker, data_buff, true, NULL); | ||||
| data_idx = 0; | data_idx = 0; | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| loop_split_worker_do(common_data, data, edge_vectors); | loop_split_worker_do(common_data, data, edge_vectors); | ||||
| } | } | ||||
| } | } | ||||
| ml_prev = ml_curr; | ml_prev = ml_curr; | ||||
| ml_prev_index = ml_curr_index; | ml_prev_index = ml_curr_index; | ||||
| } | } | ||||
| } | } | ||||
| /* Last block of data... Since it is calloc'ed and we use first NULL item as stopper, | /* Last block of data... Since it is calloc'ed and we use first NULL item as stopper, | ||||
| * everything is fine. */ | * everything is fine. */ | ||||
| if (pool && data_idx) { | if (pool && data_idx) { | ||||
| BLI_task_pool_push(pool, loop_split_worker, data_buff, true, NULL); | BLI_task_pool_tbb_push(pool, loop_split_worker, data_buff, true, NULL); | ||||
| } | } | ||||
| if (edge_vectors) { | if (edge_vectors) { | ||||
| BLI_stack_free(edge_vectors); | BLI_stack_free(edge_vectors); | ||||
| } | } | ||||
| MEM_freeN(skip_loops); | MEM_freeN(skip_loops); | ||||
| #ifdef DEBUG_TIME | #ifdef DEBUG_TIME | ||||
| ▲ Show 20 Lines • Show All 118 Lines • ▼ Show 20 Lines | #endif | ||||
| if (numLoops < LOOP_SPLIT_TASK_BLOCK_SIZE * 8) { | if (numLoops < LOOP_SPLIT_TASK_BLOCK_SIZE * 8) { | ||||
| /* Not enough loops to be worth the whole threading overhead... */ | /* Not enough loops to be worth the whole threading overhead... */ | ||||
| loop_split_generator(NULL, &common_data); | loop_split_generator(NULL, &common_data); | ||||
| } | } | ||||
| else { | else { | ||||
| TaskScheduler *task_scheduler; | TaskScheduler *task_scheduler; | ||||
| TaskPool *task_pool; | TaskPool *task_pool; | ||||
| task_scheduler = BLI_task_scheduler_get(); | task_scheduler = BLI_task_scheduler_legacy_get(); | ||||
| task_pool = BLI_task_pool_create(task_scheduler, &common_data, TASK_PRIORITY_HIGH); | task_pool = BLI_task_pool_tbb_create(task_scheduler, &common_data, TASK_PRIORITY_HIGH); | ||||
| loop_split_generator(task_pool, &common_data); | loop_split_generator(task_pool, &common_data); | ||||
| BLI_task_pool_work_and_wait(task_pool); | BLI_task_pool_tbb_work_and_wait(task_pool); | ||||
| BLI_task_pool_free(task_pool); | BLI_task_pool_tbb_free(task_pool); | ||||
| } | } | ||||
| MEM_freeN(edge_to_loops); | MEM_freeN(edge_to_loops); | ||||
| if (!r_loop_to_poly) { | if (!r_loop_to_poly) { | ||||
| MEM_freeN(loop_to_poly); | MEM_freeN(loop_to_poly); | ||||
| } | } | ||||
| if (r_lnors_spacearr) { | if (r_lnors_spacearr) { | ||||
| ▲ Show 20 Lines • Show All 2,294 Lines • Show Last 20 Lines | |||||