diff options
-rw-r--r-- | intern/cycles/render/session.cpp | 15 | ||||
-rw-r--r-- | intern/cycles/render/session.h | 3 |
2 files changed, 13 insertions, 5 deletions
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 3f080407b1f..08909943c49 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -726,16 +726,20 @@ DeviceRequestedFeatures Session::get_requested_device_features() return requested_features; } -void Session::load_kernels() +void Session::load_kernels(bool lock_scene) { - thread_scoped_lock scene_lock(scene->mutex); + thread_scoped_lock scene_lock; + if(lock_scene) { + scene_lock = thread_scoped_lock(scene->mutex); + } - if(!kernels_loaded) { + DeviceRequestedFeatures requested_features = get_requested_device_features(); + + if(!kernels_loaded || loaded_kernel_features.modified(requested_features)) { progress.set_status("Loading render kernels (may take a few minutes the first time)"); scoped_timer timer; - DeviceRequestedFeatures requested_features = get_requested_device_features(); VLOG(2) << "Requested features:\n" << requested_features; if(!device->load_kernels(requested_features)) { string message = device->error_message(); @@ -752,6 +756,7 @@ void Session::load_kernels() VLOG(1) << "Total time spent loading kernels: " << time_dt() - timer.get_start(); kernels_loaded = true; + loaded_kernel_features = requested_features; } } @@ -902,6 +907,8 @@ void Session::update_scene() /* update scene */ if(scene->need_update()) { + load_kernels(false); + progress.set_status("Updating Scene"); MEM_GUARDED_CALL(&progress, scene->device_update, device, progress); } diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h index a7ca90abbce..5fb1a365ee9 100644 --- a/intern/cycles/render/session.h +++ b/intern/cycles/render/session.h @@ -158,7 +158,7 @@ public: void set_pause(bool pause); void update_scene(); - void load_kernels(); + void load_kernels(bool lock_scene=true); void device_free(); @@ -215,6 +215,7 @@ protected: thread_mutex display_mutex; bool kernels_loaded; + DeviceRequestedFeatures loaded_kernel_features; double reset_time; |