[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54067] trunk/blender/source/blender: Fix threading issues of viewport rendering when using movies/ generated images

Sergey Sharybin sergey.vfx at gmail.com
Thu Jan 24 09:14:20 CET 2013


Revision: 54067
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54067
Author:   nazgul
Date:     2013-01-24 08:14:20 +0000 (Thu, 24 Jan 2013)
Log Message:
-----------
Fix threading issues of viewport rendering when using movies/generated images

Issue was caused by the fact that guarded allocator is not thread-safe and
generated images/movies could allocate memory when loading pixels to Cycles.

Currently solved by switching memory allocator to using mutex lock (the same
as sued for jobs) when viewport rendering is used.

Nicer solution would be to make guarded allocator thread-safe by using atomic
operations and lock-free lists, but that's more serious change.

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

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2013-01-24 08:14:05 UTC (rev 54066)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2013-01-24 08:14:20 UTC (rev 54067)
@@ -2883,7 +2883,7 @@
 		if (!(type->view_update && type->view_draw))
 			return 0;
 
-		engine = RE_engine_create(type);
+		engine = RE_engine_create_ex(type, TRUE);
 
 		engine->tile_x = scene->r.tilex;
 		engine->tile_y = scene->r.tiley;

Modified: trunk/blender/source/blender/render/extern/include/RE_engine.h
===================================================================
--- trunk/blender/source/blender/render/extern/include/RE_engine.h	2013-01-24 08:14:05 UTC (rev 54066)
+++ trunk/blender/source/blender/render/extern/include/RE_engine.h	2013-01-24 08:14:20 UTC (rev 54067)
@@ -62,6 +62,7 @@
 #define RE_ENGINE_DO_UPDATE		8
 #define RE_ENGINE_RENDERING		16
 #define RE_ENGINE_HIGHLIGHT_TILES	32
+#define RE_ENGINE_USED_FOR_VIEWPORT	64
 
 extern ListBase R_engines;
 
@@ -105,6 +106,7 @@
 } RenderEngine;
 
 RenderEngine *RE_engine_create(RenderEngineType *type);
+RenderEngine *RE_engine_create_ex(RenderEngineType *type, int use_for_viewport);
 void RE_engine_free(RenderEngine *engine);
 
 void RE_layer_load_from_file(struct RenderLayer *layer, struct ReportList *reports, const char *filename, int x, int y);

Modified: trunk/blender/source/blender/render/intern/source/external_engine.c
===================================================================
--- trunk/blender/source/blender/render/intern/source/external_engine.c	2013-01-24 08:14:05 UTC (rev 54066)
+++ trunk/blender/source/blender/render/intern/source/external_engine.c	2013-01-24 08:14:20 UTC (rev 54067)
@@ -1,4 +1,5 @@
 /*
+
  * ***** BEGIN GPL LICENSE BLOCK *****
  *
  * This program is free software; you can redistribute it and/or
@@ -128,9 +129,20 @@
 
 RenderEngine *RE_engine_create(RenderEngineType *type)
 {
+	return RE_engine_create_ex(type, FALSE);
+}
+
+RenderEngine *RE_engine_create_ex(RenderEngineType *type, int use_for_viewport)
+{
 	RenderEngine *engine = MEM_callocN(sizeof(RenderEngine), "RenderEngine");
 	engine->type = type;
 
+	if (use_for_viewport) {
+		engine->flag |= RE_ENGINE_USED_FOR_VIEWPORT;
+
+		BLI_begin_threaded_malloc();
+	}
+
 	return engine;
 }
 
@@ -142,6 +154,10 @@
 	}
 #endif
 
+	if (engine->flag & RE_ENGINE_USED_FOR_VIEWPORT) {
+		BLI_end_threaded_malloc();
+	}
+
 	if (engine->text)
 		MEM_freeN(engine->text);
 




More information about the Bf-blender-cvs mailing list