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:
authorTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2014-07-01 18:35:09 +0400
committerTamito Kajiyama <rd6t-kjym@asahi-net.or.jp>2014-07-01 18:36:53 +0400
commit6c6fa749f6ee0ff7941696973b4b378a321e5709 (patch)
treee8351585d7e0737e7f6cc55f72f280d71b4346c9 /source/blender/render
parent61e5f81e37d5365ebb9da49ea9b6f62f4110d054 (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.h2
-rw-r--r--source/blender/render/intern/source/pipeline.c29
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) {