[Bf-blender-cvs] [0e163be] multiview: Sequencer, scene render (work in progress)

Dalai Felinto noreply at git.blender.org
Thu Oct 16 22:23:48 CEST 2014


Commit: 0e163beaf1b0b85249716dfe2c865177db28b0cd
Author: Dalai Felinto
Date:   Thu Oct 16 17:19:53 2014 -0300
Branches: multiview
https://developer.blender.org/rB0e163beaf1b0b85249716dfe2c865177db28b0cd

Sequencer, scene render (work in progress)

Rendering crashes after a few attempts (or a few frames when rendering a
sequencer). It seems memory related.

The overall problem is that the re->result is not consistent across the
entire render session it seems. Still investigating.

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

M	source/blender/render/intern/source/pipeline.c
M	source/blender/render/intern/source/render_result.c

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

diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 8dbe80b..bd4eea5 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -2502,12 +2502,12 @@ int RE_seq_render_active(Scene *scene, RenderData *rd)
 static void do_render_seq(Render *re)
 {
 	static int recurs_depth = 0;
-	struct ImBuf *ibuf, *out;
+	struct ImBuf *out;
 	RenderResult *rr; /* don't assign re->result here as it might change during give_ibuf_seq */
 	int cfra = re->r.cfra;
 	SeqRenderData context;
-	size_t view_id;
-	RenderView *rv;
+	size_t view_id, tot_views;
+	struct ImBuf **ibuf;
 
 	re->i.cfra = cfra;
 
@@ -2531,39 +2531,45 @@ static void do_render_seq(Render *re)
 
 	rr = re->result;
 
-	BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
-	render_result_views_new(rr, &re->r);
-	BLI_rw_mutex_unlock(&re->resultmutex);
+	tot_views = BKE_scene_num_views(&re->r);
+	ibuf= MEM_mallocN(sizeof(ImBuf *) * tot_views, "Sequencer Views ImBufs");
 
-	for (view_id = 0, rv = (RenderView *) rr->views.first; rv; rv = rv->next, view_id++) {
-		RE_SetActiveRenderView(re, rv->name);
-		context.view_id = view_id;
+	/* the renderresult gets destroyed during the rendering, so we first collect all ibufs
+	 * and then we populate the final renderesult */
 
+	for (view_id = 0; view_id < tot_views; view_id++) {
+		context.view_id = view_id;
 		out = BKE_sequencer_give_ibuf(&context, cfra, 0);
 
 		if (out) {
-			ibuf = IMB_dupImBuf(out);
+			ibuf[view_id] = IMB_dupImBuf(out);
 			IMB_freeImBuf(out);
-			BKE_sequencer_imbuf_from_sequencer_space(re->scene, ibuf);
+			BKE_sequencer_imbuf_from_sequencer_space(re->scene, ibuf[view_id]);
 		}
 		else {
-			ibuf = NULL;
+			ibuf[view_id] = NULL;
 		}
+	}
 
-		recurs_depth--;
+	BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
+	rr->views.first = rr->views.last = NULL;
+	render_result_views_new(rr, &re->r);
+	BLI_rw_mutex_unlock(&re->resultmutex);
 
+	for (view_id = 0; view_id < tot_views; view_id++) {
+		RenderView *rv = BLI_findlink(&rr->views, view_id);
 		BLI_rw_mutex_lock(&re->resultmutex, THREAD_LOCK_WRITE);
 
-		if (ibuf) {
+		if (ibuf[view_id]) {
 			/* copy ibuf into combined pixel rect */
-			render_result_rect_from_ibuf(rr, &re->r, ibuf, view_id);
+			render_result_rect_from_ibuf(rr, &re->r, ibuf[view_id], view_id);
 
 			if (recurs_depth == 0) { /* with nested scenes, only free on toplevel... */
 				Editing *ed = re->scene->ed;
 				if (ed)
 					BKE_sequencer_free_imbuf(re->scene, &ed->seqbase, true);
 			}
-			IMB_freeImBuf(ibuf);
+			IMB_freeImBuf(ibuf[view_id]);
 		}
 		else {
 			/* render result is delivered empty in most cases, nevertheless we handle all cases */
@@ -2573,9 +2579,13 @@ static void do_render_seq(Render *re)
 		BLI_rw_mutex_unlock(&re->resultmutex);
 
 		/* would mark display buffers as invalid */
-		re->display_update(re->duh, re->result, NULL, re->viewname);
+		re->display_update(re->duh, re->result, NULL, rv->name);
 	}
 
+	MEM_freeN(ibuf);
+
+	recurs_depth--;
+
 	/* just in case this flag went missing at some point */
 	re->r.scemode |= R_DOSEQ;
 
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index 49432f3..217b03b 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -68,12 +68,15 @@ static void render_result_views_free(RenderResult *res)
 		RenderView *rv = res->views.first;
 		BLI_remlink(&res->views, rv);
 
-		if (rv->rectf)
-			MEM_freeN(rv->rectf);
+		if (rv->rect32)
+			MEM_freeN(rv->rect32);
 
 		if (rv->rectz)
 			MEM_freeN(rv->rectz);
 
+		if (rv->rectf)
+			MEM_freeN(rv->rectf);
+
 		MEM_freeN(rv);
 	}
 }
@@ -877,12 +880,9 @@ RenderResult *render_result_new_from_exr(void *exrhandle, const char *colorspace
 	RenderLayer *rl;
 	RenderPass *rpass;
 	const char *to_colorspace = IMB_colormanagement_role_colorspace_name_get(COLOR_ROLE_SCENE_LINEAR);
-	int i;
 
 	rr->rectx = rectx;
 	rr->recty = recty;
-
-	for(i=0; i < BLI_countlist(&rr->views);i++);
 	
 	IMB_exr_multilayer_convert(exrhandle, rr, ml_addview_cb, ml_addlayer_cb, ml_addpass_cb);




More information about the Bf-blender-cvs mailing list