[Bf-blender-cvs] [0d9e6a7] master: Fix T40262: cycles GPU bake crash due to kernels not loaded, randomly due to thread timing.

Brecht Van Lommel noreply at git.blender.org
Mon May 19 19:33:32 CEST 2014


Commit: 0d9e6a736a410991ef9a11ef87c8d23c96199823
Author: Brecht Van Lommel
Date:   Mon May 19 19:17:57 2014 +0200
https://developer.blender.org/rB0d9e6a736a410991ef9a11ef87c8d23c96199823

Fix T40262: cycles GPU bake crash due to kernels not loaded, randomly due to thread timing.

===================================================================

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/render/session.cpp
M	intern/cycles/render/session.h

===================================================================

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 01a5acd..13d4041 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 28b44df..9fcd9fa 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 4638bb8..9da7a0aa 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;




More information about the Bf-blender-cvs mailing list