[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