[Bf-blender-cvs] [b3259d5] cycles_memory_experiments: Cycles: Free hires smoke data from blender side after scene was fully synchronized

Sergey Sharybin noreply at git.blender.org
Mon Jun 8 15:51:41 CEST 2015


Commit: b3259d51b464c01bfe2a507cffe04f46df761e86
Author: Sergey Sharybin
Date:   Mon Jun 8 15:34:07 2015 +0200
Branches: cycles_memory_experiments
https://developer.blender.org/rBb3259d51b464c01bfe2a507cffe04f46df761e86

Cycles: Free hires smoke data from blender side after scene was fully synchronized

This happens if all object's smokes are backed to files and rendering is either
happening from command line of with locked interface.

The idea behind this change is to make as much memory available for path tracing
as possible, so after heavy swapping during synchronization period there's loads
of free memory to put important data back to RAM.

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

M	intern/cycles/blender/blender_mesh.cpp
M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_session.h
M	intern/cycles/render/session.cpp
M	intern/cycles/render/session.h
M	source/blender/blenkernel/BKE_object.h
M	source/blender/blenkernel/intern/object.c
M	source/blender/makesrna/intern/rna_object_api.c

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

diff --git a/intern/cycles/blender/blender_mesh.cpp b/intern/cycles/blender/blender_mesh.cpp
index d88ebb8..a28536c 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -697,7 +697,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_ob, bool object_updated, bool hide_tri
 				sync_curves(mesh, b_mesh, b_ob, false);
 
 			if(can_free_caches) {
-				b_ob.cache_release();
+				b_ob.cache_release(false);
 			}
 
 			/* free derived mesh */
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 3ab1b4d..9a1297c 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -409,6 +409,7 @@ void BlenderSession::render()
 	/* set callback to write out render results */
 	session->write_render_tile_cb = function_bind(&BlenderSession::write_render_tile, this, _1);
 	session->update_render_tile_cb = function_bind(&BlenderSession::update_render_tile, this, _1);
+	session->clear_database_cb = function_bind(&BlenderSession::clear_blender_database, this);
 
 	/* get buffer parameters */
 	SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
@@ -501,6 +502,7 @@ void BlenderSession::render()
 	/* clear callback */
 	session->write_render_tile_cb = function_null;
 	session->update_render_tile_cb = function_null;
+	session->clear_database_cb = function_null;
 
 	/* free all memory used (host and device), so we wouldn't leave render
 	 * engine with extra memory allocated
@@ -1148,5 +1150,26 @@ bool BlenderSession::builtin_image_float_pixels(const string &builtin_name, void
 	return false;
 }
 
+void BlenderSession::clear_blender_database()
+{
+	const bool is_interface_locked = b_engine.render() &&
+	                                 b_engine.render().use_lock_interface();
+	const bool can_free_database = BlenderSession::headless || is_interface_locked;
+	if(!can_free_database) {
+		/* Database might be used by the interface, can not free it at all. */
+		return;
+	}
+	for(BL::Scene b_sce = b_scene; b_sce; b_sce = b_sce.background_set()) {
+		BL::Scene::object_bases_iterator b_base;
+		for(b_sce.object_bases.begin(b_base);
+		    b_base != b_sce.object_bases.end();
+		    ++b_base)
+		{
+			BL::Object b_ob = b_base->object();
+			b_ob.cache_release(true);
+		}
+	}
+}
+
 CCL_NAMESPACE_END
 
diff --git a/intern/cycles/blender/blender_session.h b/intern/cycles/blender/blender_session.h
index 708776d..5498548 100644
--- a/intern/cycles/blender/blender_session.h
+++ b/intern/cycles/blender/blender_session.h
@@ -109,6 +109,8 @@ protected:
 	void builtin_image_info(const string &builtin_name, void *builtin_data, bool &is_float, int &width, int &height, int &depth, int &channels);
 	bool builtin_image_pixels(const string &builtin_name, void *builtin_data, unsigned char *pixels);
 	bool builtin_image_float_pixels(const string &builtin_name, void *builtin_data, float *pixels);
+
+	void clear_blender_database();
 };
 
 CCL_NAMESPACE_END
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 975fa5a..bd8a5ae 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -812,6 +812,10 @@ void Session::update_scene()
 		progress.set_status("Updating Scene");
 		scene->device_update(device, progress);
 	}
