From 59a187b33876ad274cfd5cfcf13a3d25dbfe1b0a Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Thu, 24 Jan 2013 08:14:20 +0000 Subject: 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. --- source/blender/editors/space_view3d/view3d_draw.c | 2 +- source/blender/render/extern/include/RE_engine.h | 2 ++ source/blender/render/intern/source/external_engine.c | 16 ++++++++++++++++ 3 files changed, 19 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/blender/editors/space_view3d/view3d_draw.c b/source/blender/editors/space_view3d/view3d_draw.c index 39581adb622..ff63f16d125 100644 --- a/source/blender/editors/space_view3d/view3d_draw.c +++ b/source/blender/editors/space_view3d/view3d_draw.c @@ -2883,7 +2883,7 @@ static int view3d_main_area_draw_engine(const bContext *C, ARegion *ar, int draw 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; diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index 64135a16f5d..b687acae1f7 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -62,6 +62,7 @@ struct Scene; #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 @@ typedef struct RenderEngine { } 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); diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index 296c8b6eba8..22a49bcbbc3 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -1,4 +1,5 @@ /* + * ***** BEGIN GPL LICENSE BLOCK ***** * * This program is free software; you can redistribute it and/or @@ -127,10 +128,21 @@ int RE_engine_is_external(Render *re) /* Create, Free */ 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 @@ void RE_engine_free(RenderEngine *engine) } #endif + if (engine->flag & RE_ENGINE_USED_FOR_VIEWPORT) { + BLI_end_threaded_malloc(); + } + if (engine->text) MEM_freeN(engine->text); -- cgit v1.2.3