Fix #34121: OSL + persistent images option was not freeing shader memory properly,

causing memory to increase continuously during animation render.
This commit is contained in:
Brecht Van Lommel
2013-02-14 16:11:47 +00:00
parent a47af30561
commit adbd84c320
9 changed files with 42 additions and 10 deletions

View File

@@ -307,7 +307,10 @@ SceneParams BlenderSync::get_scene_params(BL::Scene b_scene, bool background)
params.use_bvh_spatial_split = RNA_boolean_get(&cscene, "debug_use_spatial_splits"); 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.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; return params;
} }

View File

@@ -966,6 +966,14 @@ void MeshManager::device_free(Device *device, DeviceScene *dscene)
dscene->attributes_map.clear(); dscene->attributes_map.clear();
dscene->attributes_float.clear(); dscene->attributes_float.clear();
dscene->attributes_float3.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) void MeshManager::tag_update(Scene *scene)

View File

@@ -47,17 +47,27 @@ OSLShaderManager::OSLShaderManager()
{ {
services = new OSLRenderServices(); services = new OSLRenderServices();
shading_system_init();
texture_system_init(); texture_system_init();
shading_system_init();
} }
OSLShaderManager::~OSLShaderManager() OSLShaderManager::~OSLShaderManager()
{ {
OSL::ShadingSystem::destroy(ss); OSL::ShadingSystem::destroy(ss);
OSL::TextureSystem::destroy(ts); OSL::TextureSystem::destroy(ts);
delete services; 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) void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
{ {
if(!need_update) if(!need_update)
@@ -88,6 +98,7 @@ void OSLShaderManager::device_update(Device *device, DeviceScene *dscene, Scene
og->ss = ss; og->ss = ss;
og->ts = ts; og->ts = ts;
og->services = services; og->services = services;
int background_id = scene->shader_manager->get_shader_id(scene->default_background); int background_id = scene->shader_manager->get_shader_id(scene->default_background);
og->background_state = og->surface_state[background_id & SHADER_MASK]; og->background_state = og->surface_state[background_id & SHADER_MASK];
og->use = true; og->use = true;

View File

@@ -64,6 +64,8 @@ public:
OSLShaderManager(); OSLShaderManager();
~OSLShaderManager(); ~OSLShaderManager();
void reset(Scene *scene);
bool use_osl() { return true; } bool use_osl() { return true; }
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);

View File

@@ -85,6 +85,12 @@ void Scene::free_memory(bool final)
foreach(ParticleSystem *p, particle_systems) foreach(ParticleSystem *p, particle_systems)
delete p; delete p;
shaders.clear();
meshes.clear();
objects.clear();
lights.clear();
particle_systems.clear();
if(device) { if(device) {
camera->device_free(device, &dscene); camera->device_free(device, &dscene);
filter->device_free(device, &dscene); filter->device_free(device, &dscene);
@@ -118,13 +124,6 @@ void Scene::free_memory(bool final)
delete curve_system_manager; delete curve_system_manager;
delete image_manager; delete image_manager;
} }
else {
shaders.clear();
meshes.clear();
objects.clear();
lights.clear();
particle_systems.clear();
}
} }
void Scene::device_update(Device *device_, Progress& progress) void Scene::device_update(Device *device_, Progress& progress)
@@ -257,6 +256,7 @@ bool Scene::need_reset()
void Scene::reset() void Scene::reset()
{ {
shader_manager->reset(this);
shader_manager->add_default(this); shader_manager->add_default(this);
/* ensure all objects are updated */ /* ensure all objects are updated */

View File

@@ -110,6 +110,8 @@ public:
static ShaderManager *create(Scene *scene, int shadingsystem); static ShaderManager *create(Scene *scene, int shadingsystem);
virtual ~ShaderManager(); virtual ~ShaderManager();
virtual void reset(Scene *scene) = 0;
virtual bool use_osl() { return false; } virtual bool use_osl() { return false; }
/* device update */ /* device update */

View File

@@ -40,6 +40,10 @@ SVMShaderManager::~SVMShaderManager()
{ {
} }
void SVMShaderManager::reset(Scene *scene)
{
}
void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress) void SVMShaderManager::device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress)
{ {
if(!need_update) if(!need_update)

View File

@@ -45,6 +45,8 @@ public:
SVMShaderManager(); SVMShaderManager();
~SVMShaderManager(); ~SVMShaderManager();
void reset(Scene *scene);
void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress); void device_update(Device *device, DeviceScene *dscene, Scene *scene, Progress& progress);
void device_free(Device *device, DeviceScene *dscene); void device_free(Device *device, DeviceScene *dscene);
}; };

View File

@@ -362,7 +362,7 @@ static Scene *preview_prepare_scene(Scene *scene, ID *id, int id_type, ShaderPre
} }
else { else {
/* use current scene world to light sphere */ /* 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; sce->world = scene->world;
} }