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.

Pull Request: https://projects.blender.org/blender/blender/pulls/113343
This commit is contained in:
Bastien Montagne 2023-10-06 13:06:02 +02:00 committed by Gitea
parent f318f15eaa
commit df0d7c9c3d
42 changed files with 316 additions and 359 deletions

View File

@ -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);
}
}

View File

@ -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

View File

@ -344,9 +344,10 @@ void EEVEE_NEXT_lightbake_update(void *job_data)
static_cast<LightBake *>(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<LightBake *>(job_data)->run(stop, do_update, progress);
static_cast<LightBake *>(job_data)->run(
&worker_status->stop, &worker_status->do_update, &worker_status->progress);
}
/** \} */

View File

@ -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);
/** \} */

View File

@ -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;

View File

@ -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<TraceJob *>(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);
}

View File

@ -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;

View File

@ -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<MultiresBakeJob *>(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;

View File

@ -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<Object *>(link->ptr.data), target, reports)) {
scene, view_layer, static_cast<Object *>(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);

View File

@ -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<CalculateSimulationJob *>(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<ObjectBakeData> 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<BakeSimulationJob *>(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)

View File

@ -185,7 +185,8 @@ ModifierData *ED_object_modifier_add(
md = static_cast<ModifierData *>(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<KeyBlock *>(
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<float(*)[3]>(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<OceanBakeJob *>(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)

View File

@ -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<QuadriFlowJob *>(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<Mesh *>(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);
}

View File

@ -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<DynamicPaintBakeJob *>(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;
}
/*

View File

@ -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<FluidJob *>(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<FluidJob *>(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);

View File

@ -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<PointCacheJob *>(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)

View File

@ -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<RenderJob *>(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);

View File

@ -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<ShaderPreview *>(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<ShaderPreview>("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<PreviewLoadJob *>(customdata);
@ -1804,7 +1797,7 @@ void PreviewLoadJob::run_fn(void *customdata, bool *stop, bool *do_update, float
while (RequestedPreview *request = static_cast<RequestedPreview *>(
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);

View File

@ -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);

View File

@ -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<PrefetchJob *>(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");

View File

@ -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<ProxyJob *>(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);
}
}

View File

@ -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;
}

View File

@ -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;

View File

@ -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<FileListReadJob *>(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);

View File

@ -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<FSMenu *>(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;
}
}
}

View File

@ -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;

View File

@ -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<ShaderNodesPreviewJob *>(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;

View File

@ -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;

View File

@ -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<PreviewJob *>(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);
}

View File

@ -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<SeqIndexBuildContext *>(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);

View File

@ -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<ThumbnailDrawJob *>(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<Sequence *>(BLI_ghashIterator_getKey(&gh_iter));
ThumbDataItem *val = static_cast<ThumbDataItem *>(
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<Sequence *>(BLI_ghashIterator_getKey(&gh_iter));
ThumbDataItem *val = static_cast<ThumbDataItem *>(
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);

View File

@ -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<UVPackIslandsData *>(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;
}

View File

@ -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);

View File

@ -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<ExportJobData *>(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;

View File

@ -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<ImportJobData *>(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;

View File

@ -203,9 +203,7 @@ static bool perform_usdz_conversion(const ExportJobData *data)
static pxr::UsdStageRefPtr export_to_stage(const USDExportParams &params,
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 &params,
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 &params,
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 &params,
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<ExportJobData *>(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;

View File

@ -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<ImportJobData *>(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;

View File

@ -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);

View File

@ -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;
}
}

View File

@ -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<ProxyJob *>(pjv);
LISTBASE_FOREACH (LinkData *, link, &pj->queue) {
SeqIndexBuildContext *context = static_cast<SeqIndexBuildContext *>(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;

View File

@ -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 *),

View File

@ -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;

View File

@ -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<wmJob *>(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) {