From b62c2a913bb41f858371594dfab0448bddb773d0 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 2 May 2014 14:52:19 +0200 Subject: [PATCH] Fix T39985: crash while rendering a scene with compositing nodes using another scene The issue was caused by the wrong scene used to acquire render result for. Now made it so render pipeline reports currently rendering scene to the job via special callback. This also solves missing tile highlight issue when rendering multiple scenes in the compositor. --- source/blender/editors/render/render_internal.c | 12 +++++++++++- source/blender/render/extern/include/RE_pipeline.h | 1 + source/blender/render/intern/include/render_types.h | 2 ++ source/blender/render/intern/source/envmap.c | 2 ++ source/blender/render/intern/source/pipeline.c | 13 +++++++++++++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c index 73d52dc5782..9fa312884da 100644 --- a/source/blender/editors/render/render_internal.c +++ b/source/blender/editors/render/render_internal.c @@ -95,6 +95,7 @@ static int render_break(void *rjv); typedef struct RenderJob { Main *main; Scene *scene; + Scene *current_scene; Render *re; SceneRenderLayer *srl; struct Object *camera_override; @@ -562,6 +563,13 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec BKE_image_release_ibuf(ima, ibuf, lock); } +static void current_scene_update(void *rjv, Scene *scene) +{ + RenderJob *rj = rjv; + rj->current_scene = scene; + rj->iuser.scene = scene; +} + static void render_startjob(void *rjv, short *stop, short *do_update, float *progress) { RenderJob *rj = rjv; @@ -866,6 +874,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even rj = MEM_callocN(sizeof(RenderJob), "render job"); rj->main = mainp; rj->scene = scene; + rj->current_scene = rj->scene; rj->srl = srl; rj->camera_override = camera_override; rj->lay_override = 0; @@ -938,6 +947,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, const wmEvent *even RE_test_break_cb(re, rj, render_breakjob); RE_draw_lock_cb(re, rj, render_drawlock); RE_display_update_cb(re, rj, image_rect_update); + RE_current_scene_update_cb(re, rj, current_scene_update); RE_stats_draw_cb(re, rj, image_renderinfo_cb); RE_progress_cb(re, rj, render_progress_update); @@ -1481,7 +1491,7 @@ Scene *ED_render_job_get_scene(const bContext *C) RenderJob *rj = (RenderJob *)WM_jobs_customdata_from_type(wm, WM_JOB_TYPE_RENDER); if (rj) - return rj->scene; + return rj->current_scene; return NULL; } diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h index 6d994b36f26..031d6b5a51a 100644 --- a/source/blender/render/extern/include/RE_pipeline.h +++ b/source/blender/render/extern/include/RE_pipeline.h @@ -257,6 +257,7 @@ void RE_stats_draw_cb (struct Render *re, void *handle, void (*f)(void *handle, void RE_progress_cb (struct Render *re, void *handle, void (*f)(void *handle, float)); void RE_draw_lock_cb (struct Render *re, void *handle, void (*f)(void *handle, int)); void RE_test_break_cb (struct Render *re, void *handle, int (*f)(void *handle)); +void RE_current_scene_update_cb(struct Render *re, void *handle, void (*f)(void *handle, struct Scene *scene)); /* should move to kernel once... still unsure on how/where */ float RE_filter_value(int type, float x); diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index cfebddeba7c..eeb0544cf73 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -256,6 +256,8 @@ struct Render void *dch; void (*display_update)(void *handle, RenderResult *rr, volatile rcti *rect); void *duh; + void (*current_scene_update)(void *handle, struct Scene *scene); + void *suh; void (*stats_draw)(void *handle, RenderStats *ri); void *sdh; diff --git a/source/blender/render/intern/source/envmap.c b/source/blender/render/intern/source/envmap.c index 52ebfd07a54..28b29261e4e 100644 --- a/source/blender/render/intern/source/envmap.c +++ b/source/blender/render/intern/source/envmap.c @@ -167,6 +167,8 @@ static Render *envmap_render_copy(Render *re, EnvMap *env) envre->duh = re->duh; envre->test_break = re->test_break; envre->tbh = re->tbh; + envre->current_scene_update = re->current_scene_update; + envre->suh = re->suh; /* and for the evil stuff; copy the database... */ envre->totvlak = re->totvlak; diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 36945e7081e..232f9db1c65 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -142,6 +142,7 @@ static int thread_break(void *UNUSED(arg)) /* default callbacks, set in each new render */ static void result_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr)) {} static void result_rcti_nothing(void *UNUSED(arg), RenderResult *UNUSED(rr), volatile struct rcti *UNUSED(rect)) {} +static void current_scene_nothing(void *UNUSED(arg), Scene *UNUSED(scene)) {} static void stats_nothing(void *UNUSED(arg), RenderStats *UNUSED(rs)) {} static void float_nothing(void *UNUSED(arg), float UNUSED(val)) {} static int default_break(void *UNUSED(arg)) { return G.is_break == true; } @@ -393,6 +394,7 @@ void RE_InitRenderCB(Render *re) re->display_init = result_nothing; re->display_clear = result_nothing; re->display_update = result_rcti_nothing; + re->current_scene_update = current_scene_nothing; re->progress = float_nothing; re->test_break = default_break; if (G.background) @@ -737,6 +739,11 @@ void RE_display_update_cb(Render *re, void *handle, void (*f)(void *handle, Rend re->display_update = f; re->duh = handle; } +void RE_current_scene_update_cb(Render *re, void *handle, void (*f)(void *handle, Scene *scene)) +{ + re->current_scene_update = f; + re->suh = handle; +} void RE_stats_draw_cb(Render *re, void *handle, void (*f)(void *handle, RenderStats *rs)) { re->stats_draw = f; @@ -1188,6 +1195,8 @@ static void do_render_3d(Render *re) { int cfra_backup; + re->current_scene_update(re->suh, re->scene); + /* try external */ if (RE_engine_render(re, 0)) return; @@ -1593,6 +1602,8 @@ static void render_scene(Render *re, Scene *sce, int cfra) resc->tbh = re->tbh; resc->stats_draw = re->stats_draw; resc->sdh = re->sdh; + resc->current_scene_update = re->current_scene_update; + resc->suh = re->suh; do_render_fields_blur_3d(resc); } @@ -2293,6 +2304,8 @@ static void do_render_seq(Render *re) /* main loop: doing sequence + fields + blur + 3d render + compositing */ static void do_render_all_options(Render *re) { + re->current_scene_update(re->suh, re->scene); + BKE_scene_camera_switch_update(re->scene); re->i.starttime = PIL_check_seconds_timer();