From 549468365157a075949f2d4b8d9496ff719cefbf Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Fri, 9 Nov 2018 16:14:15 +0100 Subject: Cycles: Free Blender side data as soon as we don't need it Currently this is possible after built-in images are loaded in memory. Allows to save memory used by dependency graph and copy-on-write. In practice this lowers peak system memory usage from 52GB to 42GB on a production file of spring 03_035_A.lighting. Note, that this only applies to F12 and command line renders. Bigger note, that this optimization is currently only possible if there are no grease pencil objects to be rendered. --- source/blender/render/extern/include/RE_engine.h | 2 ++ .../blender/render/intern/source/external_engine.c | 24 ++++++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) (limited to 'source/blender/render') diff --git a/source/blender/render/extern/include/RE_engine.h b/source/blender/render/extern/include/RE_engine.h index 1ca889f2347..faa4c8b3184 100644 --- a/source/blender/render/extern/include/RE_engine.h +++ b/source/blender/render/extern/include/RE_engine.h @@ -193,4 +193,6 @@ struct RenderData *RE_engine_get_render_data(struct Render *re); void RE_bake_engine_set_engine_parameters( struct Render *re, struct Main *bmain, struct Scene *scene); +void RE_engine_free_blender_memory(struct RenderEngine *engine); + #endif /* __RE_ENGINE_H__ */ diff --git a/source/blender/render/intern/source/external_engine.c b/source/blender/render/intern/source/external_engine.c index a06389bfcd4..758600e89aa 100644 --- a/source/blender/render/intern/source/external_engine.c +++ b/source/blender/render/intern/source/external_engine.c @@ -738,8 +738,13 @@ int RE_engine_render(Render *re, int do_all) type->render(engine, engine->depsgraph); - /* grease pencil render over previous render result */ - if (!RE_engine_test_break(engine)) { + /* Grease pencil render over previous render result. + * + * NOTE: External engine might have been requested to free its + * dependency graph, which is only allowed if there is no grease + * pencil (pipeline is taking care of that). + */ + if (!RE_engine_test_break(engine) && engine->depsgraph != NULL) { DRW_render_gpencil(engine, engine->depsgraph); } @@ -813,3 +818,18 @@ void RE_engine_register_pass(struct RenderEngine *engine, struct Scene *scene, s } } } + +void RE_engine_free_blender_memory(RenderEngine *engine) +{ + /* Weak way to save memory, but not crash grease pencil. + * + * TODO(sergey): Find better solution for this. + * TODO(sergey): Try to find solution which does not involve looping over + * all the objects. + */ + if (DRW_render_check_grease_pencil(engine->depsgraph)) { + return; + } + DEG_graph_free(engine->depsgraph); + engine->depsgraph = NULL; +} -- cgit v1.2.3