Blender  V2.93
Classes | Typedefs | Enumerations | Functions
BLI_task.h File Reference
#include <string.h>
#include "BLI_threads.h"
#include "BLI_utildefines.h"

Go to the source code of this file.

Classes

struct  TaskParallelTLS
 
struct  TaskParallelSettings
 
struct  TaskParallelIteratorStateShared
 

Typedefs

typedef enum TaskPriority TaskPriority
 
typedef struct TaskPool TaskPool
 
typedef void(* TaskRunFunction) (TaskPool *__restrict pool, void *taskdata)
 
typedef void(* TaskFreeFunction) (TaskPool *__restrict pool, void *taskdata)
 
typedef struct TaskParallelTLS TaskParallelTLS
 
typedef void(* TaskParallelRangeFunc) (void *__restrict userdata, const int iter, const TaskParallelTLS *__restrict tls)
 
typedef void(* TaskParallelReduceFunc) (const void *__restrict userdata, void *__restrict chunk_join, void *__restrict chunk)
 
typedef void(* TaskParallelFreeFunc) (const void *__restrict userdata, void *__restrict chunk)
 
typedef struct TaskParallelSettings TaskParallelSettings
 
typedef struct TaskParallelIteratorStateShared TaskParallelIteratorStateShared
 
typedef void(* TaskParallelIteratorIterFunc) (void *__restrict userdata, const TaskParallelTLS *__restrict tls, void **r_next_item, int *r_next_index, bool *r_do_abort)
 
typedef void(* TaskParallelIteratorFunc) (void *__restrict userdata, void *item, int index, const TaskParallelTLS *__restrict tls)
 
typedef struct MempoolIterData MempoolIterData
 
typedef void(* TaskParallelMempoolFunc) (void *userdata, MempoolIterData *iter)
 
typedef void(* TaskGraphNodeRunFunction) (void *__restrict task_data)
 
typedef void(* TaskGraphNodeFreeFunction) (void *task_data)
 

Enumerations

enum  TaskPriority { TASK_PRIORITY_LOW , TASK_PRIORITY_HIGH }
 

Functions

void BLI_task_scheduler_init (void)
 
void BLI_task_scheduler_exit (void)
 
int BLI_task_scheduler_num_threads (void)
 
TaskPoolBLI_task_pool_create (void *userdata, TaskPriority priority)
 
TaskPoolBLI_task_pool_create_background (void *userdata, TaskPriority priority)
 
TaskPoolBLI_task_pool_create_background_serial (void *userdata, TaskPriority priority)
 
TaskPoolBLI_task_pool_create_suspended (void *userdata, TaskPriority priority)
 
TaskPoolBLI_task_pool_create_no_threads (void *userdata)
 
void BLI_task_pool_free (TaskPool *pool)
 
void BLI_task_pool_push (TaskPool *pool, TaskRunFunction run, void *taskdata, bool free_taskdata, TaskFreeFunction freedata)
 
void BLI_task_pool_work_and_wait (TaskPool *pool)
 
void BLI_task_pool_cancel (TaskPool *pool)
 
bool BLI_task_pool_current_canceled (TaskPool *pool)
 
void * BLI_task_pool_user_data (TaskPool *pool)
 
ThreadMutexBLI_task_pool_user_mutex (TaskPool *pool)
 
BLI_INLINE void BLI_parallel_range_settings_defaults (TaskParallelSettings *settings)
 
void BLI_task_parallel_range (const int start, const int stop, void *userdata, TaskParallelRangeFunc func, const TaskParallelSettings *settings)
 
void BLI_task_parallel_iterator (void *userdata, TaskParallelIteratorIterFunc iter_func, void *init_item, const int init_index, const int tot_items, TaskParallelIteratorFunc func, const TaskParallelSettings *settings)
 
void BLI_task_parallel_listbase (struct ListBase *listbase, void *userdata, TaskParallelIteratorFunc func, const TaskParallelSettings *settings)
 
void BLI_task_parallel_mempool (struct BLI_mempool *mempool, void *userdata, TaskParallelMempoolFunc func, const bool use_threading)
 
