WM Jobs: Refactor all worker status variables into a single shared struct. #113343

Merged
Bastien Montagne merged 1 commits from mont29/blender:tmp-wmjobs into main 2023-10-09 12:12:30 +02:00
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

@ -922,6 +922,34 @@ struct wmTimer {
bool sleep;
};
/** Communication/status data owned by the wmJob, and passed to the worker code when calling
* `startjob` callback.
*
* 'OUTPUT' members mean that they are defined by the worker thread, and read/used by the wmJob
* management code from the main thread. And vice-versa for `INPUT' members.
*
* \warning There is currently no thread-safety or synchronization when accessing these values.
* This is fine as long as:
* - All members are independant of each other, value-wise.
* - Each member is 'simple enough' that accessing it or setting it can be considered as atomic.
* - There is no requirement of immediate synchronization of these values between the main
* controlling thread (i.e. wmJob management code) and the worker thread.
*/
struct wmJobWorkerStatus {
/** OUTPUT - Set to true by the worker to request update processing from the main thread (as part
* of the wmJob 'event loop', see #wm_jobs_timer). */
bool do_update;
/** INPUT - Set by the wmJob management code to request a worker to stop/abort its processing.
*
* \note Some job types (rendering or baking ones e.g.) also use the #Global.is_break flag to
* cancel their processing. */
bool stop;
/** OUTPUT - Progress as reported by the worker, from `0.0f` to `1.0f`. */
float progress;
};
struct wmOperatorType {
/** Text for UI, undo (should not exceed #OP_MAX_TYPENAME). */
const char *name;

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) {