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
path: root/intern
diff options
context:
space:
mode:
authorBrecht Van Lommel <brechtvanlommel@gmail.com>2014-05-19 21:17:57 +0400
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2014-05-19 21:33:09 +0400
commit0d9e6a736a410991ef9a11ef87c8d23c96199823 (patch)
treea0697ab87d06e685be81e3452348a7fd0eade07b /intern
parente97a186ffe0c3cca4a9d3edbf899f14a5de44edc (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.cpp6
-rw-r--r--intern/cycles/render/session.cpp12
-rw-r--r--intern/cycles/render/session.h3
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;