[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54556] trunk/blender: Fix #34121: OSL + persistent images option was not freeing shader memory properly,

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Feb 14 17:11:47 CET 2013


Revision: 54556
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54556
Author:   blendix
Date:     2013-02-14 16:11:47 +0000 (Thu, 14 Feb 2013)
Log Message:
-----------
Fix #34121: OSL + persistent images option was not freeing shader memory properly,
causing memory to increase continuously during animation render.

Modified Paths:
--------------
    trunk/blender/intern/cycles/blender/blender_sync.cpp
    trunk/blender/intern/cycles/render/mesh.cpp
    trunk/blender/intern/cycles/render/osl.cpp
    trunk/blender/intern/cycles/render/osl.h
    trunk/blender/intern/cycles/render/scene.cpp
    trunk/blender/intern/cycles/render/shader.h
    trunk/blender/intern/cycles/render/svm.cpp
    trunk/blender/intern/cycles/render/svm.h
    trunk/blender/source/blender/editors/render/render_preview.c

Modified: trunk/blender/intern/cycles/blender/blender_sync.cpp
===================================================================
--- trunk/blender/intern/cycles/blender/blender_sync.cpp	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/intern/cycles/blender/blender_sync.cpp	2013-02-14 16:11:47 UTC (rev 54556)
@@ -307,7 +307,10 @@
 	params.use_bvh_spatial_split = RNA_boolean_get(&cscene, "debug_use_spatial_splits");
 	params.use_bvh_cache = (background)? RNA_boolean_get(&cscene, "use_cache"): false;
 
-	params.persistent_images = (background)? r.use_persistent_data(): false;
+	if(background && params.shadingsystem != SceneParams::OSL)
+		params.persistent_images = r.use_persistent_data();
+	else
+		params.persistent_images = false;
 
 	return params;
 }

Modified: trunk/blender/intern/cycles/render/mesh.cpp
===================================================================
--- trunk/blender/intern/cycles/render/mesh.cpp	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/intern/cycles/render/mesh.cpp	2013-02-14 16:11:47 UTC (rev 54556)
@@ -966,6 +966,14 @@
 	dscene->attributes_map.clear();
 	dscene->attributes_float.clear();
 	dscene->attributes_float3.clear();
+
+	OSLGlobals *og = (OSLGlobals*)device->osl_memory();
+
+	if(og) {
+		og->object_name_map.clear();
+		og->attribute_map.clear();
+		og->object_names.clear();
+	}
 }
 
 void MeshManager::tag_update(Scene *scene)

Modified: trunk/blender/intern/cycles/render/osl.cpp
===================================================================
--- trunk/blender/intern/cycles/render/osl.cpp	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/intern/cycles/render/osl.cpp	2013-02-14 16:11:47 UTC (rev 54556)
@@ -47,17 +47,27 @@
 {
 	services = new OSLRenderServices();
 
+	texture_system_init();
 	shading_system_init();
-	texture_system_init();
 }
 
 OSLShaderManager::~OSLShaderManager()
 {
 	OSL::ShadingSystem::destroy(ss);
 	OSL::TextureSystem::destroy(ts);
+
 	delete services;
 }
 
+void OSLShaderManager::reset(Scene *scene)
+{
+	OSL::ShadingSystem::destroy(ss);
+	delete services;
+
+	services = new OSLRenderServices();
+	shading_system_init();
+}
+
 void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
 {
 	if(!need_update)
@@ -88,6 +98,7 @@
 	og->ss = ss;
 	og->ts = ts;
 	og->services = services;
+
 	int background_id = scene->shader_manager->get_shader_id(scene->default_background);
 	og->background_state = og->surface_state[background_id & SHADER_MASK];
 	og->use = true;

Modified: trunk/blender/intern/cycles/render/osl.h
===================================================================
--- trunk/blender/intern/cycles/render/osl.h	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/intern/cycles/render/osl.h	2013-02-14 16:11:47 UTC (rev 54556)
@@ -64,6 +64,8 @@
 	OSLShaderManager();
 	~OSLShaderManager();
 
+	void reset(Scene *scene);
+
 	bool use_osl() { return true; }
 
 	void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);

Modified: trunk/blender/intern/cycles/render/scene.cpp
===================================================================
--- trunk/blender/intern/cycles/render/scene.cpp	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/intern/cycles/render/scene.cpp	2013-02-14 16:11:47 UTC (rev 54556)
@@ -85,6 +85,12 @@
 	foreach(ParticleSystem *p, particle_systems)
 		delete p;
 
+	shaders.clear();
+	meshes.clear();
+	objects.clear();
+	lights.clear();
+	particle_systems.clear();
+
 	if(device) {
 		camera->device_free(device, &dscene);
 		filter->device_free(device, &dscene);
@@ -118,13 +124,6 @@
 		delete curve_system_manager;
 		delete image_manager;
 	}
-	else {
-		shaders.clear();
-		meshes.clear();
-		objects.clear();
-		lights.clear();
-		particle_systems.clear();
-	}
 }
 
 void Scene::device_update(Device *device_, Progress& progress)
@@ -257,6 +256,7 @@
 
 void Scene::reset()
 {
+	shader_manager->reset(this);
 	shader_manager->add_default(this);
 
 	/* ensure all objects are updated */

Modified: trunk/blender/intern/cycles/render/shader.h
===================================================================
--- trunk/blender/intern/cycles/render/shader.h	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/intern/cycles/render/shader.h	2013-02-14 16:11:47 UTC (rev 54556)
@@ -110,6 +110,8 @@
 	static ShaderManager *create(Scene *scene, int shadingsystem);
 	virtual ~ShaderManager();
 
+	virtual void reset(Scene *scene) = 0;
+
 	virtual bool use_osl() { return false; }
 
 	/* device update */

Modified: trunk/blender/intern/cycles/render/svm.cpp
===================================================================
--- trunk/blender/intern/cycles/render/svm.cpp	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/intern/cycles/render/svm.cpp	2013-02-14 16:11:47 UTC (rev 54556)
@@ -40,6 +40,10 @@
 {
 }
 
+void SVMShaderManager::reset(Scene *scene)
+{
+}
+
 void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
 {
 	if(!need_update)

Modified: trunk/blender/intern/cycles/render/svm.h
===================================================================
--- trunk/blender/intern/cycles/render/svm.h	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/intern/cycles/render/svm.h	2013-02-14 16:11:47 UTC (rev 54556)
@@ -45,6 +45,8 @@
 	SVMShaderManager();
 	~SVMShaderManager();
 
+	void reset(Scene *scene);
+
 	void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
 	void device_free(Device *device, DeviceScene *dscene);
 };

Modified: trunk/blender/source/blender/editors/render/render_preview.c
===================================================================
--- trunk/blender/source/blender/editors/render/render_preview.c	2013-02-14 16:01:34 UTC (rev 54555)
+++ trunk/blender/source/blender/editors/render/render_preview.c	2013-02-14 16:11:47 UTC (rev 54556)
@@ -362,7 +362,7 @@
 				}
 				else {
 					/* use current scene world to light sphere */
-					if (ma->pr_type == MA_SPHERE_A)
+					if (mat->pr_type == MA_SPHERE_A)
 						sce->world = scene->world;
 				}
 				




More information about the Bf-blender-cvs mailing list