WM Jobs: Refactor all worker status variables into a single shared struct. #113343
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -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);
|
||||
|
||||
/** \} */
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -203,9 +203,7 @@ static bool perform_usdz_conversion(const ExportJobData *data)
|
|||
static pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms,
|
||||
Depsgraph *depsgraph,
|
||||
const char *filepath,
|
||||
bool *stop,
|
||||
bool *do_update,
|
||||
float *progress)
|
||||
wmJobWorkerStatus *worker_status)
|
||||
{
|
||||
pxr::UsdStageRefPtr usd_stage = pxr::UsdStage::CreateNew(filepath);
|
||||
if (!usd_stage) {
|
||||
|
@ -242,7 +240,7 @@ static pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms,
|
|||
float progress_per_frame = 1.0f / std::max(1, (scene->r.efra - scene->r.sfra + 1));
|
||||
|
||||
for (float frame = scene->r.sfra; frame <= scene->r.efra; frame++) {
|
||||
if (G.is_break || (stop != nullptr && *stop)) {
|
||||
if (G.is_break || worker_status->stop) {
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -254,12 +252,8 @@ static pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms,
|
|||
iter.set_export_frame(frame);
|
||||
iter.iterate_and_write();
|
||||
|
||||
if (progress) {
|
||||
*progress += progress_per_frame;
|
||||
}
|
||||
if (do_update) {
|
||||
*do_update = true;
|
||||
}
|
||||
worker_status->progress += progress_per_frame;
|
||||
worker_status->do_update = true;
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
@ -294,15 +288,11 @@ pxr::UsdStageRefPtr export_to_stage(const USDExportParams ¶ms,
|
|||
Depsgraph *depsgraph,
|
||||
const char *filepath)
|
||||
{
|
||||
return export_to_stage(params, depsgraph, filepath, nullptr, nullptr, nullptr);
|
||||
wmJobWorkerStatus worker_status = {};
|
||||
return export_to_stage(params, depsgraph, filepath, &worker_status);
|
||||
}
|
||||
|
||||
static void export_startjob(void *customdata,
|
||||
/* Cannot be const, this function implements wm_jobs_start_callback.
|
||||
* NOLINTNEXTLINE: readability-non-const-parameter. */
|
||||
bool *stop,
|
||||
bool *do_update,
|
||||
float *progress)
|
||||
static void export_startjob(void *customdata, wmJobWorkerStatus *worker_status)
|
||||
{
|
||||
ExportJobData *data = static_cast<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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 *),
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in New Issue