int BLI_task_parallel_thread_id (const TaskParallelTLS *tls)
 
struct TaskGraphBLI_task_graph_create (void)
 
void BLI_task_graph_work_and_wait (struct TaskGraph *task_graph)
 
void BLI_task_graph_free (struct TaskGraph *task_graph)
 
struct TaskNodeBLI_task_graph_node_create (struct TaskGraph *task_graph, TaskGraphNodeRunFunction run, void *user_data, TaskGraphNodeFreeFunction free_func)
 
bool BLI_task_graph_node_push_work (struct TaskNode *task_node)
 
void BLI_task_graph_edge_create (struct TaskNode *from_node, struct TaskNode *to_node)
 

Typedef Documentation

◆ MempoolIterData

Definition at line 218 of file BLI_task.h.

◆ TaskFreeFunction

typedef void(* TaskFreeFunction) (TaskPool *__restrict pool, void *taskdata)

Definition at line 72 of file BLI_task.h.

◆ TaskGraphNodeFreeFunction

typedef void(* TaskGraphNodeFreeFunction) (void *task_data)

Definition at line 307 of file BLI_task.h.

◆ TaskGraphNodeRunFunction

typedef void(* TaskGraphNodeRunFunction) (void *__restrict task_data)

Definition at line 306 of file BLI_task.h.

◆ TaskParallelFreeFunc

typedef void(* TaskParallelFreeFunc) (const void *__restrict userdata, void *__restrict chunk)

Definition at line 136 of file BLI_task.h.

◆ TaskParallelIteratorFunc

typedef void(* TaskParallelIteratorFunc) (void *__restrict userdata, void *item, int index, const TaskParallelTLS *__restrict tls)

Definition at line 205 of file BLI_task.h.

◆ TaskParallelIteratorIterFunc

typedef void(* TaskParallelIteratorIterFunc) (void *__restrict userdata, const TaskParallelTLS *__restrict tls, void **r_next_item, int *r_next_index, bool *r_do_abort)

Definition at line 199 of file BLI_task.h.

◆ TaskParallelIteratorStateShared

◆ TaskParallelMempoolFunc

typedef void(* TaskParallelMempoolFunc) (void *userdata, MempoolIterData *iter)

Definition at line 224 of file BLI_task.h.

◆ TaskParallelRangeFunc

typedef void(* TaskParallelRangeFunc) (void *__restrict userdata, const int iter, const TaskParallelTLS *__restrict tls)

Definition at line 129 of file BLI_task.h.

◆ TaskParallelReduceFunc

typedef void(* TaskParallelReduceFunc) (const void *__restrict userdata, void *__restrict chunk_join, void *__restrict chunk)

Definition at line 132 of file BLI_task.h.

◆ TaskParallelSettings

◆ TaskParallelTLS

◆ TaskPool

typedef struct TaskPool TaskPool

Definition at line 49 of file BLI_task.h.

◆ TaskPriority

typedef enum TaskPriority TaskPriority

◆ TaskRunFunction

typedef void(* TaskRunFunction) (TaskPool *__restrict pool, void *taskdata)

Definition at line 71 of file BLI_task.h.

Enumeration Type Documentation

◆ TaskPriority

Enumerator
TASK_PRIORITY_LOW 
TASK_PRIORITY_HIGH 

Definition at line 65 of file BLI_task.h.

Function Documentation

◆ BLI_parallel_range_settings_defaults()

BLI_INLINE void BLI_parallel_range_settings_defaults ( TaskParallelSettings settings)

Definition at line 231 of file BLI_task.h.

References TaskParallelSettings::min_iter_per_thread, and TaskParallelSettings::use_threading.

