From 3ff85dbb7b63071997d365799ab6eb01404f5e0a Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 6 Oct 2023 13:06:02 +0200 Subject: [PATCH] WM Jobs: Refactor all worker status variables into a single shared struct. Move the three current 'status variables' (stop, update and progress) into a single 'WorkerStatus' struct. This is cleaner and will allow for future workin this area without having to edit tens of 'startjob' callbacks signatures all the time. No functional change expected here. Note: jobs' specific internal code has been modified as little as possible, in many cases the job's own data still just store pointers to these three values. Ideally in the future more refactor will be using a single pointer to the shared `wmJobWorkerStatus` data instead. --- .../draw/engines/eevee/eevee_lightcache.cc | 11 +++-- .../draw/engines/eevee/eevee_lightcache.h | 3 +- .../engines/eevee_next/eevee_lightcache.cc | 5 +- .../engines/eevee_next/eevee_lightcache.hh | 5 +- .../draw/intern/draw_manager_shader.cc | 11 ++--- .../gpencil_legacy/gpencil_trace_ops.cc | 19 ++++---- .../editors/interface/interface_icons.cc | 8 ++-- source/blender/editors/object/object_bake.cc | 8 ++-- .../blender/editors/object/object_bake_api.cc | 12 +++-- .../editors/object/object_bake_simulation.cc | 38 +++++++-------- .../blender/editors/object/object_modifier.cc | 18 +++---- .../blender/editors/object/object_remesh.cc | 21 ++++---- .../editors/physics/dynamicpaint_ops.cc | 12 ++--- .../blender/editors/physics/physics_fluid.cc | 31 ++++++------ .../editors/physics/physics_pointcache.cc | 12 ++--- .../blender/editors/render/render_internal.cc | 8 ++-- .../blender/editors/render/render_preview.cc | 48 ++++++++----------- .../blender/editors/render/render_shading.cc | 9 ++-- .../blender/editors/space_clip/clip_editor.cc | 14 +++--- source/blender/editors/space_clip/clip_ops.cc | 14 +++--- .../editors/space_clip/tracking_ops_solve.cc | 13 +++-- .../editors/space_clip/tracking_ops_track.cc | 19 +++----- source/blender/editors/space_file/filelist.cc | 18 +++---- source/blender/editors/space_file/fsmenu.cc | 12 ++--- .../blender/editors/space_node/node_edit.cc | 13 ++--- .../editors/space_node/node_shader_preview.cc | 11 ++--- .../space_sequencer/sequencer_drag_drop.cc | 5 +- .../space_sequencer/sequencer_preview.cc | 12 ++--- .../space_sequencer/sequencer_proxy.cc | 5 +- .../space_sequencer/sequencer_thumbnails.cc | 11 +++-- .../editors/uvedit/uvedit_unwrap_ops.cc | 26 +++++----- .../intern/lineart/lineart_ops.cc | 16 +++---- .../io/alembic/exporter/abc_export_capi.cc | 28 ++++------- .../blender/io/alembic/intern/alembic_capi.cc | 17 +++---- .../blender/io/usd/intern/usd_capi_export.cc | 45 +++++++---------- .../blender/io/usd/intern/usd_capi_import.cc | 19 ++++---- source/blender/sequencer/SEQ_proxy.h | 6 +-- source/blender/sequencer/intern/proxy.cc | 19 +++++--- source/blender/sequencer/intern/proxy_job.cc | 6 +-- source/blender/windowmanager/WM_api.hh | 6 +-- source/blender/windowmanager/WM_types.hh | 28 +++++++++++ .../blender/windowmanager/intern/wm_jobs.cc | 33 ++++++------- 42 files changed, 316 insertions(+), 359 deletions(-) diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.cc b/source/blender/draw/engines/eevee/eevee_lightcache.cc index 73cef28bb7f..6da97bde02c 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.cc +++ b/source/blender/draw/engines/eevee/eevee_lightcache.cc @@ -1402,7 +1402,7 @@ static bool lightbake_do_sample(EEVEE_LightBake *lbake, return true; } -void EEVEE_lightbake_job(void *custom_data, bool *stop, bool *do_update, float *progress) +void EEVEE_lightbake_job(void *custom_data, wmJobWorkerStatus *worker_status) { EEVEE_LightBake *lbake = (EEVEE_LightBake *)custom_data; Depsgraph *depsgraph = lbake->depsgraph; @@ -1411,9 +1411,9 @@ void EEVEE_lightbake_job(void *custom_data, bool *stop, bool *do_update, float * DEG_evaluate_on_framechange(depsgraph, lbake->frame); lbake->view_layer = DEG_get_evaluated_view_layer(depsgraph); - lbake->stop = stop; - lbake->do_update = do_update; - lbake->progress = progress; + lbake->stop = &worker_status->stop; + lbake->do_update = &worker_status->do_update; + lbake->progress = &worker_status->progress; if (G.background) { /* Make sure to init GL capabilities before counting probes. */ @@ -1474,7 +1474,8 @@ void EEVEE_lightbake_job(void *custom_data, bool *stop, bool *do_update, float * lbake->grid_sample_len = prb->grid_resolution_x * prb->grid_resolution_y * prb->grid_resolution_z; for (lbake->grid_sample = 0; lbake->grid_sample < lbake->grid_sample_len; - ++lbake->grid_sample) { + ++lbake->grid_sample) + { lightbake_do_sample(lbake, eevee_lightbake_render_grid_sample); } } diff --git a/source/blender/draw/engines/eevee/eevee_lightcache.h b/source/blender/draw/engines/eevee/eevee_lightcache.h index de9110a3019..b6487c9aafc 100644 --- a/source/blender/draw/engines/eevee/eevee_lightcache.h +++ b/source/blender/draw/engines/eevee/eevee_lightcache.h @@ -18,6 +18,7 @@ struct LightCache; struct Scene; struct SceneEEVEE; struct ViewLayer; +struct wmJobWorkerStatus; #ifdef __cplusplus extern "C" { @@ -43,7 +44,7 @@ void *EEVEE_lightbake_job_data_alloc(struct Main *bmain, int frame); void EEVEE_lightbake_job_data_free(void *custom_data); void EEVEE_lightbake_update(void *custom_data); -void EEVEE_lightbake_job(void *custom_data, bool *stop, bool *do_update, float *progress); +void EEVEE_lightbake_job(void *custom_data, wmJobWorkerStatus *worker_status); /** * This is to update the world irradiance and reflection contribution from diff --git a/source/blender/draw/engines/eevee_next/eevee_lightcache.cc b/source/blender/draw/engines/eevee_next/eevee_lightcache.cc index afc2f42f86a..ef127694ad7 100644 --- a/source/blender/draw/engines/eevee_next/eevee_lightcache.cc +++ b/source/blender/draw/engines/eevee_next/eevee_lightcache.cc @@ -344,9 +344,10 @@ void EEVEE_NEXT_lightbake_update(void *job_data) static_cast(job_data)->update(); } -void EEVEE_NEXT_lightbake_job(void *job_data, bool *stop, bool *do_update, float *progress) +void EEVEE_NEXT_lightbake_job(void *job_data, wmJobWorkerStatus *worker_status) { - static_cast(job_data)->run(stop, do_update, progress); + static_cast(job_data)->run( + &worker_status->stop, &worker_status->do_update, &worker_status->progress); } /** \} */ diff --git a/source/blender/draw/engines/eevee_next/eevee_lightcache.hh b/source/blender/draw/engines/eevee_next/eevee_lightcache.hh index 6eba53bda26..d470fcff245 100644 --- a/source/blender/draw/engines/eevee_next/eevee_lightcache.hh +++ b/source/blender/draw/engines/eevee_next/eevee_lightcache.hh @@ -17,6 +17,7 @@ struct ViewLayer; struct Scene; struct Object; struct wmJob; +struct wmJobWorkerStatus; /** Opaque type hiding eevee::LightBake. */ struct EEVEE_NEXT_LightBake; @@ -72,8 +73,6 @@ void EEVEE_NEXT_lightbake_update(/*EEVEE_NEXT_LightBake*/ void *job_data); * Will call `EEVEE_NEXT_lightbake_update()` on finish. */ void EEVEE_NEXT_lightbake_job(/*EEVEE_NEXT_LightBake*/ void *job_data, - bool *stop, - bool *do_update, - float *progress); + wmJobWorkerStatus *worker_status); /** \} */ diff --git a/source/blender/draw/intern/draw_manager_shader.cc b/source/blender/draw/intern/draw_manager_shader.cc index 10033e1ac83..477b3181ee0 100644 --- a/source/blender/draw/intern/draw_manager_shader.cc +++ b/source/blender/draw/intern/draw_manager_shader.cc @@ -64,13 +64,8 @@ struct DRWShaderCompiler { bool own_context; }; -static void drw_deferred_shader_compilation_exec( - void *custom_data, - /* Cannot be const, this function implements wm_jobs_start_callback. - * NOLINTNEXTLINE: readability-non-const-parameter. */ - bool *stop, - bool * /*do_update*/, - float * /*progress*/) +static void drw_deferred_shader_compilation_exec(void *custom_data, + wmJobWorkerStatus *worker_status) { GPU_render_begin(); DRWShaderCompiler *comp = (DRWShaderCompiler *)custom_data; @@ -90,7 +85,7 @@ static void drw_deferred_shader_compilation_exec( GPU_context_active_set(blender_gpu_context); while (true) { - if (*stop != 0) { + if (worker_status->stop != 0) { /* We don't want user to be able to cancel the compilation * but wm can kill the task if we are closing blender. */ break; diff --git a/source/blender/editors/gpencil_legacy/gpencil_trace_ops.cc b/source/blender/editors/gpencil_legacy/gpencil_trace_ops.cc index 21846b698e5..385ce1157aa 100644 --- a/source/blender/editors/gpencil_legacy/gpencil_trace_ops.cc +++ b/source/blender/editors/gpencil_legacy/gpencil_trace_ops.cc @@ -200,13 +200,13 @@ static void trace_initialize_job_data(TraceJob *trace_job) } } -static void trace_start_job(void *customdata, bool *stop, bool *do_update, float *progress) +static void trace_start_job(void *customdata, wmJobWorkerStatus *worker_status) { TraceJob *trace_job = static_cast(customdata); - trace_job->stop = stop; - trace_job->do_update = do_update; - trace_job->progress = progress; + trace_job->stop = &worker_status->stop; + trace_job->do_update = &worker_status->do_update; + trace_job->progress = &worker_status->progress; trace_job->was_canceled = false; const int init_frame = max_ii((trace_job->use_current_frame) ? trace_job->frame_target : 0, 0); @@ -241,7 +241,7 @@ static void trace_start_job(void *customdata, bool *stop, bool *do_update, float } *(trace_job->progress) = float(i) / float(iuser->frames); - *do_update = true; + worker_status->do_update = true; iuser->framenr = i + 1; @@ -258,8 +258,8 @@ static void trace_start_job(void *customdata, bool *stop, bool *do_update, float } trace_job->success = !trace_job->was_canceled; - *do_update = true; - *stop = false; + worker_status->do_update = true; + worker_status->stop = false; } static void trace_end_job(void *customdata) @@ -341,9 +341,8 @@ static int gpencil_trace_image_exec(bContext *C, wmOperator *op) ED_object_base_activate(job->C, job->base_active); if ((job->image->source == IMA_SRC_FILE) || (job->frame_num > 0)) { - bool stop = false, do_update = true; - float progress; - trace_start_job(job, &stop, &do_update, &progress); + wmJobWorkerStatus worker_status = {}; + trace_start_job(job, &worker_status); trace_end_job(job); trace_free_job(job); } diff --git a/source/blender/editors/interface/interface_icons.cc b/source/blender/editors/interface/interface_icons.cc index ab9a74122b4..b754648cfac 100644 --- a/source/blender/editors/interface/interface_icons.cc +++ b/source/blender/editors/interface/interface_icons.cc @@ -1316,10 +1316,7 @@ static void icon_create_rect(PreviewImage *prv_img, enum eIconSizes size) static void ui_id_preview_image_render_size( const bContext *C, Scene *scene, ID *id, PreviewImage *pi, int size, const bool use_job); -static void ui_studiolight_icon_job_exec(void *customdata, - bool * /*stop*/, - bool * /*do_update*/, - float * /*progress*/) +static void ui_studiolight_icon_job_exec(void *customdata, wmJobWorkerStatus * /*worker_status*/) { Icon **tmp = (Icon **)customdata; Icon *icon = *tmp; @@ -2147,7 +2144,8 @@ static int ui_id_brush_get_icon(const bContext *C, ID *id) /* reset the icon */ if ((ob != nullptr) && (ob->mode & OB_MODE_ALL_PAINT_GPENCIL) && - (br->gpencil_settings != nullptr)) { + (br->gpencil_settings != nullptr)) + { switch (br->gpencil_settings->icon_id) { case GP_BRUSH_ICON_PENCIL: br->id.icon_id = ICON_GPBRUSH_PENCIL; diff --git a/source/blender/editors/object/object_bake.cc b/source/blender/editors/object/object_bake.cc index 6fab3adb930..3554c971aa1 100644 --- a/source/blender/editors/object/object_bake.cc +++ b/source/blender/editors/object/object_bake.cc @@ -464,7 +464,7 @@ static void init_multiresbake_job(bContext *C, MultiresBakeJob *bkj) CTX_DATA_END; } -static void multiresbake_startjob(void *bkv, bool *stop, bool *do_update, float *progress) +static void multiresbake_startjob(void *bkv, wmJobWorkerStatus *worker_status) { MultiresBakeJob *bkj = static_cast(bkv); int baked_objects = 0, tot_obj; @@ -510,9 +510,9 @@ static void multiresbake_startjob(void *bkv, bool *stop, bool *do_update, float bkr.tot_obj = tot_obj; bkr.baked_objects = baked_objects; - bkr.stop = stop; - bkr.do_update = do_update; - bkr.progress = progress; + bkr.stop = &worker_status->stop; + bkr.do_update = &worker_status->do_update; + bkr.progress = &worker_status->progress; bkr.bias = bkj->bias; bkr.number_of_rays = bkj->number_of_rays; diff --git a/source/blender/editors/object/object_bake_api.cc b/source/blender/editors/object/object_bake_api.cc index 18268041a86..a9cd8962e5b 100644 --- a/source/blender/editors/object/object_bake_api.cc +++ b/source/blender/editors/object/object_bake_api.cc @@ -687,7 +687,8 @@ static bool bake_objects_check(Main *bmain, LISTBASE_FOREACH (CollectionPointerLink *, link, selected_objects) { if (!bake_object_check( - scene, view_layer, static_cast(link->ptr.data), target, reports)) { + scene, view_layer, static_cast(link->ptr.data), target, reports)) + { return false; } } @@ -1738,7 +1739,8 @@ static int bake(const BakeAPIRender *bkr, else { /* save the results */ if (bake_targets_output( - bkr, &targets, ob_low, ob_low_eval, me_low_eval, pixel_array_low, reports)) { + bkr, &targets, ob_low, ob_low_eval, me_low_eval, pixel_array_low, reports)) + { op_result = OPERATOR_FINISHED; } else { @@ -1916,13 +1918,13 @@ finally: return result; } -static void bake_startjob(void *bkv, bool * /*stop*/, bool *do_update, float *progress) +static void bake_startjob(void *bkv, wmJobWorkerStatus *worker_status) { BakeAPIRender *bkr = (BakeAPIRender *)bkv; /* setup new render */ - bkr->do_update = do_update; - bkr->progress = progress; + bkr->do_update = &worker_status->do_update; + bkr->progress = &worker_status->progress; RE_SetReports(bkr->render, bkr->reports); diff --git a/source/blender/editors/object/object_bake_simulation.cc b/source/blender/editors/object/object_bake_simulation.cc index f38dab7d386..f0c973b0ece 100644 --- a/source/blender/editors/object/object_bake_simulation.cc +++ b/source/blender/editors/object/object_bake_simulation.cc @@ -82,10 +82,7 @@ struct CalculateSimulationJob { int end_frame; }; -static void calculate_simulation_job_startjob(void *customdata, - bool *stop, - bool *do_update, - float *progress) +static void calculate_simulation_job_startjob(void *customdata, wmJobWorkerStatus *worker_status) { CalculateSimulationJob &job = *static_cast(customdata); G.is_rendering = true; @@ -114,8 +111,8 @@ static void calculate_simulation_job_startjob(void *customdata, objects_to_calc.append(object); } - *progress = 0.0f; - *do_update = true; + worker_status->progress = 0.0f; + worker_status->do_update = true; const float frame_step_size = 1.0f; const float progress_per_frame = 1.0f / @@ -125,7 +122,7 @@ static void calculate_simulation_job_startjob(void *customdata, for (float frame_f = job.start_frame; frame_f <= job.end_frame; frame_f += frame_step_size) { const SubFrame frame{frame_f}; - if (G.is_break || (stop != nullptr && *stop)) { + if (G.is_break || worker_status->stop) { break; } @@ -134,15 +131,15 @@ static void calculate_simulation_job_startjob(void *customdata, BKE_scene_graph_update_for_newframe(job.depsgraph); - *progress += progress_per_frame; - *do_update = true; + worker_status->progress += progress_per_frame; + worker_status->do_update = true; } job.scene->r.cfra = old_frame; DEG_time_tag_update(job.bmain); - *progress = 1.0f; - *do_update = true; + worker_status->progress = 1.0f; + worker_status->do_update = true; } static void calculate_simulation_job_endjob(void *customdata) @@ -250,10 +247,7 @@ struct BakeSimulationJob { Vector objects; }; -static void bake_simulation_job_startjob(void *customdata, - bool *stop, - bool *do_update, - float *progress) +static void bake_simulation_job_startjob(void *customdata, wmJobWorkerStatus *worker_status) { BakeSimulationJob &job = *static_cast(customdata); G.is_rendering = true; @@ -272,8 +266,8 @@ static void bake_simulation_job_startjob(void *customdata, } } - *progress = 0.0f; - *do_update = true; + worker_status->progress = 0.0f; + worker_status->do_update = true; const int frames_to_bake = global_bake_end_frame - global_bake_start_frame + 1; @@ -286,7 +280,7 @@ static void bake_simulation_job_startjob(void *customdata, { const SubFrame frame{frame_f}; - if (G.is_break || (stop != nullptr && *stop)) { + if (G.is_break || worker_status->stop) { break; } @@ -338,8 +332,8 @@ static void bake_simulation_job_startjob(void *customdata, } } - *progress += progress_per_frame; - *do_update = true; + worker_status->progress += progress_per_frame; + worker_status->do_update = true; } for (ObjectBakeData &object_bake_data : job.objects) { @@ -363,8 +357,8 @@ static void bake_simulation_job_startjob(void *customdata, job.scene->r.cfra = old_frame; DEG_time_tag_update(job.bmain); - *progress = 1.0f; - *do_update = true; + worker_status->progress = 1.0f; + worker_status->do_update = true; } static void bake_simulation_job_endjob(void *customdata) diff --git a/source/blender/editors/object/object_modifier.cc b/source/blender/editors/object/object_modifier.cc index a6091788f20..428f1229b8b 100644 --- a/source/blender/editors/object/object_modifier.cc +++ b/source/blender/editors/object/object_modifier.cc @@ -185,7 +185,8 @@ ModifierData *ED_object_modifier_add( md = static_cast(ob->modifiers.first); while (md && - BKE_modifier_get_info((ModifierType)md->type)->type == eModifierTypeType_OnlyDeform) { + BKE_modifier_get_info((ModifierType)md->type)->type == eModifierTypeType_OnlyDeform) + { md = md->next; } @@ -772,7 +773,8 @@ static Mesh *create_applied_mesh_for_modifier(Depsgraph *depsgraph, if (build_shapekey_layers && me->key) { if (KeyBlock *kb = static_cast( - BLI_findlink(&me->key->block, ob_eval->shapenr - 1))) { + BLI_findlink(&me->key->block, ob_eval->shapenr - 1))) + { BKE_keyblock_convert_to_mesh( kb, reinterpret_cast(me->vert_positions_for_write().data()), me->totvert); } @@ -3309,20 +3311,20 @@ static void oceanbake_update(void *customdata, float progress, int *cancel) *(oj->progress) = progress; } -static void oceanbake_startjob(void *customdata, bool *stop, bool *do_update, float *progress) +static void oceanbake_startjob(void *customdata, wmJobWorkerStatus *worker_status) { OceanBakeJob *oj = static_cast(customdata); - oj->stop = stop; - oj->do_update = do_update; - oj->progress = progress; + oj->stop = &worker_status->stop; + oj->do_update = &worker_status->do_update; + oj->progress = &worker_status->progress; G.is_break = false; /* XXX shared with render - replace with job 'stop' switch */ BKE_ocean_bake(oj->ocean, oj->och, oceanbake_update, (void *)oj); - *do_update = true; - *stop = false; + worker_status->do_update = true; + worker_status->stop = false; } static void oceanbake_endjob(void *customdata) diff --git a/source/blender/editors/object/object_remesh.cc b/source/blender/editors/object/object_remesh.cc index f56790b5af3..28cffe22971 100644 --- a/source/blender/editors/object/object_remesh.cc +++ b/source/blender/editors/object/object_remesh.cc @@ -837,13 +837,13 @@ static Mesh *remesh_symmetry_mirror(Object *ob, Mesh *mesh, eSymmetryAxes symmet return mesh_mirror; } -static void quadriflow_start_job(void *customdata, bool *stop, bool *do_update, float *progress) +static void quadriflow_start_job(void *customdata, wmJobWorkerStatus *worker_status) { QuadriFlowJob *qj = static_cast(customdata); - qj->stop = stop; - qj->do_update = do_update; - qj->progress = progress; + qj->stop = &worker_status->stop; + qj->do_update = &worker_status->do_update; + qj->progress = &worker_status->progress; qj->success = 1; if (qj->is_nonblocking_job) { @@ -884,8 +884,8 @@ static void quadriflow_start_job(void *customdata, bool *stop, bool *do_update, BKE_id_free(nullptr, bisect_mesh); if (new_mesh == nullptr) { - *do_update = true; - *stop = false; + worker_status->do_update = true; + worker_status->stop = false; if (qj->success == 1) { /* This is not a user cancellation event. */ qj->success = 0; @@ -914,8 +914,8 @@ static void quadriflow_start_job(void *customdata, bool *stop, bool *do_update, BKE_mesh_batch_cache_dirty_tag(static_cast(ob->data), BKE_MESH_BATCH_DIRTY_ALL); - *do_update = true; - *stop = false; + worker_status->do_update = true; + worker_status->stop = false; } static void quadriflow_end_job(void *customdata) @@ -990,9 +990,8 @@ static int quadriflow_remesh_exec(bContext *C, wmOperator *op) if (op->flag == 0) { /* This is called directly from the exec operator, this operation is now blocking */ job->is_nonblocking_job = false; - bool stop = false, do_update = true; - float progress; - quadriflow_start_job(job, &stop, &do_update, &progress); + wmJobWorkerStatus worker_status = {}; + quadriflow_start_job(job, &worker_status); quadriflow_end_job(job); quadriflow_free_job(job); } diff --git a/source/blender/editors/physics/dynamicpaint_ops.cc b/source/blender/editors/physics/dynamicpaint_ops.cc index b411c2097eb..f34f09804db 100644 --- a/source/blender/editors/physics/dynamicpaint_ops.cc +++ b/source/blender/editors/physics/dynamicpaint_ops.cc @@ -432,13 +432,13 @@ static void dynamicPaint_bakeImageSequence(DynamicPaintBakeJob *job) ED_update_for_newframe(job->bmain, job->depsgraph); } -static void dpaint_bake_startjob(void *customdata, bool *stop, bool *do_update, float *progress) +static void dpaint_bake_startjob(void *customdata, wmJobWorkerStatus *worker_status) { DynamicPaintBakeJob *job = static_cast(customdata); - job->stop = stop; - job->do_update = do_update; - job->progress = progress; + job->stop = &worker_status->stop; + job->do_update = &worker_status->do_update; + job->progress = &worker_status->progress; job->start = PIL_check_seconds_timer(); job->success = 1; @@ -452,8 +452,8 @@ static void dpaint_bake_startjob(void *customdata, bool *stop, bool *do_update, dynamicPaint_bakeImageSequence(job); - *do_update = true; - *stop = false; + worker_status->do_update = true; + worker_status->stop = false; } /* diff --git a/source/blender/editors/physics/physics_fluid.cc b/source/blender/editors/physics/physics_fluid.cc index 6f11694c486..1c59482f4dc 100644 --- a/source/blender/editors/physics/physics_fluid.cc +++ b/source/blender/editors/physics/physics_fluid.cc @@ -350,7 +350,7 @@ static void fluid_bake_endjob(void *customdata) } } -static void fluid_bake_startjob(void *customdata, bool *stop, bool *do_update, float *progress) +static void fluid_bake_startjob(void *customdata, wmJobWorkerStatus *worker_status) { FluidJob *job = static_cast(customdata); FluidDomainSettings *fds = job->fmd->domain; @@ -358,9 +358,9 @@ static void fluid_bake_startjob(void *customdata, bool *stop, bool *do_update, f char temp_dir[FILE_MAX]; const char *relbase = BKE_modifier_path_relbase_from_global(job->ob); - job->stop = stop; - job->do_update = do_update; - job->progress = progress; + job->stop = &worker_status->stop; + job->do_update = &worker_status->do_update; + job->progress = &worker_status->progress; job->start = PIL_check_seconds_timer(); job->success = 1; @@ -425,12 +425,8 @@ static void fluid_bake_startjob(void *customdata, bool *stop, bool *do_update, f fluid_bake_sequence(job); - if (do_update) { - *do_update = true; - } - if (stop) { - *stop = false; - } + worker_status->do_update = true; + worker_status->stop = false; } static void fluid_free_endjob(void *customdata) @@ -462,14 +458,14 @@ static void fluid_free_endjob(void *customdata) } } -static void fluid_free_startjob(void *customdata, bool *stop, bool *do_update, float *progress) +static void fluid_free_startjob(void *customdata, wmJobWorkerStatus *worker_status) { FluidJob *job = static_cast(customdata); FluidDomainSettings *fds = job->fmd->domain; - job->stop = stop; - job->do_update = do_update; - job->progress = progress; + job->stop = &worker_status->stop; + job->do_update = &worker_status->do_update; + job->progress = &worker_status->progress; job->start = PIL_check_seconds_timer(); job->success = 1; @@ -504,8 +500,8 @@ static void fluid_free_startjob(void *customdata, bool *stop, bool *do_update, f UNUSED_VARS(cache_map); #endif - *do_update = true; - *stop = false; + worker_status->do_update = true; + worker_status->stop = false; /* Update scene so that viewport shows freed up scene */ ED_update_for_newframe(job->bmain, job->depsgraph); @@ -531,7 +527,8 @@ static int fluid_bake_exec(bContext *C, wmOperator *op) } WM_report_banners_cancel(job->bmain); - fluid_bake_startjob(job, nullptr, nullptr, nullptr); + wmJobWorkerStatus worker_status = {}; + fluid_bake_startjob(job, &worker_status); fluid_bake_endjob(job); fluid_bake_free(job); diff --git a/source/blender/editors/physics/physics_pointcache.cc b/source/blender/editors/physics/physics_pointcache.cc index e181c1a3d8e..9418d2cba5d 100644 --- a/source/blender/editors/physics/physics_pointcache.cc +++ b/source/blender/editors/physics/physics_pointcache.cc @@ -127,13 +127,13 @@ static void ptcache_job_update(void *customdata, float progress, int *cancel) *(job->progress) = progress; } -static void ptcache_job_startjob(void *customdata, bool *stop, bool *do_update, float *progress) +static void ptcache_job_startjob(void *customdata, wmJobWorkerStatus *worker_status) { PointCacheJob *job = static_cast(customdata); - job->stop = stop; - job->do_update = do_update; - job->progress = progress; + job->stop = &worker_status->stop; + job->do_update = &worker_status->do_update; + job->progress = &worker_status->progress; G.is_break = false; @@ -144,8 +144,8 @@ static void ptcache_job_startjob(void *customdata, bool *stop, bool *do_update, BKE_ptcache_bake(job->baker); - *do_update = true; - *stop = false; + worker_status->do_update = true; + worker_status->stop = false; } static void ptcache_job_endjob(void *customdata) diff --git a/source/blender/editors/render/render_internal.cc b/source/blender/editors/render/render_internal.cc index 4b48c288b64..00401d7b5d1 100644 --- a/source/blender/editors/render/render_internal.cc +++ b/source/blender/editors/render/render_internal.cc @@ -701,13 +701,13 @@ static void current_scene_update(void *rjv, Scene *scene) rj->iuser.scene = scene; } -static void render_startjob(void *rjv, bool *stop, bool *do_update, float *progress) +static void render_startjob(void *rjv, wmJobWorkerStatus *worker_status) { RenderJob *rj = static_cast(rjv); - rj->stop = stop; - rj->do_update = do_update; - rj->progress = progress; + rj->stop = &worker_status->stop; + rj->do_update = &worker_status->do_update; + rj->progress = &worker_status->progress; RE_SetReports(rj->re, rj->reports); diff --git a/source/blender/editors/render/render_preview.cc b/source/blender/editors/render/render_preview.cc index f8cfbe31c20..74b41de4711 100644 --- a/source/blender/editors/render/render_preview.cc +++ b/source/blender/editors/render/render_preview.cc @@ -419,7 +419,8 @@ static const char *preview_world_name(const Scene *sce, * this approximation. */ if (id_type == ID_MA && pr_method == PR_ICON_RENDER && - !render_engine_supports_ray_visibility(sce)) { + !render_engine_supports_ray_visibility(sce)) + { return "WorldFloor"; } return "World"; @@ -1437,7 +1438,8 @@ static void icon_preview_startjob(void *customdata, bool *stop, bool *do_update) * only get existing `ibuf`. */ ibuf = BKE_image_acquire_ibuf(ima, &iuser, nullptr); if (ibuf == nullptr || - (ibuf->byte_buffer.data == nullptr && ibuf->float_buffer.data == nullptr)) { + (ibuf->byte_buffer.data == nullptr && ibuf->float_buffer.data == nullptr)) + { BKE_image_release_ibuf(ima, ibuf, nullptr); return; } @@ -1478,18 +1480,15 @@ static void icon_preview_startjob(void *customdata, bool *stop, bool *do_update) /* use same function for icon & shader, so the job manager * does not run two of them at the same time. */ -static void common_preview_startjob(void *customdata, - bool *stop, - bool *do_update, - float * /*progress*/) +static void common_preview_startjob(void *customdata, wmJobWorkerStatus *worker_status) { ShaderPreview *sp = static_cast(customdata); if (ELEM(sp->pr_method, PR_ICON_RENDER, PR_ICON_DEFERRED)) { - icon_preview_startjob(customdata, stop, do_update); + icon_preview_startjob(customdata, &worker_status->stop, &worker_status->do_update); } else { - shader_preview_startjob(customdata, stop, do_update); + shader_preview_startjob(customdata, &worker_status->stop, &worker_status->do_update); } } @@ -1500,9 +1499,7 @@ static void common_preview_startjob(void *customdata, static void other_id_types_preview_render(IconPreview *ip, IconPreviewSize *cur_size, const ePreviewRenderMethod pr_method, - bool *stop, - bool *do_update, - float *progress) + wmJobWorkerStatus *worker_status) { ShaderPreview *sp = MEM_cnew("Icon ShaderPreview"); @@ -1538,7 +1535,7 @@ static void other_id_types_preview_render(IconPreview *ip, } } - common_preview_startjob(sp, stop, do_update, progress); + common_preview_startjob(sp, worker_status); shader_preview_free(sp); } @@ -1560,10 +1557,7 @@ static int icon_previewimg_size_index_get(const IconPreviewSize *icon_size, return -1; } -static void icon_preview_startjob_all_sizes(void *customdata, - bool *stop, - bool *do_update, - float *progress) +static void icon_preview_startjob_all_sizes(void *customdata, wmJobWorkerStatus *worker_status) { IconPreview *ip = (IconPreview *)customdata; @@ -1573,7 +1567,7 @@ static void icon_preview_startjob_all_sizes(void *customdata, const ePreviewRenderMethod pr_method = (prv->tag & PRV_TAG_DEFFERED) ? PR_ICON_DEFERRED : PR_ICON_RENDER; - if (*stop) { + if (worker_status->stop) { break; } @@ -1633,7 +1627,7 @@ static void icon_preview_startjob_all_sizes(void *customdata, break; } } - other_id_types_preview_render(ip, cur_size, pr_method, stop, do_update, progress); + other_id_types_preview_render(ip, cur_size, pr_method, worker_status); } } @@ -1733,7 +1727,7 @@ class PreviewLoadJob { void push_load_request(PreviewImage *preview, eIconSizes icon_size); private: - static void run_fn(void *customdata, bool *stop, bool *do_update, float *progress); + static void run_fn(void *customdata, wmJobWorkerStatus *worker_status); static void update_fn(void *customdata); static void end_fn(void *customdata); static void free_fn(void *customdata); @@ -1773,9 +1767,8 @@ void PreviewLoadJob::load_jobless(PreviewImage *preview, const eIconSizes icon_s job_data.push_load_request(preview, icon_size); - bool stop = false, do_update = false; - float progress = 0; - run_fn(&job_data, &stop, &do_update, &progress); + wmJobWorkerStatus worker_status = {}; + run_fn(&job_data, &worker_status); update_fn(&job_data); end_fn(&job_data); } @@ -1795,7 +1788,7 @@ void PreviewLoadJob::push_load_request(PreviewImage *preview, const eIconSizes i BLI_thread_queue_push(todo_queue_, &requested_previews_.back()); } -void PreviewLoadJob::run_fn(void *customdata, bool *stop, bool *do_update, float * /*progress*/) +void PreviewLoadJob::run_fn(void *customdata, wmJobWorkerStatus *worker_status) { PreviewLoadJob *job_data = static_cast(customdata); @@ -1804,7 +1797,7 @@ void PreviewLoadJob::run_fn(void *customdata, bool *stop, bool *do_update, float while (RequestedPreview *request = static_cast( BLI_thread_queue_pop_timeout(job_data->todo_queue_, 100))) { - if (*stop) { + if (worker_status->stop) { break; } @@ -1834,7 +1827,7 @@ void PreviewLoadJob::run_fn(void *customdata, bool *stop, bool *do_update, float IMB_freeImBuf(thumb); } - *do_update = true; + worker_status->do_update = true; } IMB_thumb_locks_release(); @@ -1938,8 +1931,6 @@ void ED_preview_icon_render( } IconPreview ip = {nullptr}; - bool stop = false, update = false; - float progress = 0.0f; ED_preview_ensure_dbase(true); @@ -1958,7 +1949,8 @@ void ED_preview_icon_render( icon_preview_add_size( &ip, prv_img->rect[icon_size], prv_img->w[icon_size], prv_img->h[icon_size]); - icon_preview_startjob_all_sizes(&ip, &stop, &update, &progress); + wmJobWorkerStatus worker_status = {}; + icon_preview_startjob_all_sizes(&ip, &worker_status); icon_preview_endjob(&ip); diff --git a/source/blender/editors/render/render_shading.cc b/source/blender/editors/render/render_shading.cc index 8191d91664e..b165434c695 100644 --- a/source/blender/editors/render/render_shading.cc +++ b/source/blender/editors/render/render_shading.cc @@ -1419,10 +1419,10 @@ static int light_cache_bake_exec(bContext *C, wmOperator *op) light_cache_bake_tag_cache(scene, op); - bool stop = false, do_update; - float progress; /* Not actually used. */ + /* Not actually used. */ + wmJobWorkerStatus worker_status = {}; /* Do the job. */ - EEVEE_lightbake_job(rj, &stop, &do_update, &progress); + EEVEE_lightbake_job(rj, &worker_status); /* Free baking data. Result is already stored in the scene data. */ EEVEE_lightbake_job_data_free(rj); @@ -1657,7 +1657,8 @@ static int lightprobe_cache_bake_exec(bContext *C, wmOperator *op) /* TODO: abort if selected engine is not eevee. */ void *rj = EEVEE_NEXT_lightbake_job_data_alloc(bmain, view_layer, scene, probes, scene->r.cfra); /* Do the job. */ - EEVEE_NEXT_lightbake_job(rj, nullptr, nullptr, nullptr); + wmJobWorkerStatus worker_status = {}; + EEVEE_NEXT_lightbake_job(rj, &worker_status); /* Free baking data. Result is already stored in the scene data. */ EEVEE_NEXT_lightbake_job_data_free(rj); diff --git a/source/blender/editors/space_clip/clip_editor.cc b/source/blender/editors/space_clip/clip_editor.cc index 4d18dd264a4..c3e12d91d5b 100644 --- a/source/blender/editors/space_clip/clip_editor.cc +++ b/source/blender/editors/space_clip/clip_editor.cc @@ -998,7 +998,7 @@ static void do_prefetch_movie(MovieClip *clip, } } -static void prefetch_startjob(void *pjv, bool *stop, bool *do_update, float *progress) +static void prefetch_startjob(void *pjv, wmJobWorkerStatus *worker_status) { PrefetchJob *pj = static_cast(pjv); @@ -1010,9 +1010,9 @@ static void prefetch_startjob(void *pjv, bool *stop, bool *do_update, float *pro pj->end_frame, pj->render_size, pj->render_flag, - stop, - do_update, - progress); + &worker_status->stop, + &worker_status->do_update, + &worker_status->progress); } else if (pj->clip->source == MCLIP_SRC_MOVIE) { /* read movie in a single thread */ @@ -1023,9 +1023,9 @@ static void prefetch_startjob(void *pjv, bool *stop, bool *do_update, float *pro pj->end_frame, pj->render_size, pj->render_flag, - stop, - do_update, - progress); + &worker_status->stop, + &worker_status->do_update, + &worker_status->progress); } else { BLI_assert_msg(0, "Unknown movie clip source when prefetching frames"); diff --git a/source/blender/editors/space_clip/clip_ops.cc b/source/blender/editors/space_clip/clip_ops.cc index 1013e2f54e7..9ce1e8a60be 100644 --- a/source/blender/editors/space_clip/clip_ops.cc +++ b/source/blender/editors/space_clip/clip_ops.cc @@ -1452,7 +1452,7 @@ static void do_sequence_proxy(void *pjv, MEM_freeN(handles); } -static void proxy_startjob(void *pjv, bool *stop, bool *do_update, float *progress) +static void proxy_startjob(void *pjv, wmJobWorkerStatus *worker_status) { ProxyJob *pj = static_cast(pjv); MovieClip *clip = pj->clip; @@ -1472,9 +1472,9 @@ static void proxy_startjob(void *pjv, bool *stop, bool *do_update, float *progre build_count, build_undistort_sizes, build_undistort_count, - stop, - do_update, - progress); + &worker_status->stop, + &worker_status->do_update, + &worker_status->progress); } else { do_sequence_proxy(pjv, @@ -1482,9 +1482,9 @@ static void proxy_startjob(void *pjv, bool *stop, bool *do_update, float *progre build_count, build_undistort_sizes, build_undistort_count, - stop, - do_update, - progress); + &worker_status->stop, + &worker_status->do_update, + &worker_status->progress); } } diff --git a/source/blender/editors/space_clip/tracking_ops_solve.cc b/source/blender/editors/space_clip/tracking_ops_solve.cc index 73f61cc0abf..b5a745f9423 100644 --- a/source/blender/editors/space_clip/tracking_ops_solve.cc +++ b/source/blender/editors/space_clip/tracking_ops_solve.cc @@ -92,11 +92,15 @@ static void solve_camera_updatejob(void *scv) STRNCPY(tracking->stats->message, scj->stats_message); } -static void solve_camera_startjob(void *scv, bool *stop, bool *do_update, float *progress) +static void solve_camera_startjob(void *scv, wmJobWorkerStatus *worker_status) { SolveCameraJob *scj = (SolveCameraJob *)scv; - BKE_tracking_reconstruction_solve( - scj->context, stop, do_update, progress, scj->stats_message, sizeof(scj->stats_message)); + BKE_tracking_reconstruction_solve(scj->context, + &worker_status->stop, + &worker_status->do_update, + &worker_status->progress, + scj->stats_message, + sizeof(scj->stats_message)); } static void solve_camera_freejob(void *scv) @@ -184,7 +188,8 @@ static int solve_camera_exec(bContext *C, wmOperator *op) solve_camera_freejob(scj); return OPERATOR_CANCELLED; } - solve_camera_startjob(scj, nullptr, nullptr, nullptr); + wmJobWorkerStatus worker_status = {}; + solve_camera_startjob(scj, &worker_status); solve_camera_freejob(scj); return OPERATOR_FINISHED; } diff --git a/source/blender/editors/space_clip/tracking_ops_track.cc b/source/blender/editors/space_clip/tracking_ops_track.cc index 9f97b85e56c..75f57f57de7 100644 --- a/source/blender/editors/space_clip/tracking_ops_track.cc +++ b/source/blender/editors/space_clip/tracking_ops_track.cc @@ -203,13 +203,7 @@ static bool track_markers_initjob(bContext *C, TrackMarkersJob *tmj, bool backwa return true; } -static void track_markers_startjob( - void *tmv, - /* Cannot be const, this function implements wm_jobs_start_callback. - * NOLINTNEXTLINE: readability-non-const-parameter. */ - bool *stop, - bool *do_update, - float *progress) +static void track_markers_startjob(void *tmv, wmJobWorkerStatus *worker_status) { TrackMarkersJob *tmj = (TrackMarkersJob *)tmv; int framenr = tmj->sfra; @@ -240,8 +234,8 @@ static void track_markers_startjob( break; } - *do_update = true; - *progress = float(framenr - tmj->sfra) / (tmj->efra - tmj->sfra); + worker_status->do_update = true; + worker_status->progress = float(framenr - tmj->sfra) / (tmj->efra - tmj->sfra); if (tmj->backwards) { framenr--; @@ -252,7 +246,7 @@ static void track_markers_startjob( tmj->lastfra = framenr; - if (*stop || track_markers_testbreak()) { + if (worker_status->stop || track_markers_testbreak()) { break; } } @@ -356,9 +350,8 @@ static int track_markers(bContext *C, wmOperator *op, bool use_job) return OPERATOR_RUNNING_MODAL; } - bool stop = false, do_update = false; - float progress = 0.0f; - track_markers_startjob(tmj, &stop, &do_update, &progress); + wmJobWorkerStatus worker_status = {}; + track_markers_startjob(tmj, &worker_status); track_markers_endjob(tmj); track_markers_freejob(tmj); return OPERATOR_FINISHED; diff --git a/source/blender/editors/space_file/filelist.cc b/source/blender/editors/space_file/filelist.cc index fc730bbee99..5e6fc911f8f 100644 --- a/source/blender/editors/space_file/filelist.cc +++ b/source/blender/editors/space_file/filelist.cc @@ -1640,7 +1640,8 @@ static void filelist_cache_previews_push(FileList *filelist, FileDirEntry *entry * some time in heavy files, because otherwise for each missing preview and for each preview * reload, we'd reopen the .blend to look for the preview. */ if ((entry->typeflag & FILE_TYPE_BLENDERLIB) && - (entry->flags & FILE_ENTRY_BLENDERLIB_NO_PREVIEW)) { + (entry->flags & FILE_ENTRY_BLENDERLIB_NO_PREVIEW)) + { return; } @@ -3747,7 +3748,8 @@ static void filelist_readjob_recursive_dir_add_items(const bool do_lib, entry->free_name = true; if (filelist_readjob_should_recurse_into_entry( - max_recursion, is_lib, recursion_level, entry)) { + max_recursion, is_lib, recursion_level, entry)) + { /* We have a directory we want to list, add it to todo list! * Using #BLI_path_join works but isn't needed as `root` has a trailing slash. */ BLI_string_join(dir, sizeof(dir), root, entry->relpath); @@ -4049,7 +4051,7 @@ static bool filelist_readjob_is_partial_read(const FileListReadJob *read_job) * some current entries are kept and we just call the readjob to update the main files (see * #FileListReadJob.only_main_data). */ -static void filelist_readjob_startjob(void *flrjv, bool *stop, bool *do_update, float *progress) +static void filelist_readjob_startjob(void *flrjv, wmJobWorkerStatus *worker_status) { FileListReadJob *flrj = static_cast(flrjv); @@ -4082,7 +4084,8 @@ static void filelist_readjob_startjob(void *flrjv, bool *stop, bool *do_update, BLI_mutex_unlock(&flrj->lock); - flrj->tmp_filelist->read_job_fn(flrj, stop, do_update, progress); + flrj->tmp_filelist->read_job_fn( + flrj, &worker_status->stop, &worker_status->do_update, &worker_status->progress); } /** @@ -4197,12 +4200,9 @@ void filelist_readjob_start(FileList *filelist, const int space_notifier, const const bool no_threads = (filelist->tags & FILELIST_TAGS_NO_THREADS) || flrj->only_main_data; if (no_threads) { - bool dummy_stop = false; - bool dummy_do_update = false; - float dummy_progress = 0.0f; - /* Single threaded execution. Just directly call the callbacks. */ - filelist_readjob_startjob(flrj, &dummy_stop, &dummy_do_update, &dummy_progress); + wmJobWorkerStatus worker_status = {}; + filelist_readjob_startjob(flrj, &worker_status); filelist_readjob_endjob(flrj); filelist_readjob_free(flrj); diff --git a/source/blender/editors/space_file/fsmenu.cc b/source/blender/editors/space_file/fsmenu.cc index 122fe8cb14e..624113692bd 100644 --- a/source/blender/editors/space_file/fsmenu.cc +++ b/source/blender/editors/space_file/fsmenu.cc @@ -593,13 +593,7 @@ int fsmenu_get_active_indices(FSMenu *fsmenu, enum FSMenuCategory category, cons * before being defined as unreachable by the OS, we need to validate the bookmarks in an * asynchronous job. */ -static void fsmenu_bookmark_validate_job_startjob( - void *fsmenuv, - /* Cannot be const, this function implements wm_jobs_start_callback. - * NOLINTNEXTLINE: readability-non-const-parameter. */ - bool *stop, - bool *do_update, - float * /*progress*/) +static void fsmenu_bookmark_validate_job_startjob(void *fsmenuv, wmJobWorkerStatus *worker_status) { FSMenu *fsmenu = static_cast(fsmenuv); @@ -609,13 +603,13 @@ static void fsmenu_bookmark_validate_job_startjob( for (size_t i = ARRAY_SIZE(categories); i--;) { FSMenuEntry *fsm_iter = ED_fsmenu_get_category(fsmenu, FSMenuCategory(categories[i])); for (; fsm_iter; fsm_iter = fsm_iter->next) { - if (*stop) { + if (worker_status->stop) { return; } /* Note that we do not really need atomics primitives or thread locks here, since this only * sets one short, which is assumed to be 'atomic'-enough for us here. */ fsmenu_entry_refresh_valid(fsm_iter); - *do_update = true; + worker_status->do_update = true; } } } diff --git a/source/blender/editors/space_node/node_edit.cc b/source/blender/editors/space_node/node_edit.cc index fc746cce3f8..0086ae835f8 100644 --- a/source/blender/editors/space_node/node_edit.cc +++ b/source/blender/editors/space_node/node_edit.cc @@ -267,12 +267,7 @@ static void compo_progressjob(void *cjv, float progress) } /* Only this runs inside thread. */ -static void compo_startjob(void *cjv, - /* Cannot be const, this function implements wm_jobs_start_callback. - * NOLINTNEXTLINE: readability-non-const-parameter. */ - bool *stop, - bool *do_update, - float *progress) +static void compo_startjob(void *cjv, wmJobWorkerStatus *worker_status) { CompoJob *cj = (CompoJob *)cjv; bNodeTree *ntree = cj->localtree; @@ -282,9 +277,9 @@ static void compo_startjob(void *cjv, return; } - cj->stop = stop; - cj->do_update = do_update; - cj->progress = progress; + cj->stop = &worker_status->stop; + cj->do_update = &worker_status->do_update; + cj->progress = &worker_status->progress; ntree->runtime->test_break = compo_breakjob; ntree->runtime->tbh = cj; diff --git a/source/blender/editors/space_node/node_shader_preview.cc b/source/blender/editors/space_node/node_shader_preview.cc index 6a69bbbd513..5de59f3d948 100644 --- a/source/blender/editors/space_node/node_shader_preview.cc +++ b/source/blender/editors/space_node/node_shader_preview.cc @@ -689,16 +689,13 @@ static void update_needed_flag(NestedTreePreviews &tree_previews, } } -static void shader_preview_startjob(void *customdata, - bool *stop, - bool *do_update, - float * /*progress*/) +static void shader_preview_startjob(void *customdata, wmJobWorkerStatus *worker_status) { ShaderNodesPreviewJob *job_data = static_cast(customdata); - job_data->stop = stop; - job_data->do_update = do_update; - *do_update = true; + job_data->stop = &worker_status->stop; + job_data->do_update = &worker_status->do_update; + worker_status->do_update = true; bool size_changed = job_data->tree_previews->preview_size != U.node_preview_res; if (size_changed) { job_data->tree_previews->preview_size = U.node_preview_res; diff --git a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc index b38a6541283..d5e57c1e10b 100644 --- a/source/blender/editors/space_sequencer/sequencer_drag_drop.cc +++ b/source/blender/editors/space_sequencer/sequencer_drag_drop.cc @@ -518,10 +518,7 @@ struct DropJobData { float scene_fps; }; -static void prefetch_data_fn(void *custom_data, - bool * /*stop*/, - bool * /*do_update*/, - float * /*progress*/) +static void prefetch_data_fn(void *custom_data, wmJobWorkerStatus * /*worker_status*/) { DropJobData *job_data = (DropJobData *)custom_data; diff --git a/source/blender/editors/space_sequencer/sequencer_preview.cc b/source/blender/editors/space_sequencer/sequencer_preview.cc index def9f516020..468b5c16069 100644 --- a/source/blender/editors/space_sequencer/sequencer_preview.cc +++ b/source/blender/editors/space_sequencer/sequencer_preview.cc @@ -114,7 +114,7 @@ static void push_preview_job_audio_task(TaskPool *__restrict task_pool, } /* Only this runs inside thread. */ -static void preview_startjob(void *data, bool *stop, bool *do_update, float *progress) +static void preview_startjob(void *data, wmJobWorkerStatus *worker_status) { TaskPool *task_pool = BLI_task_pool_create(nullptr, TASK_PRIORITY_LOW); PreviewJob *pj = static_cast(data); @@ -128,9 +128,9 @@ static void preview_startjob(void *data, bool *stop, bool *do_update, float *pro float current_progress = (pj->total > 0) ? float(pj->processed) / float(pj->total) : 1.0f; - if (current_progress != *progress) { - *progress = current_progress; - *do_update = true; + if (current_progress != worker_status->progress) { + worker_status->progress = current_progress; + worker_status->do_update = true; } BLI_condition_wait(&pj->preview_suspend_cond, pj->mutex); @@ -142,7 +142,7 @@ static void preview_startjob(void *data, bool *stop, bool *do_update, float *pro break; } - if (*stop || G.is_break) { + if (worker_status->stop || G.is_break) { BLI_task_pool_cancel(task_pool); LISTBASE_FOREACH (PreviewJobAudio *, previewjb, &pj->previews) { @@ -159,7 +159,7 @@ static void preview_startjob(void *data, bool *stop, bool *do_update, float *pro } LISTBASE_FOREACH_MUTABLE (PreviewJobAudio *, previewjb, &pj->previews) { - push_preview_job_audio_task(task_pool, pj, previewjb, stop); + push_preview_job_audio_task(task_pool, pj, previewjb, &worker_status->stop); BLI_remlink(&pj->previews, previewjb); } diff --git a/source/blender/editors/space_sequencer/sequencer_proxy.cc b/source/blender/editors/space_sequencer/sequencer_proxy.cc index 13253e38f26..5f92e370d0f 100644 --- a/source/blender/editors/space_sequencer/sequencer_proxy.cc +++ b/source/blender/editors/space_sequencer/sequencer_proxy.cc @@ -116,14 +116,13 @@ static int sequencer_rebuild_proxy_exec(bContext *C, wmOperator * /*o*/) LISTBASE_FOREACH (Sequence *, seq, SEQ_active_seqbase_get(ed)) { if (seq->flag & SELECT) { ListBase queue = {nullptr, nullptr}; - bool stop = false, do_update; - float progress; SEQ_proxy_rebuild_context(bmain, depsgraph, scene, seq, file_list, &queue, false); + wmJobWorkerStatus worker_status = {}; LISTBASE_FOREACH (LinkData *, link, &queue) { SeqIndexBuildContext *context = static_cast(link->data); - SEQ_proxy_rebuild(context, &stop, &do_update, &progress); + SEQ_proxy_rebuild(context, &worker_status); SEQ_proxy_rebuild_finish(context, false); } SEQ_relations_free_imbuf(scene, &ed->seqbase, false); diff --git a/source/blender/editors/space_sequencer/sequencer_thumbnails.cc b/source/blender/editors/space_sequencer/sequencer_thumbnails.cc index 2221357ba22..3bb1455cae3 100644 --- a/source/blender/editors/space_sequencer/sequencer_thumbnails.cc +++ b/source/blender/editors/space_sequencer/sequencer_thumbnails.cc @@ -133,7 +133,7 @@ static void seq_get_thumb_image_dimensions(Sequence *seq, } } -static void thumbnail_start_job(void *data, bool *stop, bool * /*do_update*/, float * /*progress*/) +static void thumbnail_start_job(void *data, wmJobWorkerStatus *worker_status) { ThumbnailDrawJob *tj = static_cast(data); const Scene *scene = tj->scene; @@ -143,7 +143,7 @@ static void thumbnail_start_job(void *data, bool *stop, bool * /*do_update*/, fl /* First pass: render visible images. */ BLI_ghashIterator_init(&gh_iter, tj->sequences_ghash); - while (!BLI_ghashIterator_done(&gh_iter) & !*stop) { + while (!BLI_ghashIterator_done(&gh_iter) & !worker_status->stop) { Sequence *seq_orig = static_cast(BLI_ghashIterator_getKey(&gh_iter)); ThumbDataItem *val = static_cast( BLI_ghash_lookup(tj->sequences_ghash, seq_orig)); @@ -152,7 +152,7 @@ static void thumbnail_start_job(void *data, bool *stop, bool * /*do_update*/, fl seq_get_thumb_image_dimensions( val->seq_dupli, tj->pixelx, tj->pixely, &frame_step, tj->thumb_height, nullptr, nullptr); SEQ_render_thumbnails( - &tj->context, val->seq_dupli, seq_orig, frame_step, tj->view_area, stop); + &tj->context, val->seq_dupli, seq_orig, frame_step, tj->view_area, &worker_status->stop); SEQ_relations_sequence_free_anim(val->seq_dupli); } BLI_ghashIterator_step(&gh_iter); @@ -160,7 +160,7 @@ static void thumbnail_start_job(void *data, bool *stop, bool * /*do_update*/, fl /* Second pass: render "guaranteed" set of images. */ BLI_ghashIterator_init(&gh_iter, tj->sequences_ghash); - while (!BLI_ghashIterator_done(&gh_iter) & !*stop) { + while (!BLI_ghashIterator_done(&gh_iter) & !worker_status->stop) { Sequence *seq_orig = static_cast(BLI_ghashIterator_getKey(&gh_iter)); ThumbDataItem *val = static_cast( BLI_ghash_lookup(tj->sequences_ghash, seq_orig)); @@ -168,7 +168,8 @@ static void thumbnail_start_job(void *data, bool *stop, bool * /*do_update*/, fl if (check_seq_need_thumbnails(scene, seq_orig, tj->view_area)) { seq_get_thumb_image_dimensions( val->seq_dupli, tj->pixelx, tj->pixely, &frame_step, tj->thumb_height, nullptr, nullptr); - SEQ_render_thumbnails_base_set(&tj->context, val->seq_dupli, seq_orig, tj->view_area, stop); + SEQ_render_thumbnails_base_set( + &tj->context, val->seq_dupli, seq_orig, tj->view_area, &worker_status->stop); SEQ_relations_sequence_free_anim(val->seq_dupli); } BLI_ghashIterator_step(&gh_iter); diff --git a/source/blender/editors/uvedit/uvedit_unwrap_ops.cc b/source/blender/editors/uvedit/uvedit_unwrap_ops.cc index 640c8aada98..87b238a0f1e 100644 --- a/source/blender/editors/uvedit/uvedit_unwrap_ops.cc +++ b/source/blender/editors/uvedit/uvedit_unwrap_ops.cc @@ -1403,17 +1403,15 @@ struct UVPackIslandsData { blender::geometry::UVPackIsland_Params pack_island_params; }; -static void pack_islands_startjob(void *pidv, bool *stop, bool *do_update, float *progress) +static void pack_islands_startjob(void *pidv, wmJobWorkerStatus *worker_status) { - if (progress != nullptr) { - *progress = 0.02f; - } + worker_status->progress = 0.02f; UVPackIslandsData *pid = static_cast(pidv); - pid->pack_island_params.stop = stop; - pid->pack_island_params.do_update = do_update; - pid->pack_island_params.progress = progress; + pid->pack_island_params.stop = &worker_status->stop; + pid->pack_island_params.do_update = &worker_status->do_update; + pid->pack_island_params.progress = &worker_status->progress; uvedit_pack_islands_multi(pid->scene, pid->objects, @@ -1424,12 +1422,8 @@ static void pack_islands_startjob(void *pidv, bool *stop, bool *do_update, float !pid->use_job, &pid->pack_island_params); - if (progress != nullptr) { - *progress = 0.99f; - } - if (do_update != nullptr) { - *do_update = true; - } + worker_status->progress = 0.99f; + worker_status->do_update = true; } static void pack_islands_endjob(void *pidv) @@ -1554,7 +1548,8 @@ static int pack_islands_exec(bContext *C, wmOperator *op) return OPERATOR_FINISHED; } - pack_islands_startjob(pid, nullptr, nullptr, nullptr); + wmJobWorkerStatus worker_status = {}; + pack_islands_startjob(pid, &worker_status); pack_islands_endjob(pid); pack_islands_freejob(pid); @@ -2682,7 +2677,8 @@ static int smart_uv_project_thickface_area_cmp_fn(const void *tf_a_p, const void /* Ignore the area of small faces. * Also, order checks so `!isfinite(...)` values are counted as zero area. */ if (!((tf_a->area > smart_uv_project_area_ignore) || - (tf_b->area > smart_uv_project_area_ignore))) { + (tf_b->area > smart_uv_project_area_ignore))) + { return 0; } diff --git a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_ops.cc b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_ops.cc index 734744e2599..6b879e3c487 100644 --- a/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_ops.cc +++ b/source/blender/gpencil_modifiers_legacy/intern/lineart/lineart_ops.cc @@ -219,15 +219,12 @@ static void lineart_gpencil_guard_modifiers(LineartBakeJob *bj) } } -static void lineart_gpencil_bake_startjob(void *customdata, - bool *stop, - bool *do_update, - float *progress) +static void lineart_gpencil_bake_startjob(void *customdata, wmJobWorkerStatus *worker_status) { LineartBakeJob *bj = (LineartBakeJob *)customdata; - bj->stop = stop; - bj->do_update = do_update; - bj->progress = progress; + bj->stop = &worker_status->stop; + bj->do_update = &worker_status->do_update; + bj->progress = &worker_status->progress; lineart_gpencil_guard_modifiers(bj); @@ -339,9 +336,8 @@ static int lineart_gpencil_bake_common(bContext *C, return OPERATOR_RUNNING_MODAL; } - float pseduo_progress; - bool pseduo_do_update; - lineart_gpencil_bake_startjob(bj, nullptr, &pseduo_do_update, &pseduo_progress); + wmJobWorkerStatus worker_status = {}; + lineart_gpencil_bake_startjob(bj, &worker_status); BLI_linklist_free(bj->objects, nullptr); MEM_freeN(bj); diff --git a/source/blender/io/alembic/exporter/abc_export_capi.cc b/source/blender/io/alembic/exporter/abc_export_capi.cc index 7c540d1e10b..f4ed5b93292 100644 --- a/source/blender/io/alembic/exporter/abc_export_capi.cc +++ b/source/blender/io/alembic/exporter/abc_export_capi.cc @@ -70,12 +70,7 @@ static void report_job_duration(const ExportJobData *data) std::cout << '\n'; } -static void export_startjob(void *customdata, - /* Cannot be const, this function implements wm_jobs_start_callback. - * NOLINTNEXTLINE: readability-non-const-parameter. */ - bool *stop, - bool *do_update, - float *progress) +static void export_startjob(void *customdata, wmJobWorkerStatus *worker_status) { ExportJobData *data = static_cast(customdata); data->was_canceled = false; @@ -85,8 +80,8 @@ static void export_startjob(void *customdata, WM_set_locked_interface(data->wm, true); G.is_break = false; - *progress = 0.0f; - *do_update = true; + worker_status->progress = 0.0f; + worker_status->do_update = true; build_depsgraph(data->depsgraph, data->params.visible_objects_only); SubdivModifierDisabler subdiv_disabler(data->depsgraph); @@ -140,7 +135,7 @@ static void export_startjob(void *customdata, for (; frame_it != frames_end; frame_it++) { double frame = *frame_it; - if (G.is_break || (stop != nullptr && *stop)) { + if (G.is_break || worker_status->stop) { break; } @@ -154,8 +149,8 @@ static void export_startjob(void *customdata, iter.set_export_subset(export_subset); iter.iterate_and_write(); - *progress += progress_per_frame; - *do_update = true; + worker_status->progress += progress_per_frame; + worker_status->do_update = true; } } else { @@ -173,8 +168,8 @@ static void export_startjob(void *customdata, data->export_ok = !data->was_canceled; - *progress = 1.0f; - *do_update = true; + worker_status->progress = 1.0f; + worker_status->do_update = true; } static void export_endjob(void *customdata) @@ -230,11 +225,8 @@ bool ABC_export(Scene *scene, WM_jobs_start(CTX_wm_manager(C), wm_job); } else { - /* Fake a job context, so that we don't need null pointer checks while exporting. */ - bool stop = false, do_update = false; - float progress = 0.0f; - - blender::io::alembic::export_startjob(job, &stop, &do_update, &progress); + wmJobWorkerStatus worker_status = {}; + blender::io::alembic::export_startjob(job, &worker_status); blender::io::alembic::export_endjob(job); export_ok = job->export_ok; diff --git a/source/blender/io/alembic/intern/alembic_capi.cc b/source/blender/io/alembic/intern/alembic_capi.cc index 32cc2d412eb..a4baa7aabc2 100644 --- a/source/blender/io/alembic/intern/alembic_capi.cc +++ b/source/blender/io/alembic/intern/alembic_capi.cc @@ -101,7 +101,7 @@ static void add_object_path(ListBase *object_paths, const IObject &object) BLI_addtail(object_paths, abc_path); } -//#define USE_NURBS +// #define USE_NURBS /* NOTE: this function is similar to visit_objects below, need to keep them in * sync. */ @@ -453,15 +453,15 @@ static void report_job_duration(const ImportJobData *data) std::cout << '\n'; } -static void import_startjob(void *user_data, bool *stop, bool *do_update, float *progress) +static void import_startjob(void *user_data, wmJobWorkerStatus *worker_status) { SCOPE_TIMER("Alembic import, objects reading and creation"); ImportJobData *data = static_cast(user_data); - data->stop = stop; - data->do_update = do_update; - data->progress = progress; + data->stop = &worker_status->stop; + data->do_update = &worker_status->do_update; + data->progress = &worker_status->progress; data->start_time = blender::timeit::Clock::now(); WM_set_locked_interface(data->wm, true); @@ -721,11 +721,8 @@ bool ABC_import(bContext *C, WM_jobs_start(CTX_wm_manager(C), wm_job); } else { - /* Fake a job context, so that we don't need null pointer checks while importing. */ - bool stop = false, do_update = false; - float progress = 0.0f; - - import_startjob(job, &stop, &do_update, &progress); + wmJobWorkerStatus worker_status = {}; + import_startjob(job, &worker_status); import_endjob(job); import_ok = job->import_ok; diff --git a/source/blender/io/usd/intern/usd_capi_export.cc b/source/blender/io/usd/intern/usd_capi_export.cc index d8c0b42a26b..ac60a322607 100644 --- a/source/blender/io/usd/intern/usd_capi_export.cc +++ b/source/blender/io/usd/intern/usd_capi_export.cc @@ -203,9 +203,7 @@ static bool perform_usdz_conversion(const ExportJobData *data) static pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms, Depsgraph *depsgraph, const char *filepath, - bool *stop, - bool *do_update, - float *progress) + wmJobWorkerStatus *worker_status) { pxr::UsdStageRefPtr usd_stage = pxr::UsdStage::CreateNew(filepath); if (!usd_stage) { @@ -242,7 +240,7 @@ static pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms, float progress_per_frame = 1.0f / std::max(1, (scene->r.efra - scene->r.sfra + 1)); for (float frame = scene->r.sfra; frame <= scene->r.efra; frame++) { - if (G.is_break || (stop != nullptr && *stop)) { + if (G.is_break || worker_status->stop) { break; } @@ -254,12 +252,8 @@ static pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms, iter.set_export_frame(frame); iter.iterate_and_write(); - if (progress) { - *progress += progress_per_frame; - } - if (do_update) { - *do_update = true; - } + worker_status->progress += progress_per_frame; + worker_status->do_update = true; } } else { @@ -294,15 +288,11 @@ pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms, Depsgraph *depsgraph, const char *filepath) { - return export_to_stage(params, depsgraph, filepath, nullptr, nullptr, nullptr); + wmJobWorkerStatus worker_status = {}; + return export_to_stage(params, depsgraph, filepath, &worker_status); } -static void export_startjob(void *customdata, - /* Cannot be const, this function implements wm_jobs_start_callback. - * NOLINTNEXTLINE: readability-non-const-parameter. */ - bool *stop, - bool *do_update, - float *progress) +static void export_startjob(void *customdata, wmJobWorkerStatus *worker_status) { ExportJobData *data = static_cast(customdata); data->export_ok = false; @@ -323,11 +313,11 @@ static void export_startjob(void *customdata, } BKE_scene_graph_update_tagged(data->depsgraph, data->bmain); - *progress = 0.0f; - *do_update = true; + worker_status->progress = 0.0f; + worker_status->do_update = true; pxr::UsdStageRefPtr usd_stage = export_to_stage( - data->params, data->depsgraph, data->unarchived_filepath, stop, do_update, progress); + data->params, data->depsgraph, data->unarchived_filepath, worker_status); if (!usd_stage) { /* This happens when the USD JSON files cannot be found. When that happens, * the USD library doesn't know it has the functionality to write USDA and @@ -344,15 +334,15 @@ static void export_startjob(void *customdata, bool usd_conversion_success = perform_usdz_conversion(data); if (!usd_conversion_success) { data->export_ok = false; - *progress = 1.0f; - *do_update = true; + worker_status->progress = 1.0f; + worker_status->do_update = true; return; } } data->export_ok = true; - *progress = 1.0f; - *do_update = true; + worker_status->progress = 1.0f; + worker_status->do_update = true; } static void export_endjob_usdz_cleanup(const ExportJobData *data) @@ -467,11 +457,8 @@ bool USD_export(bContext *C, WM_jobs_start(CTX_wm_manager(C), wm_job); } else { - /* Fake a job context, so that we don't need null pointer checks while exporting. */ - bool stop = false, do_update = false; - float progress = 0.0f; - - blender::io::usd::export_startjob(job, &stop, &do_update, &progress); + wmJobWorkerStatus worker_status = {}; + blender::io::usd::export_startjob(job, &worker_status); blender::io::usd::export_endjob(job); export_ok = job->export_ok; diff --git a/source/blender/io/usd/intern/usd_capi_import.cc b/source/blender/io/usd/intern/usd_capi_import.cc index f973e67ea63..6c0396e7b2a 100644 --- a/source/blender/io/usd/intern/usd_capi_import.cc +++ b/source/blender/io/usd/intern/usd_capi_import.cc @@ -146,13 +146,13 @@ static void report_job_duration(const ImportJobData *data) std::cout << '\n'; } -static void import_startjob(void *customdata, bool *stop, bool *do_update, float *progress) +static void import_startjob(void *customdata, wmJobWorkerStatus *worker_status) { ImportJobData *data = static_cast(customdata); - data->stop = stop; - data->do_update = do_update; - data->progress = progress; + data->stop = &worker_status->stop; + data->do_update = &worker_status->do_update; + data->progress = &worker_status->progress; data->was_canceled = false; data->archive = nullptr; data->start_time = timeit::Clock::now(); @@ -309,8 +309,8 @@ static void import_startjob(void *customdata, bool *stop, bool *do_update, float data->import_ok = !data->was_canceled; - *progress = 1.0f; - *do_update = true; + worker_status->progress = 1.0f; + worker_status->do_update = true; } static void import_endjob(void *customdata) @@ -459,11 +459,8 @@ bool USD_import(bContext *C, WM_jobs_start(CTX_wm_manager(C), wm_job); } else { - /* Fake a job context, so that we don't need null pointer checks while importing. */ - bool stop = false, do_update = false; - float progress = 0.0f; - - import_startjob(job, &stop, &do_update, &progress); + wmJobWorkerStatus worker_status = {}; + import_startjob(job, &worker_status); import_endjob(job); import_ok = job->import_ok; diff --git a/source/blender/sequencer/SEQ_proxy.h b/source/blender/sequencer/SEQ_proxy.h index 65e7afa85e4..50f4e977e54 100644 --- a/source/blender/sequencer/SEQ_proxy.h +++ b/source/blender/sequencer/SEQ_proxy.h @@ -21,6 +21,7 @@ struct Scene; struct SeqIndexBuildContext; struct SeqRenderData; struct Sequence; +struct wmJobWorkerStatus; bool SEQ_proxy_rebuild_context(struct Main *bmain, struct Depsgraph *depsgraph, @@ -29,10 +30,7 @@ bool SEQ_proxy_rebuild_context(struct Main *bmain, struct GSet *file_list, struct ListBase *queue, bool build_only_on_bad_performance); -void SEQ_proxy_rebuild(struct SeqIndexBuildContext *context, - bool *stop, - bool *do_update, - float *progress); +void SEQ_proxy_rebuild(struct SeqIndexBuildContext *context, wmJobWorkerStatus *worker_status); void SEQ_proxy_rebuild_finish(struct SeqIndexBuildContext *context, bool stop); void SEQ_proxy_set(struct Sequence *seq, bool value); bool SEQ_can_use_proxy(const struct SeqRenderData *context, struct Sequence *seq, int psize); diff --git a/source/blender/sequencer/intern/proxy.cc b/source/blender/sequencer/intern/proxy.cc index 585c5a49419..f2be0cd93a5 100644 --- a/source/blender/sequencer/intern/proxy.cc +++ b/source/blender/sequencer/intern/proxy.cc @@ -34,6 +34,8 @@ #include "DEG_depsgraph.hh" +#include "WM_types.hh" + #include "IMB_colormanagement.h" #include "IMB_imbuf.h" #include "IMB_imbuf_types.h" @@ -508,7 +510,7 @@ bool SEQ_proxy_rebuild_context(Main *bmain, return true; } -void SEQ_proxy_rebuild(SeqIndexBuildContext *context, bool *stop, bool *do_update, float *progress) +void SEQ_proxy_rebuild(SeqIndexBuildContext *context, wmJobWorkerStatus *worker_status) { const bool overwrite = context->overwrite; SeqRenderData render_context; @@ -519,7 +521,10 @@ void SEQ_proxy_rebuild(SeqIndexBuildContext *context, bool *stop, bool *do_updat if (seq->type == SEQ_TYPE_MOVIE) { if (context->index_context) { - IMB_anim_index_rebuild(context->index_context, stop, do_update, progress); + IMB_anim_index_rebuild(context->index_context, + &worker_status->stop, + &worker_status->do_update, + &worker_status->progress); } return; @@ -565,12 +570,12 @@ void SEQ_proxy_rebuild(SeqIndexBuildContext *context, bool *stop, bool *do_updat seq_proxy_build_frame(&render_context, &state, seq, timeline_frame, 100, overwrite); } - *progress = float(timeline_frame - SEQ_time_left_handle_frame_get(scene, seq)) / - (SEQ_time_right_handle_frame_get(scene, seq) - - SEQ_time_left_handle_frame_get(scene, seq)); - *do_update = true; + worker_status->progress = float(timeline_frame - SEQ_time_left_handle_frame_get(scene, seq)) / + (SEQ_time_right_handle_frame_get(scene, seq) - + SEQ_time_left_handle_frame_get(scene, seq)); + worker_status->do_update = true; - if (*stop || G.is_break) { + if (worker_status->stop || G.is_break) { break; } } diff --git a/source/blender/sequencer/intern/proxy_job.cc b/source/blender/sequencer/intern/proxy_job.cc index cc16cff18d1..49af62ad688 100644 --- a/source/blender/sequencer/intern/proxy_job.cc +++ b/source/blender/sequencer/intern/proxy_job.cc @@ -42,16 +42,16 @@ static void proxy_freejob(void *pjv) } /* Only this runs inside thread. */ -static void proxy_startjob(void *pjv, bool *stop, bool *do_update, float *progress) +static void proxy_startjob(void *pjv, wmJobWorkerStatus *worker_status) { ProxyJob *pj = static_cast(pjv); LISTBASE_FOREACH (LinkData *, link, &pj->queue) { SeqIndexBuildContext *context = static_cast(link->data); - SEQ_proxy_rebuild(context, stop, do_update, progress); + SEQ_proxy_rebuild(context, worker_status); - if (*stop) { + if (worker_status->stop) { pj->stop = true; fprintf(stderr, "Canceling proxy rebuild on users request...\n"); break; diff --git a/source/blender/windowmanager/WM_api.hh b/source/blender/windowmanager/WM_api.hh index 1b61772a1cd..7fd88d61468 100644 --- a/source/blender/windowmanager/WM_api.hh +++ b/source/blender/windowmanager/WM_api.hh @@ -52,6 +52,7 @@ struct wmGizmo; struct wmGizmoMap; struct wmGizmoMapType; struct wmJob; +struct wmJobWorkerStatus; struct wmOperator; struct wmOperatorType; struct wmPaintCursor; @@ -1514,10 +1515,7 @@ void WM_jobs_customdata_set(wmJob *, void *customdata, void (*free)(void *)); void WM_jobs_timer(wmJob *, double timestep, unsigned int note, unsigned int endnote); void WM_jobs_delay_start(wmJob *, double delay_time); -using wm_jobs_start_callback = void (*)(void *custom_data, - bool *stop, - bool *do_update, - float *progress); +using wm_jobs_start_callback = void (*)(void *custom_data, wmJobWorkerStatus *worker_status); void WM_jobs_callbacks(wmJob *, wm_jobs_start_callback startjob, void (*initjob)(void *), diff --git a/source/blender/windowmanager/WM_types.hh b/source/blender/windowmanager/WM_types.hh index acc34f54e90..fbcea9e0360 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -922,6 +922,34 @@ struct wmTimer { bool sleep; }; +/** Communication/status data owned by the wmJob, and passed to the worker code when calling + * `startjob` callback. + * + * 'OUTPUT' members mean that they are defined by the worker thread, and read/used by the wmJob + * management code from the main thread. And vice-versa for `INPUT' members. + * + * \warning There is currently no thread-safety or synchronization when accessing these values. + * This is fine as long as: + * - All members are independant of each other, value-wise. + * - Each member is 'simple enough' that accessing it or setting it can be considered as atomic. + * - There is no requirement of immediate synchronization of these values between the main + * controlling thread (i.e. wmJob management code) and the worker thread. + */ +struct wmJobWorkerStatus { + /** OUTPUT - Set to true by the worker to request update processing from the main thread (as part + * of the wmJob 'event loop', see #wm_jobs_timer). */ + bool do_update; + + /** INPUT - Set by the wmJob management code to request a worker to stop/abort its processing. + * + * \note Some job types (rendering or baking ones e.g.) also use the #Global.is_break flag to + * cancel their processing. */ + bool stop; + + /** OUTPUT - Progress as reported by the worker, from `0.0f` to `1.0f`. */ + float progress; +}; + struct wmOperatorType { /** Text for UI, undo (should not exceed #OP_MAX_TYPENAME). */ const char *name; diff --git a/source/blender/windowmanager/intern/wm_jobs.cc b/source/blender/windowmanager/intern/wm_jobs.cc index b10256be842..936ab5dadc6 100644 --- a/source/blender/windowmanager/intern/wm_jobs.cc +++ b/source/blender/windowmanager/intern/wm_jobs.cc @@ -112,8 +112,9 @@ struct wmJob { eWM_JobFlag flag; bool suspended, running, ready; eWM_JobType job_type; - bool do_update, stop; - float progress; + + /** Data shared with the worker code, so can be accessed and edited from several threads. */ + wmJobWorkerStatus worker_status; /** For display in header, identification */ char name[128]; @@ -239,7 +240,7 @@ float WM_jobs_progress(const wmWindowManager *wm, const void *owner) const wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); if (wm_job && wm_job->flag & WM_JOB_PROGRESS) { - return wm_job->progress; + return wm_job->worker_status.progress; } return 0.0; @@ -255,7 +256,7 @@ static void wm_jobs_update_progress_bars(wmWindowManager *wm) if (wm_job->flag & WM_JOB_PROGRESS) { /* accumulate global progress for running jobs */ jobs_progress++; - total_progress += wm_job->progress; + total_progress += wm_job->worker_status.progress; } } } @@ -316,7 +317,7 @@ bool WM_jobs_is_running(const wmJob *wm_job) bool WM_jobs_is_stopped(const wmWindowManager *wm, const void *owner) { wmJob *wm_job = wm_job_find(wm, owner, WM_JOB_TYPE_ANY); - return wm_job ? wm_job->stop : true; /* XXX to be redesigned properly. */ + return wm_job ? wm_job->worker_status.stop : true; /* XXX to be redesigned properly. */ } void *WM_jobs_customdata_get(wmJob *wm_job) @@ -339,7 +340,7 @@ void WM_jobs_customdata_set(wmJob *wm_job, void *customdata, void (*free)(void * if (wm_job->running) { /* signal job to end */ - wm_job->stop = true; + wm_job->worker_status.stop = true; } } @@ -384,7 +385,7 @@ static void *do_job_thread(void *job_v) { wmJob *wm_job = static_cast(job_v); - wm_job->startjob(wm_job->run_customdata, &wm_job->stop, &wm_job->do_update, &wm_job->progress); + wm_job->startjob(wm_job->run_customdata, &wm_job->worker_status); wm_job->ready = true; return nullptr; @@ -426,7 +427,7 @@ static void wm_jobs_test_suspend_stop(wmWindowManager *wm, wmJob *test) /* if this job has higher priority, stop others */ if (test->flag & WM_JOB_PRIORITY) { - wm_job->stop = true; + wm_job->worker_status.stop = true; // printf("job stopped: %s\n", wm_job->name); } } @@ -445,7 +446,7 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job) { if (wm_job->running) { /* signal job to end and restart */ - wm_job->stop = true; + wm_job->worker_status.stop = true; // printf("job started a running job, ending... %s\n", wm_job->name); } else { @@ -468,9 +469,9 @@ void WM_jobs_start(wmWindowManager *wm, wmJob *wm_job) wm_job->initjob(wm_job->run_customdata); } - wm_job->stop = false; + wm_job->worker_status.stop = false; wm_job->ready = false; - wm_job->progress = 0.0; + wm_job->worker_status.progress = 0.0; // printf("job started: %s\n", wm_job->name); @@ -505,7 +506,7 @@ static void wm_job_end(wmJob *wm_job) /* Do the final callback based on whether the job was run to completion or not. * Not all jobs have the same way of signaling cancellation (i.e. rendering stops when * `G.is_break == true`, but doesn't set any wm_job properties to cancel the WM job). */ - const bool was_canceled = wm_job->stop || G.is_break; + const bool was_canceled = wm_job->worker_status.stop || G.is_break; void (*final_callback)(void *) = (wm_job->ready && !was_canceled) ? wm_job->completed : wm_job->canceled; if (final_callback) { @@ -528,7 +529,7 @@ static void wm_jobs_kill_job(wmWindowManager *wm, wmJob *wm_job) if (wm_job->running) { /* signal job to end */ - wm_job->stop = true; + wm_job->worker_status.stop = true; WM_job_main_thread_lock_release(wm_job); BLI_threadpool_end(&wm_job->threads); @@ -594,7 +595,7 @@ void WM_jobs_stop(wmWindowManager *wm, const void *owner, wm_jobs_start_callback LISTBASE_FOREACH (wmJob *, wm_job, &wm->jobs) { if (wm_job->owner == owner || wm_job->startjob == startjob) { if (wm_job->running) { - wm_job->stop = true; + wm_job->worker_status.stop = true; } } } @@ -628,7 +629,7 @@ void wm_jobs_timer(wmWindowManager *wm, wmTimer *wt) wm_job_main_thread_yield(wm_job); /* always call note and update when ready */ - if (wm_job->do_update || wm_job->ready) { + if (wm_job->worker_status.do_update || wm_job->ready) { if (wm_job->update) { wm_job->update(wm_job->run_customdata); } @@ -639,7 +640,7 @@ void wm_jobs_timer(wmWindowManager *wm, wmTimer *wt) if (wm_job->flag & WM_JOB_PROGRESS) { WM_event_add_notifier_ex(wm, wm_job->win, NC_WM | ND_JOB, nullptr); } - wm_job->do_update = false; + wm_job->worker_status.do_update = false; } if (wm_job->ready) { -- 2.30.2