Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/render')
-rw-r--r--source/blender/render/extern/include/RE_engine.h2
-rw-r--r--source/blender/render/intern/source/external_engine.c24
2 files changed, 24 insertions, 2 deletions
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;
+}