Referenced by armature_deform_coords_impl(), BKE_autotrack_context_step(), BKE_maskrasterize_buffer(), BKE_mesh_calc_normals_poly(), BKE_scopes_update(), BKE_subdiv_ccg_average_grids(), BKE_subdiv_ccg_average_stitch_faces(), BKE_subdiv_foreach_subdiv_geometry(), BKE_tracking_stabilize_frame(), BLI_bvhtree_overlap_ex(), BLI_covariance_m_vn_ex(), BM_loop_interp_multires_ex(), brush_add(), ccgDM_copyFinalLoopArray(), ccgSubSurf__calcSubdivLevel(), ccgSubSurf__calcVertNormals(), cloth_bvh_objcollisions_nearcheck(), cloth_bvh_selfcollisions_nearcheck(), displaceModifier_do(), dynamicPaint_applySurfaceDisplace(), dynamicPaint_brushMeshCalculateVelocity(), dynamicPaint_createUVSurface(), dynamicPaint_doBorderStep(), dynamicPaint_doEffectStep(), dynamicPaint_doStep(), dynamicPaint_doWaveStep(), dynamicPaint_generateBakeData(), dynamicPaint_Modifier_apply(), dynamicPaint_outputSurfaceImage(), dynamicPaint_paintMesh(), dynamicPaint_paintParticles(), dynamicPaint_paintSinglePoint(), dynamicPaint_prepareAdjacencyData(), dynamicPaint_prepareEffectStep(), dynamicPaint_setInitialColor(), dynamics_step(), foreach_grid_coordinate(), foreach_mouse_hit_key(), foreach_toplevel_grid_coord(), get_vert2geom_distance(), lattice_deform_coords_impl(), load_tex(), load_tex_cursor(), make_histogram_view_from_ibuf_byte(), make_histogram_view_from_ibuf_float(), meshdeformModifier_do(), modifyMesh(), multiresModifier_disp_run(), non_recursive_bvh_div_nodes(), paint_2d_op(), PE_apply_lengths(), pe_deflect_emitter(), pe_iterate_lengths(), precompute_weight_values(), psys_cache_edit_paths(), RE_point_density_sample(), sculpt_color_filter_modal(), shrinkwrap_calc_nearest_surface_point(), shrinkwrap_calc_nearest_vertex(), shrinkwrap_calc_normal_projection(), subdiv_ccg_average_all_boundaries(), subdiv_ccg_average_all_corners(), subdiv_ccg_evaluate_grids(), subdiv_ccg_recalc_inner_grid_normals(), subdiv_ccg_recalc_modified_inner_grid_normals(), surfacedeformBind(), surfacedeformModifier_do(), surfaceGenerateGrid(), task_listbase_test_do(), and TEST().

◆ BLI_task_graph_create()

struct TaskGraph* BLI_task_graph_create ( void  )

Definition at line 112 of file task_graph.cc.

Referenced by DRW_draw_depth_object(), drw_task_graph_init(), and TEST().

◆ BLI_task_graph_edge_create()

void BLI_task_graph_edge_create ( struct TaskNode from_node,
struct TaskNode to_node 
)

◆ BLI_task_graph_free()

void BLI_task_graph_free ( struct TaskGraph task_graph)

Definition at line 117 of file task_graph.cc.

Referenced by DRW_draw_depth_object(), drw_task_graph_deinit(), and TEST().

◆ BLI_task_graph_node_create()

struct TaskNode* BLI_task_graph_node_create ( struct TaskGraph task_graph,
TaskGraphNodeRunFunction  run,
void *  user_data,
TaskGraphNodeFreeFunction  free_func 
)

◆ BLI_task_graph_node_push_work()

bool BLI_task_graph_node_push_work ( struct TaskNode task_node)

◆ BLI_task_graph_work_and_wait()

void BLI_task_graph_work_and_wait ( struct TaskGraph task_graph)

◆ BLI_task_parallel_iterator()

void BLI_task_parallel_iterator ( void *  userdata,
TaskParallelIteratorIterFunc  iter_func,
void *  init_item,
const int  init_index,
const int  tot_items,
TaskParallelIteratorFunc  func,
const TaskParallelSettings settings 
)

This function allows to parallelize for loops using a generic iterator.

Parameters
userdataCommon userdata passed to all instances of func.
iter_funcCallback function used to generate chunks of items.
init_itemThe initial item, if necessary (may be NULL if unused).
init_indexThe initial index.
tot_itemsThe total amount of items to iterate over (if unknown, set it to a negative number).
funcCallback function.
settingsSee public API doc of TaskParallelSettings for description of all settings.
Note
Static scheduling is only available when tot_items is >= 0.

