diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-05-19 21:17:57 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-05-19 21:33:09 +0400 |
commit | 0d9e6a736a410991ef9a11ef87c8d23c96199823 (patch) | |
tree | a0697ab87d06e685be81e3452348a7fd0eade07b /intern | |
parent | e97a186ffe0c3cca4a9d3edbf899f14a5de44edc (diff) |
Fix T40262: cycles GPU bake crash due to kernels not loaded, randomly due to thread timing.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/blender/blender_session.cpp | 6 | ||||
-rw-r--r-- | intern/cycles/render/session.cpp | 12 | ||||
-rw-r--r-- | intern/cycles/render/session.h | 3 |
3 files changed, 19 insertions, 2 deletions
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp index 01a5acd8982..13d4041f6a7 100644 --- a/intern/cycles/blender/blender_session.cpp +++ b/intern/cycles/blender/blender_session.cpp @@ -518,6 +518,12 @@ void BlenderSession::bake(BL::Object b_object, const string& pass_type, BL::Bake size_t object_index = OBJECT_NONE; int tri_offset = 0; + /* ensure kernels are loaded before we do any scene updates */ + session->load_kernels(); + + if(session->progress.get_cancel()) + return; + if(shader_type == SHADER_EVAL_UV) { /* force UV to be available */ Pass::add(PASS_UV, scene->film->passes); diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp index 28b44df6b36..9fcd9fa85f5 100644 --- a/intern/cycles/render/session.cpp +++ b/intern/cycles/render/session.cpp @@ -592,9 +592,10 @@ void Session::run_cpu() update_progressive_refine(true); } -void Session::run() +void Session::load_kernels() { - /* load kernels */ + thread_scoped_lock scene_lock(scene->mutex); + if(!kernels_loaded) { progress.set_status("Loading render kernels (may take a few minutes the first time)"); @@ -603,6 +604,7 @@ void Session::run() if(message.empty()) message = "Failed loading render kernel, see console for errors"; + progress.set_cancel(message); progress.set_status("Error", message); progress.set_update(); return; @@ -610,6 +612,12 @@ void Session::run() kernels_loaded = true; } +} + +void Session::run() +{ + /* load kernels */ + load_kernels(); /* session thread loop */ progress.set_status("Waiting for render to start"); diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h index 4638bb8cc37..9da7a0aafa3 100644 --- a/intern/cycles/render/session.h +++ b/intern/cycles/render/session.h @@ -138,7 +138,10 @@ public: void set_pause(bool pause); void update_scene(); + void load_kernels(); + void device_free(); + protected: struct DelayedReset { thread_mutex mutex; |