Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-11-03 14:14:02 +0300
committerCampbell Barton <ideasman42@gmail.com>2010-11-03 14:14:02 +0300
commit1f2469d9925ee5701375ffec75d50f8c5601b552 (patch)
treefb9364878789ee41d08a60008184e04ed816f001 /source/blender
parentc31536fc534156559fb19d008323b28a3dc4ef5f (diff)
bugfix [#24508] Render and changing scenes crashes.
The scenes 'Render' is kept by blender while blender runs but the callbacks were not cleared when the render was done. In this case the callback would reference a freed render job. This isn't normally a problem because on re-rendering new callbacks are set, however the sequencer can render a previously rendered scene without setting up callbacks. Simple fix is to to dummy callbacks applied onto the scenes 'Render' struct once its finished.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/editors/render/render_internal.c6
-rw-r--r--source/blender/render/extern/include/RE_pipeline.h3
-rw-r--r--source/blender/render/intern/source/pipeline.c17
3 files changed, 20 insertions, 6 deletions
diff --git a/source/blender/editors/render/render_internal.c b/source/blender/editors/render/render_internal.c
index b875de8f8bc..40aba913efe 100644
--- a/source/blender/editors/render/render_internal.c
+++ b/source/blender/editors/render/render_internal.c
@@ -573,7 +573,11 @@ static void render_startjob(void *rjv, short *stop, short *do_update, float *pro
static void render_endjob(void *rjv)
{
- RenderJob *rj= rjv;
+ RenderJob *rj= rjv;
+
+ /* this render may be used again by the sequencer without the active 'Render' where the callbacks
+ * would be re-assigned. assign dummy callbacks to avoid referencing freed renderjobs bug [#24508] */
+ RE_InitRenderCB(rj->re);
if(rj->main != G.main)
free_main(rj->main);
diff --git a/source/blender/render/extern/include/RE_pipeline.h b/source/blender/render/extern/include/RE_pipeline.h
index faa14231584..3b26b673c5d 100644
--- a/source/blender/render/extern/include/RE_pipeline.h
+++ b/source/blender/render/extern/include/RE_pipeline.h
@@ -159,6 +159,9 @@ struct Render *RE_GetRender(const char *name);
/* returns 1 while render is working (or renders called from within render) */
int RE_RenderInProgress(struct Render *re);
+/* assign default dummy callbacks */
+void RE_InitRenderCB(struct Render *re);
+
/* use free render as signal to do everything over (previews) */
void RE_FreeRender (struct Render *re);
/* only called on exit */
diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c
index 1b08f9adfab..9f4f146e15f 100644
--- a/source/blender/render/intern/source/pipeline.c
+++ b/source/blender/render/intern/source/pipeline.c
@@ -1158,6 +1158,18 @@ Render *RE_NewRender(const char *name)
BLI_rw_mutex_init(&re->resultmutex);
}
+ RE_InitRenderCB(re);
+
+ /* init some variables */
+ re->ycor= 1.0f;
+
+ return re;
+}
+
+/* called for new renders and when finishing rendering so
+ * we calways have valid callbacks on a render */
+void RE_InitRenderCB(Render *re)
+{
/* set default empty callbacks */
re->display_init= result_nothing;
re->display_clear= result_nothing;
@@ -1171,11 +1183,6 @@ Render *RE_NewRender(const char *name)
re->stats_draw= stats_nothing;
/* clear callback handles */
re->dih= re->dch= re->ddh= re->sdh= re->prh= re->tbh= re->erh= NULL;
-
- /* init some variables */
- re->ycor= 1.0f;
-
- return re;
}
/* only call this while you know it will remove the link too */