[Bf-blender-cvs] [b62c2a9] master: Fix T39985: crash while rendering a scene with compositing nodes using another scene

Sergey Sharybin noreply at git.blender.org
Fri May 2 14:54:22 CEST 2014


Commit: b62c2a913bb41f858371594dfab0448bddb773d0
Author: Sergey Sharybin
Date:   Fri May 2 14:52:19 2014 +0200
https://developer.blender.org/rBb62c2a913bb41f858371594dfab0448bddb773d0

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.

===================================================================

M	source/blender/editors/render/render_internal.c
M	source/blender/render/extern/include/RE_pipeline.h
M	source/blender/render/intern/include/render_types.h
M	source/blender/render/intern/source/envmap.c
M	source/blender/render/intern/source/pipeline.c

===================================================================

diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index 73d52dc..9fa3128 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 6d994b3..031d6b5 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 cfebdde..eeb0544 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 52ebfd0..28b2926 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 36945e7..232f9db 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();




More information about the Bf-blender-cvs mailing list