[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [50932] trunk/blender/intern/cycles/render : Fix #32618: cycles multithreaded image loading could crash with CUDA, was a

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Sep 27 19:42:10 CEST 2012


Revision: 50932
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50932
Author:   blendix
Date:     2012-09-27 17:42:09 +0000 (Thu, 27 Sep 2012)
Log Message:
-----------
Fix #32618: cycles multithreaded image loading could crash with CUDA, was a
threading issue that happens once every X frames.

Modified Paths:
--------------
    trunk/blender/intern/cycles/render/image.cpp
    trunk/blender/intern/cycles/render/image.h

Modified: trunk/blender/intern/cycles/render/image.cpp
===================================================================
--- trunk/blender/intern/cycles/render/image.cpp	2012-09-27 15:49:15 UTC (rev 50931)
+++ trunk/blender/intern/cycles/render/image.cpp	2012-09-27 17:42:09 UTC (rev 50932)
@@ -366,8 +366,10 @@
 
 		device_vector<float4>& tex_img = dscene->tex_float_image[slot];
 
-		if(tex_img.device_pointer)
+		if(tex_img.device_pointer) {
+			thread_scoped_lock device_lock(device_mutex);
 			device->tex_free(tex_img);
+		}
 
 		if(!file_load_float_image(img, tex_img)) {
 			/* on failure to load, we set a 1x1 pixels pink image */
@@ -384,8 +386,10 @@
 		if(slot >= 10) name = string_printf("__tex_image_float_0%d", slot);
 		else name = string_printf("__tex_image_float_00%d", slot);
 
-		if(!pack_images)
+		if(!pack_images) {
+			thread_scoped_lock device_lock(device_mutex);
 			device->tex_alloc(name.c_str(), tex_img, true, true);
+		}
 	}
 	else {
 		string filename = path_filename(images[slot - tex_image_byte_start]->filename);
@@ -393,8 +397,10 @@
 
 		device_vector<uchar4>& tex_img = dscene->tex_image[slot - tex_image_byte_start];
 
-		if(tex_img.device_pointer)
+		if(tex_img.device_pointer) {
+			thread_scoped_lock device_lock(device_mutex);
 			device->tex_free(tex_img);
+		}
 
 		if(!file_load_image(img, tex_img)) {
 			/* on failure to load, we set a 1x1 pixels pink image */
@@ -411,8 +417,10 @@
 		if(slot >= 10) name = string_printf("__tex_image_0%d", slot);
 		else name = string_printf("__tex_image_00%d", slot);
 
-		if(!pack_images)
+		if(!pack_images) {
+			thread_scoped_lock device_lock(device_mutex);
 			device->tex_alloc(name.c_str(), tex_img, true, true);
+		}
 	}
 
 	img->need_load = false;
@@ -440,16 +448,28 @@
 #endif
 		}
 		else if(is_float) {
-			device->tex_free(dscene->tex_float_image[slot]);
-			dscene->tex_float_image[slot].clear();
+			device_vector<float4>& tex_img = dscene->tex_float_image[slot];
 
+			if(tex_img.device_pointer) {
+				thread_scoped_lock device_lock(device_mutex);
+				device->tex_free(tex_img);
+			}
+
+			tex_img.clear();
+
 			delete float_images[slot];
 			float_images[slot] = NULL;
 		}
 		else {
-			device->tex_free(dscene->tex_image[slot - tex_image_byte_start]);
-			dscene->tex_image[slot - tex_image_byte_start].clear();
+			device_vector<uchar4>& tex_img = dscene->tex_image[slot - tex_image_byte_start];
 
+			if(tex_img.device_pointer) {
+				thread_scoped_lock device_lock(device_mutex);
+				device->tex_free(tex_img);
+			}
+
+			tex_img.clear();
+
 			delete images[slot - tex_image_byte_start];
 			images[slot - tex_image_byte_start] = NULL;
 		}
@@ -460,7 +480,7 @@
 {
 	if(!need_update)
 		return;
-	
+
 	TaskPool pool;
 
 	for(size_t slot = 0; slot < images.size(); slot++) {
@@ -542,9 +562,9 @@
 		device_free_image(device, dscene, slot);
 
 	device->tex_free(dscene->tex_image_packed);
+	device->tex_free(dscene->tex_image_packed_info);
+
 	dscene->tex_image_packed.clear();
-
-	device->tex_free(dscene->tex_image_packed_info);
 	dscene->tex_image_packed_info.clear();
 
 	images.clear();

Modified: trunk/blender/intern/cycles/render/image.h
===================================================================
--- trunk/blender/intern/cycles/render/image.h	2012-09-27 15:49:15 UTC (rev 50931)
+++ trunk/blender/intern/cycles/render/image.h	2012-09-27 17:42:09 UTC (rev 50932)
@@ -22,6 +22,7 @@
 #include "device_memory.h"
 
 #include "util_string.h"
+#include "util_thread.h"
 #include "util_vector.h"
 
 CCL_NAMESPACE_BEGIN
@@ -66,6 +67,7 @@
 	int tex_num_images;
 	int tex_num_float_images;
 	int tex_image_byte_start;
+	thread_mutex device_mutex;
 
 	struct Image {
 		string filename;




More information about the Bf-blender-cvs mailing list