Definition at line 276 of file task_iterator.c.

References state, and task_parallel_iterator_do().

◆ BLI_task_parallel_listbase()

void BLI_task_parallel_listbase ( ListBase listbase,
void *  userdata,
TaskParallelIteratorFunc  func,
const TaskParallelSettings settings 
)

This function allows to parallelize for loops over ListBase items.

Parameters
listbaseThe double linked list to loop over.
userdataCommon userdata passed to all instances of func.
funcCallback function.
settingsSee public API doc of ParallelRangeSettings for description of all settings.
Note
There is no static scheduling here, since it would need another full loop over items to count them.

Definition at line 324 of file task_iterator.c.

References BLI_listbase_count(), BLI_listbase_is_empty(), ListBase::first, state, task_parallel_iterator_do(), and task_parallel_listbase_get().

Referenced by task_listbase_test_do(), and TEST().

◆ BLI_task_parallel_mempool()

void BLI_task_parallel_mempool ( BLI_mempool mempool,
void *  userdata,
TaskParallelMempoolFunc  func,
const bool  use_threading 
)

This function allows to parallelize for loops over Mempool items.

Parameters
mempoolThe iterable BLI_mempool to loop over.
userdataCommon userdata passed to all instances of func.
funcCallback function.
use_threadingIf true, actually split-execute loop in threads, else just do a sequential for loop (allows caller to use any kind of test to switch on parallelization or not).
Note
There is no static scheduling here.

Definition at line 377 of file task_iterator.c.

References BLI_mempool_iter_threadsafe_create(), BLI_mempool_iter_threadsafe_free(), BLI_mempool_iternew(), BLI_mempool_iterstep(), BLI_mempool_len(), BLI_task_pool_create(), BLI_task_pool_free(), BLI_task_pool_push(), BLI_task_pool_work_and_wait(), BLI_task_scheduler_num_threads(), NULL, parallel_mempool_func(), state, task_pool, and TASK_PRIORITY_HIGH.

Referenced by armature_deform_coords_impl(), lattice_deform_coords_impl(), and TEST().

◆ BLI_task_parallel_range()

void BLI_task_parallel_range ( const int  start,
const int  stop,
void *  userdata,
TaskParallelRangeFunc  func,
const TaskParallelSettings settings 
)

Definition at line 110 of file task_range.cc.

References BLI_task_scheduler_num_threads(), TaskParallelSettings::func_free, TaskParallelSettings::func_reduce, MAX2, TaskParallelSettings::min_iter_per_thread, blender::parallel_for(), blender::compositor::task, TaskParallelSettings::use_threading, TaskParallelTLS::userdata_chunk, TaskParallelSettings::userdata_chunk, and TaskParallelSettings::userdata_chunk_size.

