[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [52174] trunk/blender/source/blender/ render: Render Engines: fix crash when changing render engine during rendering

Sergey Sharybin sergey.vfx at gmail.com
Tue Nov 13 12:00:47 CET 2012


Revision: 52174
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=52174
Author:   nazgul
Date:     2012-11-13 11:00:46 +0000 (Tue, 13 Nov 2012)
Log Message:
-----------
Render Engines: fix crash when changing render engine during rendering

Crash would have been happen when changing render ending at the same time
rendering happens. It could be final Cycles render or even preview LUX render.

Modified Paths:
--------------
    trunk/blender/source/blender/render/extern/include/RE_engine.h
    trunk/blender/source/blender/render/intern/source/external_engine.c
    trunk/blender/source/blender/render/intern/source/pipeline.c

Modified: trunk/blender/source/blender/render/extern/include/RE_engine.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_engine.h	2012-11-13 10:49:55 UTC (rev 52173)
+++ trunk/blender/source/blender/render/extern/include/RE_engine.h	2012-11-13 11:00:46 UTC (rev 52174)
@@ -60,6 +60,7 @@
 #define RE_ENGINE_PREVIEW		2
 #define RE_ENGINE_DO_DRAW		4
 #define RE_ENGINE_DO_UPDATE		8
+#define RE_ENGINE_RENDERING		16
 
 extern ListBase R_engines;
 

Modified: trunk/blender/source/blender/render/intern/source/external_engine.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/external_engine.c	2012-11-13 10:49:55 UTC (rev 52173)
+++ trunk/blender/source/blender/render/intern/source/external_engine.c	2012-11-13 11:00:46 UTC (rev 52174)
@@ -316,6 +316,7 @@
 {
 	RenderEngineType *type = RE_engines_find(re->r.engine);
 	RenderEngine *engine;
+	int persistent_data = re->r.mode & R_PERSISTENT_DATA;
 
 	/* verify if we can render */
 	if (!type->render)
@@ -349,11 +350,17 @@
 	re->i.totface = re->i.totvert = re->i.totstrand = re->i.totlamp = re->i.tothalo = 0;
 
 	/* render */
-	if (!re->engine)
-		re->engine = RE_engine_create(type);
-
 	engine = re->engine;
 
+	if (!engine) {
+		engine = RE_engine_create(type);
+
+		if (persistent_data)
+			re->engine = engine;
+	}
+
+	engine->flag |= RE_ENGINE_RENDERING;
+
 	/* TODO: actually link to a parent which shouldn't happen */
 	engine->re = re;
 
@@ -382,8 +389,13 @@
 	if (type->render)
 		type->render(engine, re->scene);
 
-	if (!(re->r.mode & R_PERSISTENT_DATA)) {
-		RE_engine_free(re->engine);
+	engine->tile_x = 0;
+	engine->tile_y = 0;
+	engine->flag &= ~RE_ENGINE_RENDERING;
+
+	/* re->engine becomes zero if user changed active render engine during render */
+	if (!persistent_data || !re->engine) {
+		RE_engine_free(engine);
 		re->engine = NULL;
 	}
 
@@ -393,8 +405,6 @@
 		BLI_rw_mutex_unlock(&re->resultmutex);
 	}
 
-	engine->tile_x = 0;
-	engine->tile_y = 0;
 	freeparts(re);
 
 	render_result_free_list(&engine->fullresult, engine->fullresult.first);

Modified: trunk/blender/source/blender/render/intern/source/pipeline.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/pipeline.c	2012-11-13 10:49:55 UTC (rev 52173)
+++ trunk/blender/source/blender/render/intern/source/pipeline.c	2012-11-13 11:00:46 UTC (rev 52174)
@@ -432,7 +432,10 @@
 	/* render engines can be kept around for quick re-render, this clears all */
 	for (re = RenderGlobal.renderlist.first; re; re = re->next) {
 		if (re->engine) {
-			RE_engine_free(re->engine);
+			/* if engine is currently rendering, just tag it to be freed when render is finished */
+			if (!(re->engine->flag & RE_ENGINE_RENDERING))
+				RE_engine_free(re->engine);
+
 			re->engine = NULL;
 		}
 	}




More information about the Bf-blender-cvs mailing list