+
+	if(clear_database_cb) {
+		clear_database_cb();
+	}
 }
 
 void Session::update_status_time(bool show_pause, bool show_done)
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index c669bcc..ab9f2dd 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -128,6 +128,7 @@ public:
 
 	function<void(RenderTile&)> write_render_tile_cb;
 	function<void(RenderTile&)> update_render_tile_cb;
+	function<void(void)> clear_database_cb;
 
 	Session(const SessionParams& params);
 	~Session();
diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h
index 9482ec7..8d1fe76 100644
--- a/source/blender/blenkernel/BKE_object.h
+++ b/source/blender/blenkernel/BKE_object.h
@@ -67,7 +67,7 @@ void BKE_object_update_base_layer(struct Scene *scene, struct Object *ob);
 void BKE_object_free(struct Object *ob);
 void BKE_object_free_ex(struct Object *ob, bool do_id_user);
 void BKE_object_free_derived_caches(struct Object *ob);
-void BKE_object_free_caches(struct Object *object);
+void BKE_object_free_caches(struct Object *object, bool free_smoke_sim);
 
 void BKE_object_modifier_hook_reset(struct Object *ob, struct HookModifierData *hmd);
 
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index f8fe530..d0f8f83 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -107,6 +107,7 @@
 #include "BKE_sca.h"
 #include "BKE_scene.h"
 #include "BKE_sequencer.h"
+#include "BKE_smoke.h"
 #include "BKE_speaker.h"
 #include "BKE_softbody.h"
 #include "BKE_subsurf.h"
@@ -338,7 +339,7 @@ void BKE_object_free_derived_caches(Object *ob)
 	BKE_object_free_curve_cache(ob);
 }
 
-void BKE_object_free_caches(Object *object)
+void BKE_object_free_caches(Object *object, bool free_smoke_sim)
 {
 	ModifierData *md;
 	short update_flag = 0;
@@ -366,6 +367,28 @@ void BKE_object_free_caches(Object *object)
 				update_flag |= OB_RECALC_DATA;
 			}
 		}
+		else if (md->type == eModifierType_Smoke) {
+			if (free_smoke_sim) {
+				SmokeModifierData *smd = (SmokeModifierData *) md;
+				SmokeDomainSettings *sds = smd->domain;
+				if (sds != NULL) {
+					bool use_sim = sds->point_cache[0] == NULL;
+					PointCache *cache;
+					/* We only reset cache if all the point caches are baked to file. */
+					for (cache = sds->ptcaches[0].first;
+					     cache != NULL && use_sim == false;
+					     cache = cache->next)
+					{
+						use_sim |= ((cache->flag & (PTCACHE_BAKED|PTCACHE_DISK_CACHE)) != (PTCACHE_BAKED|PTCACHE_DISK_CACHE));
+					}
+					if (!use_sim) {
+						smokeModifier_reset(smd);
+						smokeModifier_reset_turbulence(smd);
+						update_flag |= OB_RECALC_DATA;
+					}
+				}
+			}
+		}
 	}
 
 	/* Tag object for update, so once memory critical operation is over and
diff --git a/source/blender/makesrna/intern/rna_object_api.c b/source/blender/makesrna/intern/rna_object_api.c
index 4b3f34f..18ffdd8 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -466,6 +466,12 @@ static int rna_Object_update_from_editmode(Object *ob)
 	}
 	return false;
 }
+
+static void rna_Object_cache_release(Object *object, int free_smoke_sim)
+{
+	BKE_object_free_caches(object, free_smoke_sim != 0);
+}
+
 #else /* RNA_RUNTIME */
 
 void RNA_api_object(StructRNA *srna)
@@ -688,7 +694,8 @@ void RNA_api_object(StructRNA *srna)
 	parm = RNA_def_boolean(func, "result", 0, "", "Success");
 	RNA_def_function_return(func, parm);
 
-	func = RNA_def_function(srna, "cache_release", "BKE_object_free_caches");
+	func = RNA_def_function(srna, "cache_release", "rna_Object_cache_release");
+	 RNA_def_boolean(func, "free_smoke_sim", 0, "", "Free baked smoke simulation data");
 	RNA_def_function_ui_description(func, "Release memory used by caches associated with this object. Intended to be used by render engines only");
 }




More information about the Bf-blender-cvs mailing list