Referenced by armature_deform_coords_impl(), BKE_autotrack_context_step(), BKE_maskrasterize_buffer(), BKE_mesh_calc_normals_poly(), BKE_scopes_update(), BKE_subdiv_ccg_average_grids(), BKE_subdiv_ccg_average_stitch_faces(), BKE_subdiv_foreach_subdiv_geometry(), BKE_tracking_stabilize_frame(), BLI_bvhtree_overlap_ex(), BLI_covariance_m_vn_ex(), BM_loop_interp_multires_ex(), bmesh_topology_rake(), brush_add(), calc_area_center(), calc_area_normal_and_center(), calculate_average_color(), calculate_average_weight(), ccgDM_copyFinalLoopArray(), ccgSubSurf__calcSubdivLevel(), ccgSubSurf__calcVertNormals(), cloth_brush_apply_brush_foces(), cloth_bvh_objcollisions_nearcheck(), cloth_bvh_selfcollisions_nearcheck(), displaceModifier_do(), do_brush_action(), do_clay_brush(), do_clay_strips_brush(), do_clay_thumb_brush(), do_crease_brush(), do_displacement_eraser_brush(), do_displacement_smear_brush(), do_draw_brush(), do_draw_sharp_brush(), do_elastic_deform_brush(), do_fill_brush(), do_flatten_brush(), do_grab_brush(), do_gravity(), do_inflate_brush(), do_layer_brush(), do_mask_brush_draw(), do_nudge_brush(), do_pinch_brush(), do_rotate_brush(), do_scrape_brush(), do_slide_relax_brush(), do_snake_hook_brush(), do_thumb_brush(), dynamicPaint_applySurfaceDisplace(), dynamicPaint_brushMeshCalculateVelocity(), dynamicPaint_createUVSurface(), dynamicPaint_doBorderStep(), dynamicPaint_doEffectStep(), dynamicPaint_doStep(), dynamicPaint_doWaveStep(), dynamicPaint_generateBakeData(), dynamicPaint_Modifier_apply(), dynamicPaint_outputSurfaceImage(), dynamicPaint_paintMesh(), dynamicPaint_paintParticles(), dynamicPaint_paintSinglePoint(), dynamicPaint_prepareAdjacencyData(), dynamicPaint_prepareEffectStep(), dynamicPaint_setInitialColor(), dynamics_step(), foreach_grid_coordinate(), foreach_mouse_hit_key(), foreach_toplevel_grid_coord(), get_vert2geom_distance(), lattice_deform_coords_impl(), load_tex(), load_tex_cursor(), make_histogram_view_from_ibuf_byte(), make_histogram_view_from_ibuf_float(), mask_flood_fill_exec(), meshdeformModifier_do(), modifyMesh(), multiresModifier_disp_run(), non_recursive_bvh_div_nodes(), paint_2d_op(), paint_mesh_restore_co(), pbvh_faces_update_normals(), pbvh_update_BB_redraw(), pbvh_update_draw_buffers(), pbvh_update_mask_redraw(), pbvh_update_visibility(), pbvh_update_visibility_redraw(), PE_apply_lengths(), pe_deflect_emitter(), pe_iterate_lengths(), precompute_weight_values(), psys_cache_edit_paths(), RE_point_density_sample(), SCULPT_cloth_brush_do_simulation_step(), SCULPT_cloth_brush_ensure_nodes_constraints(), sculpt_cloth_filter_modal(), sculpt_color_filter_modal(), sculpt_combine_proxies(), sculpt_dirty_mask_exec(), SCULPT_do_boundary_brush(), SCULPT_do_draw_face_sets_brush(), SCULPT_do_multiplane_scrape_brush(), SCULPT_do_paint_brush(), SCULPT_do_pose_brush(), SCULPT_do_smear_brush(), SCULPT_do_surface_smooth_brush(), SCULPT_enhance_details_brush(), sculpt_expand_update_for_vertex(), SCULPT_fake_neighbor_search(), SCULPT_filter_cache_init(), SCULPT_flush_stroke_deform(), sculpt_gesture_face_set_apply_for_symmetry_pass(), sculpt_gesture_mask_apply_for_symmetry_pass(), sculpt_gesture_project_apply_for_symmetry_pass(), sculpt_mask_by_color_contiguous(), sculpt_mask_by_color_full_mesh(), sculpt_mask_expand_invoke(), sculpt_mask_expand_modal(), sculpt_mask_filter_exec(), SCULPT_mask_filter_smooth_apply(), sculpt_mask_init_exec(), sculpt_mesh_filter_modal(), SCULPT_nearest_vertex_get(), SCULPT_pbvh_calc_area_normal(), SCULPT_pose_brush_init(), sculpt_pose_grow_pose_factor(), SCULPT_smooth(), sculpt_transform_all_vertices(), sculpt_undo_bmesh_restore_generic(), shrinkwrap_calc_nearest_surface_point(), shrinkwrap_calc_nearest_vertex(), shrinkwrap_calc_normal_projection(), subdiv_ccg_average_all_boundaries(), subdiv_ccg_average_all_corners(), subdiv_ccg_evaluate_grids(), subdiv_ccg_recalc_inner_grid_normals(), subdiv_ccg_recalc_modified_inner_grid_normals(), surfacedeformBind(), surfacedeformModifier_do(), surfaceGenerateGrid(), TEST(), vpaint_paint_leaves(), and wpaint_paint_leaves().

