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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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 */
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
};
|
};
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user