diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-01-09 18:15:33 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2018-01-09 18:15:33 +0300 |
commit | 6deb908a5c9f34deb4c19561082b14d8eda51e43 (patch) | |
tree | e72c9fd7b77f486deea839428573c0788c9ceda9 /source/blender/blenkernel | |
parent | 1cab3be7a7af483ed645c2912b3aed3292812746 (diff) | |
parent | 932d448ae013b5425efa974be5a106d9d6a16652 (diff) |
Merge branch 'master' into blender2.8
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r-- | source/blender/blenkernel/intern/CCGSubSurf_legacy.c | 96 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/colortools.c | 16 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/dynamicpaint.c | 384 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mask_rasterize.c | 11 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/mesh_evaluate.c | 24 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/ocean.c | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/particle_system.c | 70 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/pbvh.c | 22 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/shrinkwrap.c | 47 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/smoke.c | 41 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking_auto.c | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking_stabilize.c | 11 |
12 files changed, 549 insertions, 190 deletions
diff --git a/source/blender/blenkernel/intern/CCGSubSurf_legacy.c b/source/blender/blenkernel/intern/CCGSubSurf_legacy.c index f68d1a2697c..363b7cff453 100644 --- a/source/blender/blenkernel/intern/CCGSubSurf_legacy.c +++ b/source/blender/blenkernel/intern/CCGSubSurf_legacy.c @@ -136,7 +136,8 @@ typedef struct CCGSubSurfCalcSubdivData { int curLvl; } CCGSubSurfCalcSubdivData; -static void ccgSubSurf__calcVertNormals_faces_accumulate_cb(void *userdata, int ptrIdx) +static void ccgSubSurf__calcVertNormals_faces_accumulate_cb(void *userdata, int ptrIdx, + const ParallelRangeTLS *UNUSED(tls)) { CCGSubSurfCalcSubdivData *data = userdata; @@ -227,7 +228,8 @@ static void ccgSubSurf__calcVertNormals_faces_accumulate_cb(void *userdata, int } } -static void ccgSubSurf__calcVertNormals_faces_finalize_cb(void *userdata, int ptrIdx) +static void ccgSubSurf__calcVertNormals_faces_finalize_cb(void *userdata, int ptrIdx, + const ParallelRangeTLS *UNUSED(tls)) { CCGSubSurfCalcSubdivData *data = userdata; @@ -265,7 +267,8 @@ static void ccgSubSurf__calcVertNormals_faces_finalize_cb(void *userdata, int pt } } -static void ccgSubSurf__calcVertNormals_edges_accumulate_cb(void *userdata, int ptrIdx) +static void ccgSubSurf__calcVertNormals_edges_accumulate_cb(void *userdata, int ptrIdx, + const ParallelRangeTLS *UNUSED(tls)) { CCGSubSurfCalcSubdivData *data = userdata; @@ -328,10 +331,15 @@ static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss, .numEffectedF = numEffectedF }; - BLI_task_parallel_range(0, numEffectedF, - &data, - ccgSubSurf__calcVertNormals_faces_accumulate_cb, - numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + BLI_task_parallel_range(0, numEffectedF, + &data, + ccgSubSurf__calcVertNormals_faces_accumulate_cb, + &settings); + } /* XXX can I reduce the number of normalisations here? */ for (ptrIdx = 0; ptrIdx < numEffectedV; ptrIdx++) { @@ -357,15 +365,25 @@ static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss, } } - BLI_task_parallel_range(0, numEffectedE, - &data, - ccgSubSurf__calcVertNormals_edges_accumulate_cb, - numEffectedE * edgeSize * 4 >= CCG_OMP_LIMIT); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (numEffectedE * edgeSize * 4 >= CCG_OMP_LIMIT); + BLI_task_parallel_range(0, numEffectedE, + &data, + ccgSubSurf__calcVertNormals_edges_accumulate_cb, + &settings); + } - BLI_task_parallel_range(0, numEffectedF, - &data, - ccgSubSurf__calcVertNormals_faces_finalize_cb, - numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + BLI_task_parallel_range(0, numEffectedF, + &data, + ccgSubSurf__calcVertNormals_faces_finalize_cb, + &settings); + } for (ptrIdx = 0; ptrIdx < numEffectedE; ptrIdx++) { CCGEdge *e = (CCGEdge *) effectedE[ptrIdx]; @@ -396,7 +414,8 @@ static void ccgSubSurf__calcVertNormals(CCGSubSurf *ss, } -static void ccgSubSurf__calcSubdivLevel_interior_faces_edges_midpoints_cb(void *userdata, int ptrIdx) +static void ccgSubSurf__calcSubdivLevel_interior_faces_edges_midpoints_cb(void *userdata, int ptrIdx, + const ParallelRangeTLS *UNUSED(tls)) { CCGSubSurfCalcSubdivData *data = userdata; @@ -483,7 +502,8 @@ static void ccgSubSurf__calcSubdivLevel_interior_faces_edges_midpoints_cb(void * } } -static void ccgSubSurf__calcSubdivLevel_interior_faces_edges_centerpoints_shift_cb(void *userdata, int ptrIdx) +static void ccgSubSurf__calcSubdivLevel_interior_faces_edges_centerpoints_shift_cb(void *userdata, int ptrIdx, + const ParallelRangeTLS *UNUSED(tls)) { CCGSubSurfCalcSubdivData *data = userdata; @@ -588,7 +608,8 @@ static void ccgSubSurf__calcSubdivLevel_interior_faces_edges_centerpoints_shift_ } } -static void ccgSubSurf__calcSubdivLevel_verts_copydata_cb(void *userdata, int ptrIdx) +static void ccgSubSurf__calcSubdivLevel_verts_copydata_cb(void *userdata, int ptrIdx, + const ParallelRangeTLS *UNUSED(tls)) { CCGSubSurfCalcSubdivData *data = userdata; @@ -647,10 +668,15 @@ static void ccgSubSurf__calcSubdivLevel( .curLvl = curLvl }; - BLI_task_parallel_range(0, numEffectedF, - &data, - ccgSubSurf__calcSubdivLevel_interior_faces_edges_midpoints_cb, - numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + BLI_task_parallel_range(0, numEffectedF, + &data, + ccgSubSurf__calcSubdivLevel_interior_faces_edges_midpoints_cb, + &settings); + } /* exterior edge midpoints * - old exterior edge points @@ -925,10 +951,15 @@ static void ccgSubSurf__calcSubdivLevel( } } - BLI_task_parallel_range(0, numEffectedF, - &data, - ccgSubSurf__calcSubdivLevel_interior_faces_edges_centerpoints_shift_cb, - numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + BLI_task_parallel_range(0, numEffectedF, + &data, + ccgSubSurf__calcSubdivLevel_interior_faces_edges_centerpoints_shift_cb, + &settings); + } /* copy down */ edgeSize = ccg_edgesize(nextLvl); @@ -940,10 +971,15 @@ static void ccgSubSurf__calcSubdivLevel( VertDataCopy(EDGE_getCo(e, nextLvl, edgeSize - 1), VERT_getCo(e->v1, nextLvl), ss); } - BLI_task_parallel_range(0, numEffectedF, - &data, - ccgSubSurf__calcSubdivLevel_verts_copydata_cb, - numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (numEffectedF * edgeSize * edgeSize * 4 >= CCG_OMP_LIMIT); + BLI_task_parallel_range(0, numEffectedF, + &data, + ccgSubSurf__calcSubdivLevel_verts_copydata_cb, + &settings); + } } void ccgSubSurf__sync_legacy(CCGSubSurf *ss) diff --git a/source/blender/blenkernel/intern/colortools.c b/source/blender/blenkernel/intern/colortools.c index 310255a15c1..46d06a3ac78 100644 --- a/source/blender/blenkernel/intern/colortools.c +++ b/source/blender/blenkernel/intern/colortools.c @@ -1165,7 +1165,7 @@ typedef struct ScopesUpdateDataChunk { float min[3], max[3]; } ScopesUpdateDataChunk; -static void scopes_update_cb(void *userdata, void *userdata_chunk, const int y, const int UNUSED(threadid)) +static void scopes_update_cb(void *userdata, const int y, const ParallelRangeTLS *tls) { const ScopesUpdateData *data = userdata; @@ -1175,7 +1175,7 @@ static void scopes_update_cb(void *userdata, void *userdata_chunk, const int y, const unsigned char *display_buffer = data->display_buffer; const int ycc_mode = data->ycc_mode; - ScopesUpdateDataChunk *data_chunk = userdata_chunk; + ScopesUpdateDataChunk *data_chunk = tls->userdata_chunk; unsigned int *bin_lum = data_chunk->bin_lum; unsigned int *bin_r = data_chunk->bin_r; unsigned int *bin_g = data_chunk->bin_g; @@ -1387,8 +1387,16 @@ void scopes_update(Scopes *scopes, ImBuf *ibuf, const ColorManagedViewSettings * ScopesUpdateDataChunk data_chunk = {{0}}; INIT_MINMAX(data_chunk.min, data_chunk.max); - BLI_task_parallel_range_finalize(0, ibuf->y, &data, &data_chunk, sizeof(data_chunk), - scopes_update_cb, scopes_update_finalize, ibuf->y > 256, false); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (ibuf->y > 256); + settings.userdata_chunk = &data_chunk; + settings.userdata_chunk_size = sizeof(data_chunk); + settings.func_finalize = scopes_update_finalize; + BLI_task_parallel_range(0, ibuf->y, + &data, + scopes_update_cb, + &settings); /* test for nicer distribution even - non standard, leave it out for a while */ #if 0 diff --git a/source/blender/blenkernel/intern/dynamicpaint.c b/source/blender/blenkernel/intern/dynamicpaint.c index 8d27fcd2835..0773d069767 100644 --- a/source/blender/blenkernel/intern/dynamicpaint.c +++ b/source/blender/blenkernel/intern/dynamicpaint.c @@ -604,11 +604,11 @@ static void freeGrid(PaintSurfaceData *data) bData->grid = NULL; } -static void grid_bound_insert_cb_ex(void *userdata, void *userdata_chunk, const int i, const int UNUSED(thread_id)) +static void grid_bound_insert_cb_ex(void *userdata, const int i, const ParallelRangeTLS *tls) { PaintBakeData *bData = userdata; - Bounds3D *grid_bound = userdata_chunk; + Bounds3D *grid_bound = tls->userdata_chunk; boundInsert(grid_bound, bData->realCoord[bData->s_pos[i]].v); } @@ -624,12 +624,12 @@ static void grid_bound_insert_finalize(void *userdata, void *userdata_chunk) boundInsert(&grid->grid_bounds, grid_bound->max); } -static void grid_cell_points_cb_ex(void *userdata, void *userdata_chunk, const int i, const int UNUSED(thread_id)) +static void grid_cell_points_cb_ex(void *userdata, const int i, const ParallelRangeTLS *tls) { PaintBakeData *bData = userdata; VolumeGrid *grid = bData->grid; int *temp_t_index = grid->temp_t_index; - int *s_num = userdata_chunk; + int *s_num = tls->userdata_chunk; int co[3]; @@ -657,7 +657,7 @@ static void grid_cell_points_finalize(void *userdata, void *userdata_chunk) } } -static void grid_cell_bounds_cb(void *userdata, const int x) +static void grid_cell_bounds_cb(void *userdata, const int x, const ParallelRangeTLS *UNUSED(tls)) { PaintBakeData *bData = userdata; VolumeGrid *grid = bData->grid; @@ -702,10 +702,19 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface) /* calculate canvas dimensions */ /* Important to init correctly our ref grid_bound... */ boundInsert(&grid->grid_bounds, bData->realCoord[bData->s_pos[0]].v); - BLI_task_parallel_range_finalize( - 0, sData->total_points, bData, &grid->grid_bounds, sizeof(grid->grid_bounds), - grid_bound_insert_cb_ex, grid_bound_insert_finalize, sData->total_points > 1000, false); - + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + settings.userdata_chunk = &grid->grid_bounds; + settings.userdata_chunk_size = sizeof(grid->grid_bounds); + settings.func_finalize = grid_bound_insert_finalize; + BLI_task_parallel_range( + 0, sData->total_points, + bData, + grid_bound_insert_cb_ex, + &settings); + } /* get dimensions */ sub_v3_v3v3(dim, grid->grid_bounds.max, grid->grid_bounds.min); copy_v3_v3(td, dim); @@ -754,9 +763,19 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface) if (!error) { /* calculate number of points withing each cell */ - BLI_task_parallel_range_finalize( - 0, sData->total_points, bData, grid->s_num, sizeof(*grid->s_num) * grid_cells, - grid_cell_points_cb_ex, grid_cell_points_finalize, sData->total_points > 1000, false); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + settings.userdata_chunk = grid->s_num; + settings.userdata_chunk_size = sizeof(*grid->s_num) * grid_cells; + settings.func_finalize = grid_cell_points_finalize; + BLI_task_parallel_range( + 0, sData->total_points, + bData, + grid_cell_points_cb_ex, + &settings); + } /* calculate grid indexes (not needed for first cell, which is zero). */ for (i = 1; i < grid_cells; i++) { @@ -772,7 +791,15 @@ static void surfaceGenerateGrid(struct DynamicPaintSurface *surface) } /* calculate cell bounds */ - BLI_task_parallel_range(0, grid->dim[0], bData, grid_cell_bounds_cb, grid_cells > 1000); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (grid_cells > 1000); + BLI_task_parallel_range(0, grid->dim[0], + bData, + grid_cell_bounds_cb, + &settings); + } } if (temp_s_num) @@ -1390,7 +1417,8 @@ typedef struct DynamicPaintSetInitColorData { const bool scene_color_manage; } DynamicPaintSetInitColorData; -static void dynamic_paint_set_init_color_tex_to_vcol_cb(void *userdata, const int i) +static void dynamic_paint_set_init_color_tex_to_vcol_cb(void *userdata, const int i, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintSetInitColorData *data = userdata; @@ -1424,7 +1452,8 @@ static void dynamic_paint_set_init_color_tex_to_vcol_cb(void *userdata, const in } } -static void dynamic_paint_set_init_color_tex_to_imseq_cb(void *userdata, const int i) +static void dynamic_paint_set_init_color_tex_to_imseq_cb(void *userdata, const int i, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintSetInitColorData *data = userdata; @@ -1462,7 +1491,8 @@ static void dynamic_paint_set_init_color_tex_to_imseq_cb(void *userdata, const i pPoint[i].color[3] = texres.tin; } -static void dynamic_paint_set_init_color_vcol_to_imseq_cb(void *userdata, const int i) +static void dynamic_paint_set_init_color_vcol_to_imseq_cb(void *userdata, const int i, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintSetInitColorData *data = userdata; @@ -1540,7 +1570,13 @@ static void dynamicPaint_setInitialColor(const Scene *scene, DynamicPaintSurface .mloop = mloop, .mlooptri = mlooptri, .mloopuv = mloopuv, .pool = pool, .scene_color_manage = scene_color_manage }; - BLI_task_parallel_range(0, tottri, &data, dynamic_paint_set_init_color_tex_to_vcol_cb, tottri > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (tottri > 1000); + BLI_task_parallel_range(0, tottri, + &data, + dynamic_paint_set_init_color_tex_to_vcol_cb, + &settings); BKE_image_pool_free(pool); } else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) { @@ -1549,8 +1585,13 @@ static void dynamicPaint_setInitialColor(const Scene *scene, DynamicPaintSurface .mlooptri = mlooptri, .mloopuv = mloopuv, .scene_color_manage = scene_color_manage }; - BLI_task_parallel_range(0, sData->total_points, &data, dynamic_paint_set_init_color_tex_to_imseq_cb, - sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_set_init_color_tex_to_imseq_cb, + &settings); } } /* vertex color layer */ @@ -1578,8 +1619,13 @@ static void dynamicPaint_setInitialColor(const Scene *scene, DynamicPaintSurface .surface = surface, .mlooptri = mlooptri, .mloopcol = col, }; - BLI_task_parallel_range(0, sData->total_points, &data, dynamic_paint_set_init_color_vcol_to_imseq_cb, - sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_set_init_color_vcol_to_imseq_cb, + &settings); } } } @@ -1666,7 +1712,8 @@ typedef struct DynamicPaintModifierApplyData { MLoopCol *mloopcol_preview; } DynamicPaintModifierApplyData; -static void dynamic_paint_apply_surface_displace_cb(void *userdata, const int i) +static void dynamic_paint_apply_surface_displace_cb(void *userdata, const int i, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintModifierApplyData *data = userdata; @@ -1696,12 +1743,18 @@ static void dynamicPaint_applySurfaceDisplace(DynamicPaintSurface *surface, Deri MVert *mvert = result->getVertArray(result); DynamicPaintModifierApplyData data = {.surface = surface, .mvert = mvert}; - BLI_task_parallel_range(0, sData->total_points, &data, dynamic_paint_apply_surface_displace_cb, - sData->total_points > 10000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 10000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_apply_surface_displace_cb, + &settings); } } -static void dynamic_paint_apply_surface_vpaint_blend_cb(void *userdata, const int i) +static void dynamic_paint_apply_surface_vpaint_blend_cb(void *userdata, const int i, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintModifierApplyData *data = userdata; @@ -1712,7 +1765,8 @@ static void dynamic_paint_apply_surface_vpaint_blend_cb(void *userdata, const in blendColors(pPoint[i].color, pPoint[i].color[3], pPoint[i].e_color, pPoint[i].e_color[3], fcolor[i]); } -static void dynamic_paint_apply_surface_vpaint_cb(void *userdata, const int p_index) +static void dynamic_paint_apply_surface_vpaint_cb(void *userdata, const int p_index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintModifierApplyData *data = userdata; Object *ob = data->ob; @@ -1782,7 +1836,8 @@ static void dynamic_paint_apply_surface_vpaint_cb(void *userdata, const int p_in } } -static void dynamic_paint_apply_surface_wave_cb(void *userdata, const int i) +static void dynamic_paint_apply_surface_wave_cb(void *userdata, const int i, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintModifierApplyData *data = userdata; @@ -1829,9 +1884,16 @@ static DerivedMesh *dynamicPaint_Modifier_apply( float (*fcolor)[4] = MEM_callocN(sizeof(*fcolor) * sData->total_points, "Temp paint color"); DynamicPaintModifierApplyData data = {.surface = surface, .fcolor = fcolor}; - BLI_task_parallel_range(0, sData->total_points, &data, - dynamic_paint_apply_surface_vpaint_blend_cb, - sData->total_points > 1000); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range( + 0, sData->total_points, + &data, + dynamic_paint_apply_surface_vpaint_blend_cb, + &settings); + } /* paint layer */ MLoopCol *mloopcol = CustomData_get_layer_named(&result->loopData, CD_MLOOPCOL, surface->output_name); @@ -1866,8 +1928,16 @@ static DerivedMesh *dynamicPaint_Modifier_apply( data.mloopcol_wet = mloopcol_wet; data.mloopcol_preview = mloopcol_preview; - BLI_task_parallel_range(0, totpoly, &data, dynamic_paint_apply_surface_vpaint_cb, - totpoly > 1000); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (totpoly > 1000); + BLI_task_parallel_range( + 0, totpoly, + &data, + dynamic_paint_apply_surface_vpaint_cb, + &settings); + } MEM_freeN(fcolor); @@ -1917,8 +1987,14 @@ static DerivedMesh *dynamicPaint_Modifier_apply( MVert *mvert = result->getVertArray(result); DynamicPaintModifierApplyData data = {.surface = surface, .mvert = mvert}; - BLI_task_parallel_range(0, sData->total_points, &data, dynamic_paint_apply_surface_wave_cb, - sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range( + 0, sData->total_points, + &data, + dynamic_paint_apply_surface_wave_cb, + &settings); update_normals = true; } @@ -2103,7 +2179,8 @@ typedef struct DynamicPaintCreateUVSurfaceData { uint32_t *active_points; } DynamicPaintCreateUVSurfaceData; -static void dynamic_paint_create_uv_surface_direct_cb(void *userdata, const int ty) +static void dynamic_paint_create_uv_surface_direct_cb(void *userdata, const int ty, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintCreateUVSurfaceData *data = userdata; @@ -2200,7 +2277,8 @@ static void dynamic_paint_create_uv_surface_direct_cb(void *userdata, const int } } -static void dynamic_paint_create_uv_surface_neighbor_cb(void *userdata, const int ty) +static void dynamic_paint_create_uv_surface_neighbor_cb(void *userdata, const int ty, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintCreateUVSurfaceData *data = userdata; @@ -2760,7 +2838,15 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface, flo .mlooptri = mlooptri, .mloopuv = mloopuv, .mloop = mloop, .tottri = tottri, .faceBB = faceBB, }; - BLI_task_parallel_range(0, h, &data, dynamic_paint_create_uv_surface_direct_cb, h > 64 || tottri > 1000); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (h > 64 || tottri > 1000); + BLI_task_parallel_range(0, h, + &data, + dynamic_paint_create_uv_surface_direct_cb, + &settings); + } *progress = 0.04f; *do_update = true; @@ -2772,7 +2858,15 @@ int dynamicPaint_createUVSurface(Scene *scene, DynamicPaintSurface *surface, flo * (To avoid seams on uv island edges) */ data.active_points = &active_points; - BLI_task_parallel_range(0, h, &data, dynamic_paint_create_uv_surface_neighbor_cb, h > 64); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (h > 64); + BLI_task_parallel_range(0, h, + &data, + dynamic_paint_create_uv_surface_neighbor_cb, + &settings); + } *progress = 0.06f; *do_update = true; @@ -2992,7 +3086,8 @@ typedef struct DynamicPaintOutputSurfaceImageData { ImBuf *ibuf; } DynamicPaintOutputSurfaceImageData; -static void dynamic_paint_output_surface_image_paint_cb(void *userdata, const int index) +static void dynamic_paint_output_surface_image_paint_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintOutputSurfaceImageData *data = userdata; @@ -3012,7 +3107,8 @@ static void dynamic_paint_output_surface_image_paint_cb(void *userdata, const in } } -static void dynamic_paint_output_surface_image_displace_cb(void *userdata, const int index) +static void dynamic_paint_output_surface_image_displace_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintOutputSurfaceImageData *data = userdata; @@ -3036,7 +3132,8 @@ static void dynamic_paint_output_surface_image_displace_cb(void *userdata, const ibuf->rect_float[pos + 3] = 1.0f; } -static void dynamic_paint_output_surface_image_wave_cb(void *userdata, const int index) +static void dynamic_paint_output_surface_image_wave_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintOutputSurfaceImageData *data = userdata; @@ -3058,7 +3155,8 @@ static void dynamic_paint_output_surface_image_wave_cb(void *userdata, const int ibuf->rect_float[pos + 3] = 1.0f; } -static void dynamic_paint_output_surface_image_wetmap_cb(void *userdata, const int index) +static void dynamic_paint_output_surface_image_wetmap_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintOutputSurfaceImageData *data = userdata; @@ -3109,13 +3207,29 @@ void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char *filenam case MOD_DPAINT_SURFACE_T_PAINT: switch (output_layer) { case 0: - BLI_task_parallel_range(0, sData->total_points, &data, - dynamic_paint_output_surface_image_paint_cb, sData->total_points > 10000); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 10000); + BLI_task_parallel_range( + 0, sData->total_points, + &data, + dynamic_paint_output_surface_image_paint_cb, + &settings); break; + } case 1: - BLI_task_parallel_range(0, sData->total_points, &data, - dynamic_paint_output_surface_image_wetmap_cb, sData->total_points > 10000); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 10000); + BLI_task_parallel_range( + 0, sData->total_points, + &data, + dynamic_paint_output_surface_image_wetmap_cb, + &settings); break; + } default: BLI_assert(0); break; @@ -3124,9 +3238,17 @@ void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char *filenam case MOD_DPAINT_SURFACE_T_DISPLACE: switch (output_layer) { case 0: - BLI_task_parallel_range(0, sData->total_points, &data, - dynamic_paint_output_surface_image_displace_cb, sData->total_points > 10000); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 10000); + BLI_task_parallel_range( + 0, sData->total_points, + &data, + dynamic_paint_output_surface_image_displace_cb, + &settings); break; + } case 1: break; default: @@ -3137,9 +3259,17 @@ void dynamicPaint_outputSurfaceImage(DynamicPaintSurface *surface, char *filenam case MOD_DPAINT_SURFACE_T_WAVE: switch (output_layer) { case 0: - BLI_task_parallel_range(0, sData->total_points, &data, - dynamic_paint_output_surface_image_wave_cb, sData->total_points > 10000); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 10000); + BLI_task_parallel_range( + 0, sData->total_points, + &data, + dynamic_paint_output_surface_image_wave_cb, + &settings); break; + } case 1: break; default: @@ -3546,7 +3676,8 @@ typedef struct DynamicPaintBrushVelocityData { const float timescale; } DynamicPaintBrushVelocityData; -static void dynamic_paint_brush_velocity_compute_cb(void *userdata, const int i) +static void dynamic_paint_brush_velocity_compute_cb(void *userdata, const int i, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintBrushVelocityData *data = userdata; @@ -3626,7 +3757,13 @@ static void dynamicPaint_brushMeshCalculateVelocity( .mvert_p = mvert_p, .mvert_c = mvert_c, .obmat = ob->obmat, .prev_obmat = prev_obmat, .timescale = timescale, }; - BLI_task_parallel_range(0, numOfVerts_c, &data, dynamic_paint_brush_velocity_compute_cb, numOfVerts_c > 10000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (numOfVerts_c > 10000); + BLI_task_parallel_range(0, numOfVerts_c, + &data, + dynamic_paint_brush_velocity_compute_cb, + &settings); dm_p->release(dm_p); } @@ -3697,7 +3834,7 @@ typedef struct DynamicPaintPaintData { * Paint a brush object mesh to the surface */ static void dynamic_paint_paint_mesh_cell_point_cb_ex( - void *userdata, void *UNUSED(userdata_chunk), const int id, const int UNUSED(threadid)) + void *userdata, const int id, const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintPaintData *data = userdata; @@ -4115,9 +4252,13 @@ static int dynamicPaint_paintMesh(const struct EvaluationContext *eval_ctx, Dyna .brush_radius = brush_radius, .avg_brushNor = avg_brushNor, .brushVelocity = brushVelocity, .treeData = &treeData }; - BLI_task_parallel_range_ex(0, grid->s_num[c_index], &data, NULL, 0, - dynamic_paint_paint_mesh_cell_point_cb_ex, - grid->s_num[c_index] > 250, true); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (grid->s_num[c_index] > 250); + BLI_task_parallel_range(0, grid->s_num[c_index], + &data, + dynamic_paint_paint_mesh_cell_point_cb_ex, + &settings); } } } @@ -4138,7 +4279,7 @@ static int dynamicPaint_paintMesh(const struct EvaluationContext *eval_ctx, Dyna * Paint a particle system to the surface */ static void dynamic_paint_paint_particle_cell_point_cb_ex( - void *userdata, void *UNUSED(userdata_chunk), const int id, const int UNUSED(threadid)) + void *userdata, const int id, const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintPaintData *data = userdata; @@ -4400,9 +4541,13 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, .solidradius = solidradius, .timescale = timescale, .c_index = c_index, .treeData = tree, }; - BLI_task_parallel_range_ex(0, grid->s_num[c_index], &data, NULL, 0, - dynamic_paint_paint_particle_cell_point_cb_ex, - grid->s_num[c_index] > 250, true); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (grid->s_num[c_index] > 250); + BLI_task_parallel_range(0, grid->s_num[c_index], + &data, + dynamic_paint_paint_particle_cell_point_cb_ex, + &settings); } } BLI_end_threaded_malloc(); @@ -4413,7 +4558,7 @@ static int dynamicPaint_paintParticles(DynamicPaintSurface *surface, /* paint a single point of defined proximity radius to the surface */ static void dynamic_paint_paint_single_point_cb_ex( - void *userdata, void *UNUSED(userdata_chunk), const int index, const int UNUSED(threadid)) + void *userdata, const int index, const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintPaintData *data = userdata; @@ -4545,9 +4690,13 @@ static int dynamicPaint_paintSinglePoint( .brush_radius = brush_radius, .brushVelocity = &brushVel, .pointCoord = pointCoord, }; - BLI_task_parallel_range_ex(0, sData->total_points, &data, NULL, 0, - dynamic_paint_paint_single_point_cb_ex, - sData->total_points > 1000, true); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_paint_single_point_cb_ex, + &settings); return 1; } @@ -4559,7 +4708,8 @@ static int dynamicPaint_paintSinglePoint( * Calculate current frame distances and directions for adjacency data */ -static void dynamic_paint_prepare_adjacency_cb(void *userdata, const int index) +static void dynamic_paint_prepare_adjacency_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { PaintSurfaceData *sData = userdata; PaintBakeData *bData = sData->bData; @@ -4598,8 +4748,13 @@ static void dynamicPaint_prepareAdjacencyData(DynamicPaintSurface *surface, cons if (!bNeighs) return; - BLI_task_parallel_range( - 0, sData->total_points, sData, dynamic_paint_prepare_adjacency_cb, sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + sData, + dynamic_paint_prepare_adjacency_cb, + &settings); /* calculate average values (single thread). * Note: tried to put this in threaded callback (using _finalize feature), but gave ~30% slower result! */ @@ -4786,7 +4941,8 @@ typedef struct DynamicPaintEffectData { * Prepare data required by effects for current frame. * Returns number of steps required */ -static void dynamic_paint_prepare_effect_cb(void *userdata, const int index) +static void dynamic_paint_prepare_effect_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintEffectData *data = userdata; @@ -4858,8 +5014,13 @@ static int dynamicPaint_prepareEffectStep( .surface = surface, .scene = scene, .force = *force, .effectors = effectors, }; - BLI_task_parallel_range( - 0, sData->total_points, &data, dynamic_paint_prepare_effect_cb, sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_prepare_effect_cb, + &settings); /* calculate average values (single thread) */ for (int index = 0; index < sData->total_points; index++) { @@ -4891,7 +5052,8 @@ static int dynamicPaint_prepareEffectStep( /** * Processes active effect step. */ -static void dynamic_paint_effect_spread_cb(void *userdata, const int index) +static void dynamic_paint_effect_spread_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintEffectData *data = userdata; @@ -4936,7 +5098,8 @@ static void dynamic_paint_effect_spread_cb(void *userdata, const int index) } } -static void dynamic_paint_effect_shrink_cb(void *userdata, const int index) +static void dynamic_paint_effect_shrink_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintEffectData *data = userdata; @@ -4986,7 +5149,8 @@ static void dynamic_paint_effect_shrink_cb(void *userdata, const int index) } } -static void dynamic_paint_effect_drip_cb(void *userdata, const int index) +static void dynamic_paint_effect_drip_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintEffectData *data = userdata; @@ -5119,8 +5283,13 @@ static void dynamicPaint_doEffectStep( DynamicPaintEffectData data = { .surface = surface, .prevPoint = prevPoint, .eff_scale = eff_scale, }; - BLI_task_parallel_range( - 0, sData->total_points, &data, dynamic_paint_effect_spread_cb, sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_effect_spread_cb, + &settings); } /* @@ -5135,8 +5304,13 @@ static void dynamicPaint_doEffectStep( DynamicPaintEffectData data = { .surface = surface, .prevPoint = prevPoint, .eff_scale = eff_scale, }; - BLI_task_parallel_range( - 0, sData->total_points, &data, dynamic_paint_effect_shrink_cb, sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_effect_shrink_cb, + &settings); } /* @@ -5157,14 +5331,20 @@ static void dynamicPaint_doEffectStep( .eff_scale = eff_scale, .force = force, .point_locks = point_locks, }; - BLI_task_parallel_range( - 0, sData->total_points, &data, dynamic_paint_effect_drip_cb, sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_effect_drip_cb, + &settings); MEM_freeN(point_locks); } } -static void dynamic_paint_border_cb(void *userdata, const int b_index) +static void dynamic_paint_border_cb(void *userdata, const int b_index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintEffectData *data = userdata; @@ -5234,11 +5414,17 @@ static void dynamicPaint_doBorderStep(DynamicPaintSurface *surface) .surface = surface }; - BLI_task_parallel_range( - 0, sData->adj_data->total_border, &data, dynamic_paint_border_cb, sData->adj_data->total_border > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->adj_data->total_border > 1000); + BLI_task_parallel_range(0, sData->adj_data->total_border, + &data, + dynamic_paint_border_cb, + &settings); } -static void dynamic_paint_wave_step_cb(void *userdata, const int index) +static void dynamic_paint_wave_step_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintEffectData *data = userdata; @@ -5380,8 +5566,12 @@ static void dynamicPaint_doWaveStep(DynamicPaintSurface *surface, float timescal .wave_speed = wave_speed, .wave_scale = wave_scale, .wave_max_slope = wave_max_slope, .dt = dt, .min_dist = min_dist, .damp_factor = damp_factor, .reset_wave = (ss == steps - 1), }; - BLI_task_parallel_range( - 0, sData->total_points, &data, dynamic_paint_wave_step_cb, sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, dynamic_paint_wave_step_cb, + &settings); } MEM_freeN(prevPoint); @@ -5401,7 +5591,8 @@ typedef struct DynamicPaintDissolveDryData { const float timescale; } DynamicPaintDissolveDryData; -static void dynamic_paint_surface_pre_step_cb(void *userdata, const int index) +static void dynamic_paint_surface_pre_step_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintDissolveDryData *data = userdata; @@ -5524,7 +5715,8 @@ typedef struct DynamicPaintGenerateBakeData { const bool new_bdata; } DynamicPaintGenerateBakeData; -static void dynamic_paint_generate_bake_data_cb(void *userdata, const int index) +static void dynamic_paint_generate_bake_data_cb(void *userdata, const int index, + const ParallelRangeTLS *UNUSED(tls)) { const DynamicPaintGenerateBakeData *data = userdata; @@ -5728,8 +5920,13 @@ static int dynamicPaint_generateBakeData(DynamicPaintSurface *surface, const Vie .mvert = mvert, .canvas_verts = canvas_verts, .do_velocity_data = do_velocity_data, .new_bdata = new_bdata, }; - BLI_task_parallel_range( - 0, sData->total_points, &data, dynamic_paint_generate_bake_data_cb, sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_generate_bake_data_cb, + &settings); MEM_freeN(canvas_verts); @@ -5762,8 +5959,13 @@ static int dynamicPaint_doStep(const struct EvaluationContext *eval_ctx, Scene * if (dynamic_paint_surface_needs_dry_dissolve(surface)) { DynamicPaintDissolveDryData data = {.surface = surface, .timescale = timescale}; - BLI_task_parallel_range(0, sData->total_points, &data, - dynamic_paint_surface_pre_step_cb, sData->total_points > 1000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (sData->total_points > 1000); + BLI_task_parallel_range(0, sData->total_points, + &data, + dynamic_paint_surface_pre_step_cb, + &settings); } /* diff --git a/source/blender/blenkernel/intern/mask_rasterize.c b/source/blender/blenkernel/intern/mask_rasterize.c index 104bb0c07a6..6efcb27c0f5 100644 --- a/source/blender/blenkernel/intern/mask_rasterize.c +++ b/source/blender/blenkernel/intern/mask_rasterize.c @@ -1434,7 +1434,8 @@ typedef struct MaskRasterizeBufferData { float *buffer; } MaskRasterizeBufferData; -static void maskrasterize_buffer_cb(void *userdata, int y) +static void maskrasterize_buffer_cb(void *userdata, int y, + const ParallelRangeTLS *UNUSED(tls)) { MaskRasterizeBufferData *data = userdata; @@ -1474,5 +1475,11 @@ void BKE_maskrasterize_buffer(MaskRasterHandle *mr_handle, .width = width, .buffer = buffer }; - BLI_task_parallel_range(0, (int)height, &data, maskrasterize_buffer_cb, height * width > 10000); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = ((size_t)height * width > 10000); + BLI_task_parallel_range(0, (int)height, + &data, + maskrasterize_buffer_cb, + &settings); } diff --git a/source/blender/blenkernel/intern/mesh_evaluate.c b/source/blender/blenkernel/intern/mesh_evaluate.c index 68283b4a3aa..f822ea836aa 100644 --- a/source/blender/blenkernel/intern/mesh_evaluate.c +++ b/source/blender/blenkernel/intern/mesh_evaluate.c @@ -177,7 +177,8 @@ typedef struct MeshCalcNormalsData { float (*vnors)[3]; } MeshCalcNormalsData; -static void mesh_calc_normals_poly_cb(void *userdata, const int pidx) +static void mesh_calc_normals_poly_cb(void *userdata, const int pidx, + const ParallelRangeTLS *UNUSED(tls)) { MeshCalcNormalsData *data = userdata; const MPoly *mp = &data->mpolys[pidx]; @@ -185,7 +186,8 @@ static void mesh_calc_normals_poly_cb(void *userdata, const int pidx) BKE_mesh_calc_poly_normal(mp, data->mloop + mp->loopstart, data->mverts, data->pnors[pidx]); } -static void mesh_calc_normals_poly_prepare_cb(void *userdata, const int pidx) +static void mesh_calc_normals_poly_prepare_cb(void *userdata, const int pidx, + const ParallelRangeTLS *UNUSED(tls)) { MeshCalcNormalsData *data = userdata; const MPoly *mp = &data->mpolys[pidx]; @@ -247,14 +249,16 @@ static void mesh_calc_normals_poly_prepare_cb(void *userdata, const int pidx) } } -static void mesh_calc_normals_poly_accum_cb(void *userdata, const int lidx) +static void mesh_calc_normals_poly_accum_cb(void *userdata, const int lidx, + const ParallelRangeTLS *UNUSED(tls)) { MeshCalcNormalsData *data = userdata; add_v3_v3(data->vnors[data->mloop[lidx].v], data->lnors_weighted[lidx]); } -static void mesh_calc_normals_poly_finalize_cb(void *userdata, const int vidx) +static void mesh_calc_normals_poly_finalize_cb(void *userdata, const int vidx, + const ParallelRangeTLS *UNUSED(tls)) { MeshCalcNormalsData *data = userdata; @@ -278,6 +282,10 @@ void BKE_mesh_calc_normals_poly( const bool do_threaded = (numPolys > BKE_MESH_OMP_LIMIT); float (*pnors)[3] = r_polynors; + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = do_threaded; + if (only_face_normals) { BLI_assert((pnors != NULL) || (numPolys == 0)); BLI_assert(r_vertnors == NULL); @@ -286,7 +294,7 @@ void BKE_mesh_calc_normals_poly( .mpolys = mpolys, .mloop = mloop, .mverts = mverts, .pnors = pnors, }; - BLI_task_parallel_range(0, numPolys, &data, mesh_calc_normals_poly_cb, do_threaded); + BLI_task_parallel_range(0, numPolys, &data, mesh_calc_normals_poly_cb, &settings); return; } @@ -309,13 +317,13 @@ void BKE_mesh_calc_normals_poly( }; /* Compute poly normals, and prepare weighted loop normals. */ - BLI_task_parallel_range(0, numPolys, &data, mesh_calc_normals_poly_prepare_cb, do_threaded); + BLI_task_parallel_range(0, numPolys, &data, mesh_calc_normals_poly_prepare_cb, &settings); /* Actually accumulate weighted loop normals into vertex ones. */ - BLI_task_parallel_range(0, numLoops, &data, mesh_calc_normals_poly_accum_cb, do_threaded); + BLI_task_parallel_range(0, numLoops, &data, mesh_calc_normals_poly_accum_cb, &settings); /* Normalize and validate computed vertex normals. */ - BLI_task_parallel_range(0, numVerts, &data, mesh_calc_normals_poly_finalize_cb, do_threaded); + BLI_task_parallel_range(0, numVerts, &data, mesh_calc_normals_poly_finalize_cb, &settings); if (free_vnors) { MEM_freeN(vnors); diff --git a/source/blender/blenkernel/intern/ocean.c b/source/blender/blenkernel/intern/ocean.c index 537c8926a5b..478b7ef21ef 100644 --- a/source/blender/blenkernel/intern/ocean.c +++ b/source/blender/blenkernel/intern/ocean.c @@ -502,7 +502,8 @@ typedef struct OceanSimulateData { float chop_amount; } OceanSimulateData; -static void ocean_compute_htilda(void *userdata, const int i) +static void ocean_compute_htilda(void *userdata, const int i, + const ParallelRangeTLS *UNUSED(tls)) { OceanSimulateData *osd = userdata; const Ocean *o = osd->o; @@ -748,7 +749,10 @@ void BKE_ocean_simulate(struct Ocean *o, float t, float scale, float chop_amount * This is not optimal in all cases, but remains reasonably simple and should be OK most of the time. */ /* compute a new htilda */ - BLI_task_parallel_range(0, o->_M, &osd, ocean_compute_htilda, o->_M > 16); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (o->_M > 16); + BLI_task_parallel_range(0, o->_M, &osd, ocean_compute_htilda, &settings); if (o->_do_disp_y) { BLI_task_pool_push(pool, ocean_compute_displacement_y, NULL, false, TASK_PRIORITY_HIGH); diff --git a/source/blender/blenkernel/intern/particle_system.c b/source/blender/blenkernel/intern/particle_system.c index da227514512..f5f175da828 100644 --- a/source/blender/blenkernel/intern/particle_system.c +++ b/source/blender/blenkernel/intern/particle_system.c @@ -3375,14 +3375,14 @@ typedef struct DynamicStepSolverTaskData { } DynamicStepSolverTaskData; static void dynamics_step_sph_ddr_task_cb_ex( - void *userdata, void *userdata_chunk, const int p, const int UNUSED(thread_id)) + void *userdata, const int p, const ParallelRangeTLS *tls) { DynamicStepSolverTaskData *data = userdata; ParticleSimulationData *sim = data->sim; ParticleSystem *psys = sim->psys; ParticleSettings *part = psys->part; - SPHData *sphdata = userdata_chunk; + SPHData *sphdata = tls->userdata_chunk; ParticleData *pa; @@ -3409,7 +3409,7 @@ static void dynamics_step_sph_ddr_task_cb_ex( } static void dynamics_step_sph_classical_basic_integrate_task_cb_ex( - void *userdata, void *UNUSED(userdata_chunk), const int p, const int UNUSED(thread_id)) + void *userdata, const int p, const ParallelRangeTLS *UNUSED(tls)) { DynamicStepSolverTaskData *data = userdata; ParticleSimulationData *sim = data->sim; @@ -3425,13 +3425,13 @@ static void dynamics_step_sph_classical_basic_integrate_task_cb_ex( } static void dynamics_step_sph_classical_calc_density_task_cb_ex( - void *userdata, void *userdata_chunk, const int p, const int UNUSED(thread_id)) + void *userdata, const int p, const ParallelRangeTLS *tls) { DynamicStepSolverTaskData *data = userdata; ParticleSimulationData *sim = data->sim; ParticleSystem *psys = sim->psys; - SPHData *sphdata = userdata_chunk; + SPHData *sphdata = tls->userdata_chunk; ParticleData *pa; @@ -3443,14 +3443,14 @@ static void dynamics_step_sph_classical_calc_density_task_cb_ex( } static void dynamics_step_sph_classical_integrate_task_cb_ex( - void *userdata, void *userdata_chunk, const int p, const int UNUSED(thread_id)) + void *userdata, const int p, const ParallelRangeTLS *tls) { DynamicStepSolverTaskData *data = userdata; ParticleSimulationData *sim = data->sim; ParticleSystem *psys = sim->psys; ParticleSettings *part = psys->part; - SPHData *sphdata = userdata_chunk; + SPHData *sphdata = tls->userdata_chunk; ParticleData *pa; @@ -3641,9 +3641,16 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra) /* Apply SPH forces using double-density relaxation algorithm * (Clavat et. al.) */ - BLI_task_parallel_range_ex( - 0, psys->totpart, &task_data, &sphdata, sizeof(sphdata), - dynamics_step_sph_ddr_task_cb_ex, psys->totpart > 100, true); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (psys->totpart > 100); + settings.userdata_chunk = &sphdata; + settings.userdata_chunk_size = sizeof(sphdata); + BLI_task_parallel_range( + 0, psys->totpart, + &task_data, + dynamics_step_sph_ddr_task_cb_ex, + &settings); sph_springs_modify(psys, timestep); } @@ -3653,21 +3660,46 @@ static void dynamics_step(ParticleSimulationData *sim, float cfra) * and Monaghan). Note that, unlike double-density relaxation, * this algorithm is separated into distinct loops. */ - BLI_task_parallel_range_ex( - 0, psys->totpart, &task_data, NULL, 0, - dynamics_step_sph_classical_basic_integrate_task_cb_ex, psys->totpart > 100, true); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (psys->totpart > 100); + BLI_task_parallel_range( + 0, psys->totpart, + &task_data, + dynamics_step_sph_classical_basic_integrate_task_cb_ex, + &settings); + } /* calculate summation density */ /* Note that we could avoid copying sphdata for each thread here (it's only read here), * but doubt this would gain us anything except confusion... */ - BLI_task_parallel_range_ex( - 0, psys->totpart, &task_data, &sphdata, sizeof(sphdata), - dynamics_step_sph_classical_calc_density_task_cb_ex, psys->totpart > 100, true); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (psys->totpart > 100); + settings.userdata_chunk = &sphdata; + settings.userdata_chunk_size = sizeof(sphdata); + BLI_task_parallel_range( + 0, psys->totpart, + &task_data, + dynamics_step_sph_classical_calc_density_task_cb_ex, + &settings); + } /* do global forces & effectors */ - BLI_task_parallel_range_ex( - 0, psys->totpart, &task_data, &sphdata, sizeof(sphdata), - dynamics_step_sph_classical_integrate_task_cb_ex, psys->totpart > 100, true); + { + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (psys->totpart > 100); + settings.userdata_chunk = &sphdata; + settings.userdata_chunk_size = sizeof(sphdata); + BLI_task_parallel_range( + 0, psys->totpart, + &task_data, + dynamics_step_sph_classical_integrate_task_cb_ex, + &settings); + } } BLI_spin_end(&task_data.spin); diff --git a/source/blender/blenkernel/intern/pbvh.c b/source/blender/blenkernel/intern/pbvh.c index 585a18cdad5..0395fc9c990 100644 --- a/source/blender/blenkernel/intern/pbvh.c +++ b/source/blender/blenkernel/intern/pbvh.c @@ -939,7 +939,8 @@ typedef struct PBVHUpdateData { int flag; } PBVHUpdateData; -static void pbvh_update_normals_accum_task_cb(void *userdata, const int n) +static void pbvh_update_normals_accum_task_cb(void *userdata, const int n, + const ParallelRangeTLS *UNUSED(tls)) { PBVHUpdateData *data = userdata; @@ -992,7 +993,8 @@ static void pbvh_update_normals_accum_task_cb(void *userdata, const int n) } } -static void pbvh_update_normals_store_task_cb(void *userdata, const int n) +static void pbvh_update_normals_store_task_cb(void *userdata, const int n, + const ParallelRangeTLS *UNUSED(tls)) { PBVHUpdateData *data = userdata; PBVH *bvh = data->bvh; @@ -1051,14 +1053,19 @@ static void pbvh_update_normals(PBVH *bvh, PBVHNode **nodes, .fnors = fnors, .vnors = vnors, }; - BLI_task_parallel_range(0, totnode, &data, pbvh_update_normals_accum_task_cb, totnode > PBVH_THREADED_LIMIT); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (totnode > PBVH_THREADED_LIMIT); - BLI_task_parallel_range(0, totnode, &data, pbvh_update_normals_store_task_cb, totnode > PBVH_THREADED_LIMIT); + BLI_task_parallel_range(0, totnode, &data, pbvh_update_normals_accum_task_cb, &settings); + + BLI_task_parallel_range(0, totnode, &data, pbvh_update_normals_store_task_cb, &settings); MEM_freeN(vnors); } -static void pbvh_update_BB_redraw_task_cb(void *userdata, const int n) +static void pbvh_update_BB_redraw_task_cb(void *userdata, const int n, + const ParallelRangeTLS *UNUSED(tls)) { PBVHUpdateData *data = userdata; PBVH *bvh = data->bvh; @@ -1085,7 +1092,10 @@ void pbvh_update_BB_redraw(PBVH *bvh, PBVHNode **nodes, int totnode, int flag) .flag = flag, }; - BLI_task_parallel_range(0, totnode, &data, pbvh_update_BB_redraw_task_cb, totnode > PBVH_THREADED_LIMIT); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (totnode > PBVH_THREADED_LIMIT); + BLI_task_parallel_range(0, totnode, &data, pbvh_update_BB_redraw_task_cb, &settings); } static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode) diff --git a/source/blender/blenkernel/intern/shrinkwrap.c b/source/blender/blenkernel/intern/shrinkwrap.c index f9d1793d7cb..0f12bb0a8da 100644 --- a/source/blender/blenkernel/intern/shrinkwrap.c +++ b/source/blender/blenkernel/intern/shrinkwrap.c @@ -88,13 +88,13 @@ typedef struct ShrinkwrapCalcCBData { * for each vertex performs a nearest vertex search on the tree */ static void shrinkwrap_calc_nearest_vertex_cb_ex( - void *userdata, void *userdata_chunk, const int i, const int UNUSED(threadid)) + void *userdata, const int i, const ParallelRangeTLS *tls) { ShrinkwrapCalcCBData *data = userdata; ShrinkwrapCalcData *calc = data->calc; BVHTreeFromMesh *treeData = data->treeData; - BVHTreeNearest *nearest = userdata_chunk; + BVHTreeNearest *nearest = tls->userdata_chunk; float *co = calc->vertexCos[i]; float tmp_co[3]; @@ -167,9 +167,14 @@ static void shrinkwrap_calc_nearest_vertex(ShrinkwrapCalcData *calc) nearest.dist_sq = FLT_MAX; ShrinkwrapCalcCBData data = {.calc = calc, .treeData = &treeData}; - BLI_task_parallel_range_ex( - 0, calc->numVerts, &data, &nearest, sizeof(nearest), shrinkwrap_calc_nearest_vertex_cb_ex, - calc->numVerts > BKE_MESH_OMP_LIMIT, false); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (calc->numVerts > BKE_MESH_OMP_LIMIT); + settings.userdata_chunk = &nearest; + settings.userdata_chunk_size = sizeof(nearest); + BLI_task_parallel_range(0, calc->numVerts, + &data,shrinkwrap_calc_nearest_vertex_cb_ex, + &settings); free_bvhtree_from_mesh(&treeData); } @@ -257,7 +262,7 @@ bool BKE_shrinkwrap_project_normal( } static void shrinkwrap_calc_normal_projection_cb_ex( - void *userdata, void *userdata_chunk, const int i, const int UNUSED(threadid)) + void *userdata, const int i, const ParallelRangeTLS *tls) { ShrinkwrapCalcCBData *data = userdata; @@ -272,7 +277,7 @@ static void shrinkwrap_calc_normal_projection_cb_ex( float *proj_axis = data->proj_axis; SpaceTransform *local2aux = data->local2aux; - BVHTreeRayHit *hit = userdata_chunk; + BVHTreeRayHit *hit = tls->userdata_chunk; const float proj_limit_squared = calc->smd->projLimit * calc->smd->projLimit; float *co = calc->vertexCos[i]; @@ -463,9 +468,15 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, bool for .auxData = auxData, .aux_tree = aux_tree, .aux_callback = aux_callback, .proj_axis = proj_axis, .local2aux = &local2aux, }; - BLI_task_parallel_range_ex( - 0, calc->numVerts, &data, &hit, sizeof(hit), shrinkwrap_calc_normal_projection_cb_ex, - calc->numVerts > BKE_MESH_OMP_LIMIT, false); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (calc->numVerts > BKE_MESH_OMP_LIMIT); + settings.userdata_chunk = &hit; + settings.userdata_chunk_size = sizeof(hit); + BLI_task_parallel_range(0, calc->numVerts, + &data, + shrinkwrap_calc_normal_projection_cb_ex, + &settings); } /* free data structures */ @@ -495,13 +506,13 @@ static void shrinkwrap_calc_normal_projection(ShrinkwrapCalcData *calc, bool for * NN matches for each vertex */ static void shrinkwrap_calc_nearest_surface_point_cb_ex( - void *userdata, void *userdata_chunk, const int i, const int UNUSED(threadid)) + void *userdata, const int i, const ParallelRangeTLS *tls) { ShrinkwrapCalcCBData *data = userdata; ShrinkwrapCalcData *calc = data->calc; BVHTreeFromMesh *treeData = data->treeData; - BVHTreeNearest *nearest = userdata_chunk; + BVHTreeNearest *nearest = tls->userdata_chunk; float *co = calc->vertexCos[i]; float tmp_co[3]; @@ -583,9 +594,15 @@ static void shrinkwrap_calc_nearest_surface_point(ShrinkwrapCalcData *calc) /* Find the nearest vertex */ ShrinkwrapCalcCBData data = {.calc = calc, .treeData = &treeData}; - BLI_task_parallel_range_ex( - 0, calc->numVerts, &data, &nearest, sizeof(nearest), shrinkwrap_calc_nearest_surface_point_cb_ex, - calc->numVerts > BKE_MESH_OMP_LIMIT, false); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (calc->numVerts > BKE_MESH_OMP_LIMIT); + settings.userdata_chunk = &nearest; + settings.userdata_chunk_size = sizeof(nearest); + BLI_task_parallel_range(0, calc->numVerts, + &data, + shrinkwrap_calc_nearest_surface_point_cb_ex, + &settings); free_bvhtree_from_mesh(&treeData); } diff --git a/source/blender/blenkernel/intern/smoke.c b/source/blender/blenkernel/intern/smoke.c index b5eed6c78de..2146b85572c 100644 --- a/source/blender/blenkernel/intern/smoke.c +++ b/source/blender/blenkernel/intern/smoke.c @@ -740,7 +740,7 @@ typedef struct ObstaclesFromDMData { int *num_obstacles; } ObstaclesFromDMData; -static void obstacles_from_derivedmesh_task_cb(void *userdata, const int z) +static void obstacles_from_derivedmesh_task_cb(void *userdata, const int z, const ParallelRangeTLS *UNUSED(tls)) { ObstaclesFromDMData *data = userdata; SmokeDomainSettings *sds = data->sds; @@ -870,8 +870,13 @@ static void obstacles_from_derivedmesh( .velocityX = velocityX, .velocityY = velocityY, .velocityZ = velocityZ, .num_obstacles = num_obstacles }; - BLI_task_parallel_range( - sds->res_min[2], sds->res_max[2], &data, obstacles_from_derivedmesh_task_cb, true); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.scheduling_mode = TASK_SCHEDULING_DYNAMIC; + BLI_task_parallel_range(sds->res_min[2], sds->res_max[2], + &data, + obstacles_from_derivedmesh_task_cb, + &settings); } /* free bvh tree */ free_bvhtree_from_mesh(&treeData); @@ -1186,7 +1191,7 @@ typedef struct EmitFromParticlesData { float hr_smooth; } EmitFromParticlesData; -static void emit_from_particles_task_cb(void *userdata, const int z) +static void emit_from_particles_task_cb(void *userdata, const int z, const ParallelRangeTLS *UNUSED(tls)) { EmitFromParticlesData *data = userdata; SmokeFlowSettings *sfs = data->sfs; @@ -1397,7 +1402,13 @@ static void emit_from_particles( .solid = solid, .smooth = smooth, .hr_smooth = hr_smooth, }; - BLI_task_parallel_range(min[2], max[2], &data, emit_from_particles_task_cb, true); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.scheduling_mode = TASK_SCHEDULING_DYNAMIC; + BLI_task_parallel_range(min[2], max[2], + &data, + emit_from_particles_task_cb, + &settings); } if (sfs->flags & MOD_SMOKE_FLOW_USE_PART_SIZE) { @@ -1569,7 +1580,7 @@ typedef struct EmitFromDMData { int *min, *max, *res; } EmitFromDMData; -static void emit_from_derivedmesh_task_cb(void *userdata, const int z) +static void emit_from_derivedmesh_task_cb(void *userdata, const int z, const ParallelRangeTLS *UNUSED(tls)) { EmitFromDMData *data = userdata; EmissionMap *em = data->em; @@ -1722,7 +1733,13 @@ static void emit_from_derivedmesh(Object *flow_ob, SmokeDomainSettings *sds, Smo .flow_center = flow_center, .min = min, .max = max, .res = res, }; - BLI_task_parallel_range(min[2], max[2], &data, emit_from_derivedmesh_task_cb, true); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.scheduling_mode = TASK_SCHEDULING_DYNAMIC; + BLI_task_parallel_range(min[2], max[2], + &data, + emit_from_derivedmesh_task_cb, + &settings); } /* free bvh tree */ free_bvhtree_from_mesh(&treeData); @@ -2438,7 +2455,7 @@ typedef struct UpdateEffectorsData { unsigned char *obstacle; } UpdateEffectorsData; -static void update_effectors_task_cb(void *userdata, const int x) +static void update_effectors_task_cb(void *userdata, const int x, const ParallelRangeTLS *UNUSED(tls)) { UpdateEffectorsData *data = userdata; SmokeDomainSettings *sds = data->sds; @@ -2512,7 +2529,13 @@ static void update_effectors(const struct EvaluationContext *eval_ctx, Scene *sc data.velocity_z = smoke_get_velocity_z(sds->fluid); data.obstacle = smoke_get_obstacle(sds->fluid); - BLI_task_parallel_range(0, sds->res[0], &data, update_effectors_task_cb, true); + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.scheduling_mode = TASK_SCHEDULING_DYNAMIC; + BLI_task_parallel_range(0, sds->res[0], + &data, + update_effectors_task_cb, + &settings); } pdEndEffectors(&effectors); diff --git a/source/blender/blenkernel/intern/tracking_auto.c b/source/blender/blenkernel/intern/tracking_auto.c index 40234bacdfe..0874d645a34 100644 --- a/source/blender/blenkernel/intern/tracking_auto.c +++ b/source/blender/blenkernel/intern/tracking_auto.c @@ -432,7 +432,9 @@ AutoTrackContext *BKE_autotrack_context_new(MovieClip *clip, return context; } -static void autotrack_context_step_cb(void *userdata, int track) +static void autotrack_context_step_cb(void *userdata, + int track, + const ParallelRangeTLS *UNUSED(tls)) { AutoTrackContext *context = userdata; const int frame_delta = context->backwards ? -1 : 1; @@ -510,10 +512,13 @@ bool BKE_autotrack_context_step(AutoTrackContext *context) const int frame_delta = context->backwards ? -1 : 1; context->step_ok = false; + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (context->num_tracks > 1); BLI_task_parallel_range(0, context->num_tracks, context, autotrack_context_step_cb, - context->num_tracks > 1); + &settings); /* Advance the frame. */ BLI_spin_lock(&context->spin_lock); diff --git a/source/blender/blenkernel/intern/tracking_stabilize.c b/source/blender/blenkernel/intern/tracking_stabilize.c index edddeb41cc8..fe850708547 100644 --- a/source/blender/blenkernel/intern/tracking_stabilize.c +++ b/source/blender/blenkernel/intern/tracking_stabilize.c @@ -1503,7 +1503,10 @@ typedef struct TrackingStabilizeFrameInterpolationData { interpolation_func interpolation; } TrackingStabilizeFrameInterpolationData; -static void tracking_stabilize_frame_interpolation_cb(void *userdata, int j) +static void tracking_stabilize_frame_interpolation_cb( + void *userdata, + int j, + const ParallelRangeTLS *UNUSED(tls)) { TrackingStabilizeFrameInterpolationData *data = userdata; ImBuf *ibuf = data->ibuf; @@ -1597,10 +1600,14 @@ ImBuf *BKE_tracking_stabilize_frame(MovieClip *clip, .ibuf = ibuf, .tmpibuf = tmpibuf, .mat = mat, .interpolation = interpolation }; + + ParallelRangeSettings settings; + BLI_parallel_range_settings_defaults(&settings); + settings.use_threading = (tmpibuf->y > 128); BLI_task_parallel_range(0, tmpibuf->y, &data, tracking_stabilize_frame_interpolation_cb, - tmpibuf->y > 128); + &settings); if (tmpibuf->rect_float) tmpibuf->userflags |= IB_RECT_INVALID; |