◆ BLI_task_parallel_thread_id()

int BLI_task_parallel_thread_id ( const TaskParallelTLS tls)

◆ BLI_task_pool_cancel()

void BLI_task_pool_cancel ( TaskPool pool)

◆ BLI_task_pool_create()

TaskPool* BLI_task_pool_create ( void *  userdata,
TaskPriority  priority 
)

◆ BLI_task_pool_create_background()

TaskPool* BLI_task_pool_create_background ( void *  userdata,
TaskPriority  priority 
)

Create a background task pool. In multi-threaded context, there is no differences with BLI_task_pool_create(), but in single-threaded case it is ensured to have at least one worker thread to run on (i.e. you don't have to call BLI_task_pool_work_and_wait on it to be sure it will be processed).

Note
Background pools are non-recursive (that is, you should not create other background pools in tasks assigned to a background pool, they could end never being executed, since the 'fallback' background thread is already busy with parent task in single-threaded context).

Definition at line 423 of file task_pool.cc.

References TASK_POOL_BACKGROUND, and task_pool_create_ex().

Referenced by filelist_cache_preview_ensure_running().

◆ BLI_task_pool_create_background_serial()

TaskPool* BLI_task_pool_create_background_serial ( void *  userdata,
TaskPriority  priority 
)

Task pool that executes one task after the other, possibly on different threads but never in parallel.

Definition at line 451 of file task_pool.cc.

References TASK_POOL_BACKGROUND_SERIAL, and task_pool_create_ex().

Referenced by screen_opengl_render_init().

◆ BLI_task_pool_create_no_threads()

TaskPool* BLI_task_pool_create_no_threads ( void *  userdata)

Single threaded task pool that executes pushed task immediately, for debugging purposes.

Definition at line 442 of file task_pool.cc.

References task_pool_create_ex(), TASK_POOL_NO_THREADS, and TASK_PRIORITY_HIGH.

Referenced by blender::deg::deg_evaluate_task_pool_create().

◆ BLI_task_pool_create_suspended()

TaskPool* BLI_task_pool_create_suspended ( void *  userdata,
TaskPriority  priority 
)

Similar to BLI_task_pool_create() but does not schedule any tasks for execution for until BLI_task_pool_work_and_wait() is called. This helps reducing threading overhead when pushing huge amount of small initial tasks from the main thread.

Definition at line 433 of file task_pool.cc.

References task_pool_create_ex(), and TASK_POOL_TBB_SUSPENDED.

Referenced by blender::deg::deg_evaluate_task_pool_create(), project_paint_op(), and TEST().

◆ BLI_task_pool_current_canceled()

bool BLI_task_pool_current_canceled ( TaskPool pool)

◆ BLI_task_pool_free()

void BLI_task_pool_free ( TaskPool pool)

◆ BLI_task_pool_push()

void BLI_task_pool_push ( TaskPool pool,
TaskRunFunction  run,
void *  taskdata,
bool  free_taskdata,
TaskFreeFunction  freedata 
)

◆ BLI_task_pool_user_data()

void* BLI_task_pool_user_data ( TaskPool pool)

◆ BLI_task_pool_user_mutex()

ThreadMutex* BLI_task_pool_user_mutex ( TaskPool pool)

Definition at line 546 of file task_pool.cc.

References blender::compositor::pool, and TaskPool::user_mutex.

◆ BLI_task_pool_work_and_wait()

void BLI_task_pool_work_and_wait ( TaskPool pool)

◆ BLI_task_scheduler_exit()

void BLI_task_scheduler_exit ( void  )

Definition at line 68 of file task_scheduler.cc.

Referenced by WM_exit_ex().

◆ BLI_task_scheduler_init()

void BLI_task_scheduler_init ( void  )

◆ BLI_task_scheduler_num_threads()

int BLI_task_scheduler_num_threads ( void  )