1
1

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.
This commit is contained in:
2014-05-02 14:52:19 +02:00
parent 1552b56d9c
commit b62c2a913b
5 changed files with 29 additions and 1 deletions

View File

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

View File

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

View File

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

View File

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

View File

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