[Bf-blender-cvs] [6c6fa74] master: Second attempt to fix T40833: Crash when rendering with freestyle.

Tamito Kajiyama noreply at git.blender.org
Tue Jul 1 16:37:18 CEST 2014


Commit: 6c6fa749f6ee0ff7941696973b4b378a321e5709
Author: Tamito Kajiyama
Date:   Tue Jul 1 23:35:09 2014 +0900
https://developer.blender.org/rB6c6fa749f6ee0ff7941696973b4b378a321e5709

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.

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

M	source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
M	source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
M	source/blender/render/intern/include/render_types.h
M	source/blender/render/intern/source/pipeline.c

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

diff --git a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
index f135f2e..845eaaa 100644
--- a/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
+++ b/source/blender/freestyle/intern/blender_interface/BlenderStrokeRenderer.cpp
@@ -58,7 +58,7 @@ namespace Freestyle {
 
 BlenderStrokeRenderer::BlenderStrokeRenderer(Render *re, int render_count) : StrokeRenderer()
 {
-	freestyle_bmain = &re->freestyle_bmain;
+	freestyle_bmain = re->freestyle_bmain;
 
 	// for stroke mesh generation
 	_width = re->winx;
diff --git a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
index 9474ce7..9c2b5a4 100644
--- a/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
+++ b/source/blender/freestyle/intern/blender_interface/FRS_freestyle.cpp
@@ -577,7 +577,7 @@ void FRS_init_stroke_rendering(Render *re)
 
 Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl, int render)
 {
-	Main bmain = {0};
+	Main *freestyle_bmain = re->freestyle_bmain;
 	Render *freestyle_render = NULL;
 	Text *text, *next_text;
 
@@ -599,7 +599,7 @@ Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl, int render)
 	//   - add style modules
 	//   - set parameters
 	//   - compute view map
-	prepare(&bmain, re, srl);
+	prepare(freestyle_bmain, re, srl);
 
 	if (re->test_break(re->tbh)) {
 		controller->CloseFile();
@@ -628,11 +628,11 @@ Render *FRS_do_stroke_rendering(Render *re, SceneRenderLayer *srl, int render)
 	}
 
 	// Free temp main (currently only text blocks are stored there)
-	for (text = (Text *) bmain.text.first; text; text = next_text) {
+	for (text = (Text *)freestyle_bmain->text.first; text; text = next_text) {
 		next_text = (Text *) text->id.next;
 
-		BKE_text_unlink(&bmain, text);
-		BKE_libblock_free(&bmain, text);
+		BKE_text_unlink(freestyle_bmain, text);
+		BKE_libblock_free(freestyle_bmain, text);
 	}
 
 	return freestyle_render;
diff --git a/source/blender/render/intern/include/render_types.h b/source/blender/render/intern/include/render_types.h
index eeb0544..d16fe6f 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 9f27021..676e28c 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) {




More information about the Bf-blender-cvs mailing list