diff options
author | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-07-01 18:35:09 +0400 |
---|---|---|
committer | Tamito Kajiyama <rd6t-kjym@asahi-net.or.jp> | 2014-07-01 18:36:53 +0400 |
commit | 6c6fa749f6ee0ff7941696973b4b378a321e5709 (patch) | |
tree | e8351585d7e0737e7f6cc55f72f280d71b4346c9 /source/blender/render | |
parent | 61e5f81e37d5365ebb9da49ea9b6f62f4110d054 (diff) |
Second attempt to fix T40833: Crash when rendering with freestyle.
The cause of the crash was identified in an uninitialized member variable
`Main->lock`. Now that struct Main has a few member variables whose
values are dynamically allocated, per-render Freestyle-specific Main data
structures will be allocated and released using `BKE_main_new()` and
`BKE_main_free()`, respectively.
This revision complements the commit rB6135556f4556.
Diffstat (limited to 'source/blender/render')
-rw-r--r-- | source/blender/render/intern/include/render_types.h | 2 | ||||
-rw-r--r-- | source/blender/render/intern/source/pipeline.c | 29 |
2 files changed, 23 insertions, 8 deletions
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h index eeb0544cf73..d16fe6fd691 100644 --- a/source/blender/render/intern/include/render_types.h +++ b/source/blender/render/intern/include/render_types.h @@ -240,7 +240,7 @@ struct Render ListBase volumes; #ifdef WITH_FREESTYLE - struct Main freestyle_bmain; + struct Main *freestyle_bmain; ListBase freestyle_renders; #endif diff --git a/source/blender/render/intern/source/pipeline.c b/source/blender/render/intern/source/pipeline.c index 9f27021d23e..676e28ca940 100644 --- a/source/blender/render/intern/source/pipeline.c +++ b/source/blender/render/intern/source/pipeline.c @@ -61,6 +61,7 @@ #include "BKE_depsgraph.h" #include "BKE_global.h" #include "BKE_image.h" +#include "BKE_library.h" #include "BKE_main.h" #include "BKE_modifier.h" #include "BKE_node.h" @@ -1822,11 +1823,13 @@ static void tag_scenes_for_render(Render *re) } #ifdef WITH_FREESTYLE - for (sce = re->freestyle_bmain.scene.first; sce; sce = sce->id.next) { - sce->id.flag &= ~LIB_DOIT; + if (re->freestyle_bmain) { + for (sce = re->freestyle_bmain->scene.first; sce; sce = sce->id.next) { + sce->id.flag &= ~LIB_DOIT; #ifdef DEPSGRAPH_WORKAROUND_HACK - tag_dependend_objects_for_render(sce, renderlay); + tag_dependend_objects_for_render(sce, renderlay); #endif + } } #endif @@ -1928,6 +1931,8 @@ static void add_freestyle(Render *re, int render) actsrl = BLI_findlink(&re->r.layers, re->r.actlay); + re->freestyle_bmain = BKE_main_new(); + /* We use the same window manager for freestyle bmain as * real bmain uses. This is needed because freestyle's * bmain could be used to tag scenes for update, which @@ -1935,7 +1940,7 @@ static void add_freestyle(Render *re, int render) * and that function requires proper window manager * to present (sergey) */ - re->freestyle_bmain.wm = re->main->wm; + re->freestyle_bmain->wm = re->main->wm; FRS_init_stroke_rendering(re); @@ -2000,10 +2005,18 @@ static void free_all_freestyle_renders(void) if (freestyle_render) { freestyle_scene = freestyle_render->scene; RE_FreeRender(freestyle_render); - BKE_scene_unlink(&re1->freestyle_bmain, freestyle_scene, NULL); + BKE_scene_unlink(re1->freestyle_bmain, freestyle_scene, NULL); } } BLI_freelistN(&re1->freestyle_renders); + + /* detach the window manager from freestyle bmain (see comments in + * add_freestyle() for more detail) + */ + re1->freestyle_bmain->wm.first = re1->freestyle_bmain->wm.last = NULL; + + BKE_main_free(re1->freestyle_bmain); + re1->freestyle_bmain = NULL; } } #endif @@ -2154,8 +2167,10 @@ void RE_MergeFullSample(Render *re, Main *bmain, Scene *sce, bNodeTree *ntree) scene->id.flag |= LIB_DOIT; #ifdef WITH_FREESTYLE - for (scene = re->freestyle_bmain.scene.first; scene; scene = scene->id.next) - scene->id.flag &= ~LIB_DOIT; + if (re->freestyle_bmain) { + for (scene = re->freestyle_bmain->scene.first; scene; scene = scene->id.next) + scene->id.flag &= ~LIB_DOIT; + } #endif for (node = ntree->nodes.first; node; node = node->next) { |