[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53294] trunk/blender/intern/cycles/device : Cycles: deal a bit better with errors when CUDA runs out of memory, try to avoid crashes.

Brecht Van Lommel brechtvanlommel at pandora.be
Sun Dec 23 13:53:59 CET 2012


Revision: 53294
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53294
Author:   blendix
Date:     2012-12-23 12:53:58 +0000 (Sun, 23 Dec 2012)
Log Message:
-----------
Cycles: deal a bit better with errors when CUDA runs out of memory, try to avoid crashes.

Modified Paths:
--------------
    trunk/blender/intern/cycles/device/device.h
    trunk/blender/intern/cycles/device/device_cuda.cpp

Modified: trunk/blender/intern/cycles/device/device.h
===================================================================
--- trunk/blender/intern/cycles/device/device.h	2012-12-23 12:52:10 UTC (rev 53293)
+++ trunk/blender/intern/cycles/device/device.h	2012-12-23 12:53:58 UTC (rev 53294)
@@ -84,6 +84,7 @@
 	/* info */
 	DeviceInfo info;
 	virtual const string& error_message() { return error_msg; }
+	bool have_error() { return !error_message().empty(); }
 
 	/* statistics */
 	Stats &stats;

Modified: trunk/blender/intern/cycles/device/device_cuda.cpp
===================================================================
--- trunk/blender/intern/cycles/device/device_cuda.cpp	2012-12-23 12:52:10 UTC (rev 53293)
+++ trunk/blender/intern/cycles/device/device_cuda.cpp	2012-12-23 12:53:58 UTC (rev 53294)
@@ -124,7 +124,7 @@
 			if(error_msg == "") \
 				error_msg = message; \
 			fprintf(stderr, "%s\n", message.c_str()); \
-			cuda_abort(); \
+			/*cuda_abort();*/ \
 		} \
 	}
 
@@ -326,7 +326,8 @@
 	void mem_copy_to(device_memory& mem)
 	{
 		cuda_push_context();
-		cuda_assert(cuMemcpyHtoD(cuda_device_ptr(mem.device_pointer), (void*)mem.data_pointer, mem.memory_size()))
+		if(mem.device_pointer)
+			cuda_assert(cuMemcpyHtoD(cuda_device_ptr(mem.device_pointer), (void*)mem.data_pointer, mem.memory_size()))
 		cuda_pop_context();
 	}
 
@@ -336,8 +337,13 @@
 		size_t size = elem*w*h;
 
 		cuda_push_context();
-		cuda_assert(cuMemcpyDtoH((uchar*)mem.data_pointer + offset,
-			(CUdeviceptr)((uchar*)mem.device_pointer + offset), size))
+		if(mem.device_pointer) {
+			cuda_assert(cuMemcpyDtoH((uchar*)mem.data_pointer + offset,
+				(CUdeviceptr)((uchar*)mem.device_pointer + offset), size))
+		}
+		else {
+			memset((char*)mem.data_pointer + offset, 0, size);
+		}
 		cuda_pop_context();
 	}
 
@@ -346,7 +352,8 @@
 		memset((void*)mem.data_pointer, 0, mem.memory_size());
 
 		cuda_push_context();
-		cuda_assert(cuMemsetD8(cuda_device_ptr(mem.device_pointer), 0, mem.memory_size()))
+		if(mem.device_pointer)
+			cuda_assert(cuMemsetD8(cuda_device_ptr(mem.device_pointer), 0, mem.memory_size()))
 		cuda_pop_context();
 	}
 
@@ -390,13 +397,18 @@
 			default: assert(0); return;
 		}
 
-		CUtexref texref;
+		CUtexref texref = NULL;
 
 		cuda_push_context();
 		cuda_assert(cuModuleGetTexRef(&texref, cuModule, name))
 
+		if(!texref) {
+			cuda_pop_context();
+			return;
+		}
+
 		if(interpolation) {
-			CUarray handle;
+			CUarray handle = NULL;
 			CUDA_ARRAY_DESCRIPTOR desc;
 
 			desc.Width = mem.data_width;
@@ -406,6 +418,11 @@
 
 			cuda_assert(cuArrayCreate(&handle, &desc))
 
+			if(!handle) {
+				cuda_pop_context();
+				return;
+			}
+
 			if(mem.data_height > 1) {
 				CUDA_MEMCPY2D param;
 				memset(&param, 0, sizeof(param));
@@ -481,6 +498,9 @@
 
 	void path_trace(RenderTile& rtile, int sample)
 	{
+		if(have_error())
+			return;
+
 		cuda_push_context();
 
 		CUfunction cuPathTrace;
@@ -546,6 +566,9 @@
 
 	void tonemap(DeviceTask& task, device_ptr buffer, device_ptr rgba)
 	{
+		if(have_error())
+			return;
+
 		cuda_push_context();
 
 		CUfunction cuFilmConvert;
@@ -615,6 +638,9 @@
 
 	void shader(DeviceTask& task)
 	{
+		if(have_error())
+			return;
+
 		cuda_push_context();
 
 		CUfunction cuDisplace;




More information about the Bf-blender-cvs mailing list