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 3dc4a83de6e..9c8f3f2670d 100644 --- a/source/blender/windowmanager/WM_types.hh +++ b/source/blender/windowmanager/WM_types.hh @@ -917,6 +917,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) {