[Bf-blender-cvs] [9416a70] gooseberry_farm: Cycles: Free hires smoke data from blender side after scene was fully synchronized

Sergey Sharybin noreply at git.blender.org
Wed Jun 10 11:27:33 CEST 2015


Commit: 9416a70888ddf01ef58ec0fcf20b5f6f0bffbb4d
Author: Sergey Sharybin
Date:   Mon Jun 8 15:34:07 2015 +0200
Branches: gooseberry_farm
https://developer.blender.org/rB9416a70888ddf01ef58ec0fcf20b5f6f0bffbb4d

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 21282b5..bfd91a2 100644
--- a/intern/cycles/blender/blender_mesh.cpp
+++ b/intern/cycles/blender/blender_mesh.cpp
@@ -764,7 +764,7 @@ Mesh *BlenderSync::sync_mesh(BL::Object b_parent, bool object_updated, bool hide
 				sync_curves(mesh, b_mesh, b_parent, false, 0, b_dupli_ob);
 
 			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 379ac8c..e928a60 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
@@ -1171,5 +1173,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 a9a03e5..cddc569 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -793,6 +793,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 0465a35..48b9367 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 5845342..136a024 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -111,6 +111,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"
@@ -347,7 +348,7 @@ void BKE_object_free_derived_caches(Object *ob)
 	BKE_object_dupli_cache_clear(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;
@@ -376,6 +377,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 f242c7e..0464cea 100644
--- a/source/blender/makesrna/intern/rna_object_api.c
+++ b/source/blender/makesrna/intern/rna_object_api.c
@@ -455,6 +455,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)
@@ -678,7 +684,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