diff options
-rw-r--r-- | intern/cycles/render/camera.cpp | 10 | ||||
-rw-r--r-- | intern/cycles/render/film.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/render/shader.cpp | 7 | ||||
-rw-r--r-- | intern/cycles/render/tables.cpp | 10 | ||||
-rw-r--r-- | intern/cycles/render/tables.h | 2 |
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 |