[Bf-blender-cvs] [54946836515] blender2.8: Cycles: Free Blender side data as soon as we don't need it

Sergey Sharybin noreply at git.blender.org
Fri Nov 9 17:53:12 CET 2018


Commit: 549468365157a075949f2d4b8d9496ff719cefbf
Author: Sergey Sharybin
Date:   Fri Nov 9 16:14:15 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB549468365157a075949f2d4b8d9496ff719cefbf

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.

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	source/blender/makesrna/intern/rna_render.c
M	source/blender/render/extern/include/RE_engine.h
M	source/blender/render/intern/source/external_engine.c

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 28b0f4faf63..17da8b43d29 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -470,6 +470,11 @@ void BlenderSession::render(BL::Depsgraph& b_depsgraph_)
 		                &python_thread_state);
 		builtin_images_load();
 
+		/* Attempt to free all data which is held by Blender side, since at this
+		 * point we knwo that we've got everything to render current view layer.
+		 */
+		free_blender_memory_if_possible();
+
 		/* Make sure all views have different noise patterns. - hardcoded value just to make it random */
 		if(view_index != 0) {
 			scene->integrator->seed += hash_int_2d(scene->integrator->seed, hash_int(view_index * 0xdeadbeef));
@@ -1406,4 +1411,16 @@ void BlenderSession::update_resumable_tile_manager(int num_samples)
 	session->tile_manager.range_num_samples = range_num_samples;
 }
 
+void BlenderSession::free_blender_memory_if_possible()
+{
+	if (!background) {
+		/* During interactive render we can not free anything: attempts to save
+		 * memory would cause things to be allocated and evaluated for every
+		 * updated sample.
+		 */
+		return;
+	}
+	b_engine.free_blender_memory();
+}
+
 CCL_NAMESPACE_END
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index 99b14a09a5c..fdeba7b2f81 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -106,6 +106,9 @@ public:
 	BL::BlendData b_data;
 	BL::RenderSettings b_render;
 	BL::Depsgraph b_depsgraph;
+	/* NOTE: Blender's scene might become invalid after call
+	 * free_blender_memory_if_possible().
+	 */
 	BL::Scene b_scene;
 	BL::SpaceView3D b_v3d;
 	BL::RegionView3D b_rv3d;
@@ -172,6 +175,12 @@ protected:
 
 	/* Update tile manager to reflect resumable render settings. */
 	void update_resumable_tile_manager(int num_samples);
+
+	/* Is used after each render layer synchronization is done with the goal
+	 * of freeing render engine data which is held from Blender side (for
+	 * example, dependency graph).
+	 */
+	void free_blender_memory_if_possible();
 };
 
 CCL_NAMESPACE_END
diff --git a/source/blender/makesrna/intern/rna_render.c b/source/blender/makesrna/intern/rna_render.c
index 1e9f68c577b..46b77b80d49 100644
--- a/source/blender/makesrna/intern/rna_render.c
+++ b/source/blender/makesrna/intern/rna_render.c
@@ -685,6 +685,9 @@ static void rna_def_render_engine(BlenderRNA *brna)
 	parm = RNA_def_int(func, "pixel_size", 0, 1, 8, "Pixel Size", "", 1, 8);
 	RNA_def_function_return(func, parm);
 
+	RNA_def_function(srna, "free_blender_memory", "RE_engine_free_blender_memory");
+	RNA_def_function_ui_description(func, "Free Blender side memory of render engine");
+
 	RNA_define_verify_sdna(0);
 
 	prop = RNA_def_property(srna, "is_animation", PROP_BOOLEAN, PROP_NONE);
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;
+}



More information about the Bf-blender-cvs mailing list