Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Stockner <lukas.stockner@freenet.de>2016-05-08 02:44:01 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2016-05-08 18:44:03 +0300
commitcbaa25eb88a25852791d4f8b18fb9e9137fea401 (patch)
tree6c11d0aa36ac2f7aac07868262d38964237d0c10 /intern/cycles
parent6100c2d262c58c611ccc75a20cca23bf9f245767 (diff)
Cycles: Fix two small memory leaks and deduplicate table freeing
This commit makes remove_table skip the freeing if the offset is already set to invalid - or, if it wasn't, set it to invalid after freeing. That's what the current code was already doing in the Manager classes, this change allows them to just call remove without the additional code. Also, two potential memory leaks where new tables were always allocated without freeing the old ones are fixed. Reviewers: sergey, dingto, brecht Differential Revision: https://developer.blender.org/D1974
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/render/camera.cpp10
-rw-r--r--intern/cycles/render/film.cpp6
-rw-r--r--intern/cycles/render/shader.cpp7
-rw-r--r--intern/cycles/render/tables.cpp10
-rw-r--r--intern/cycles/render/tables.h2
5 files changed, 15 insertions, 20 deletions
diff --git a/intern/cycles/render/camera.cpp b/intern/cycles/render/camera.cpp
index 028916c1b8f..ad96473e5d2 100644
--- a/intern/cycles/render/camera.cpp
+++ b/intern/cycles/render/camera.cpp
@@ -323,6 +323,7 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
#ifdef __CAMERA_MOTION__
kcam->shuttertime = (need_motion == Scene::MOTION_BLUR) ? shuttertime: -1.0f;
+ scene->lookup_tables->remove_table(&shutter_table_offset);
if(need_motion == Scene::MOTION_BLUR) {
vector<float> shutter_table;
util_cdf_inverted(SHUTTER_TABLE_SIZE,
@@ -335,10 +336,6 @@ void Camera::device_update(Device *device, DeviceScene *dscene, Scene *scene)
shutter_table);
kcam->shutter_table_offset = (int)shutter_table_offset;
}
- else if(shutter_table_offset != TABLE_OFFSET_INVALID) {
- scene->lookup_tables->remove_table(shutter_table_offset);
- shutter_table_offset = TABLE_OFFSET_INVALID;
- }
#else
kcam->shuttertime = -1.0f;
#endif
@@ -425,10 +422,7 @@ void Camera::device_free(Device * /*device*/,
DeviceScene * /*dscene*/,
Scene *scene)
{
- if(shutter_table_offset != TABLE_OFFSET_INVALID) {
- scene->lookup_tables->remove_table(shutter_table_offset);
- shutter_table_offset = TABLE_OFFSET_INVALID;
- }
+ scene->lookup_tables->remove_table(&shutter_table_offset);
}
bool Camera::modified(const Camera& cam)
diff --git a/intern/cycles/render/film.cpp b/intern/cycles/render/film.cpp
index abdd1c2cc8a..95cb10ab13b 100644
--- a/intern/cycles/render/film.cpp
+++ b/intern/cycles/render/film.cpp
@@ -428,6 +428,7 @@ void Film::device_update(Device *device, DeviceScene *dscene, Scene *scene)
/* update filter table */
vector<float> table = filter_table(filter_type, filter_width);
+ scene->lookup_tables->remove_table(&filter_table_offset);
filter_table_offset = scene->lookup_tables->add_table(dscene, table);
kfilm->filter_table_offset = (int)filter_table_offset;
@@ -443,10 +444,7 @@ void Film::device_free(Device * /*device*/,
DeviceScene * /*dscene*/,
Scene *scene)
{
- if(filter_table_offset != TABLE_OFFSET_INVALID) {
- scene->lookup_tables->remove_table(filter_table_offset);
- filter_table_offset = TABLE_OFFSET_INVALID;
- }
+ scene->lookup_tables->remove_table(&filter_table_offset);
}
bool Film::modified(const Film& film)
diff --git a/intern/cycles/render/shader.cpp b/intern/cycles/render/shader.cpp
index c07c6a04d03..82b607563ed 100644
--- a/intern/cycles/render/shader.cpp
+++ b/intern/cycles/render/shader.cpp
@@ -404,8 +404,8 @@ void ShaderManager::device_update_common(Device *device,
}
}
beckmann_table_offset = scene->lookup_tables->add_table(dscene, beckmann_table);
- ktables->beckmann_offset = (int)beckmann_table_offset;
}
+ ktables->beckmann_offset = (int)beckmann_table_offset;
/* integrator */
KernelIntegrator *kintegrator = &dscene->data.integrator;
@@ -418,10 +418,7 @@ void ShaderManager::device_update_common(Device *device,
void ShaderManager::device_free_common(Device *device, DeviceScene *dscene, Scene *scene)
{
- if(beckmann_table_offset != TABLE_OFFSET_INVALID) {
- scene->lookup_tables->remove_table(beckmann_table_offset);
- beckmann_table_offset = TABLE_OFFSET_INVALID;
- }
+ scene->lookup_tables->remove_table(&beckmann_table_offset);
device->tex_free(dscene->shader_flag);
dscene->shader_flag.clear();
diff --git a/intern/cycles/render/tables.cpp b/intern/cycles/render/tables.cpp
index cde024cc11c..dfafd99961b 100644
--- a/intern/cycles/render/tables.cpp
+++ b/intern/cycles/render/tables.cpp
@@ -94,15 +94,21 @@ size_t LookupTables::add_table(DeviceScene *dscene, vector<float>& data)
return new_table.offset;
}
-void LookupTables::remove_table(size_t offset)
+void LookupTables::remove_table(size_t *offset)
{
+ if(*offset == TABLE_OFFSET_INVALID) {
+ /* The table isn't even allocated, so just return here. */
+ return;
+ }
+
need_update = true;
list<Table>::iterator table;
for(table = lookup_tables.begin(); table != lookup_tables.end(); table++) {
- if(table->offset == offset) {
+ if(table->offset == *offset) {
lookup_tables.erase(table);
+ *offset = TABLE_OFFSET_INVALID;
return;
}
}
diff --git a/intern/cycles/render/tables.h b/intern/cycles/render/tables.h
index 4efa09fa3c1..1bb70b22762 100644
--- a/intern/cycles/render/tables.h
+++ b/intern/cycles/render/tables.h
@@ -45,7 +45,7 @@ public:
void device_free(Device *device, DeviceScene *dscene);
size_t add_table(DeviceScene *dscene, vector<float>& data);
- void remove_table(size_t offset);
+ void remove_table(size_t *offset);
};
CCL_NAMESPACE_END