[Bf-blender-cvs] [8308c5632e] soc-2016-cycles_denoising: Cycles Denoising: Support GPU denoising from the command line

Lukas Stockner noreply at git.blender.org
Sat Feb 4 04:09:01 CET 2017


Commit: 8308c5632ecb28294e15b594e94b559bbfb294a7
Author: Lukas Stockner
Date:   Thu Feb 2 00:45:16 2017 +0100
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB8308c5632ecb28294e15b594e94b559bbfb294a7

Cycles Denoising: Support GPU denoising from the command line

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

M	intern/cycles/blender/blender_python.cpp
M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/blender/blender_sync.h

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

diff --git a/intern/cycles/blender/blender_python.cpp b/intern/cycles/blender/blender_python.cpp
index 11308272bf..6f3ebb851f 100644
--- a/intern/cycles/blender/blender_python.cpp
+++ b/intern/cycles/blender/blender_python.cpp
@@ -137,6 +137,24 @@ void python_thread_state_restore(void **python_thread_state)
 	*python_thread_state = NULL;
 }
 
+static PointerRNA get_user_preferences()
+{
+	PyObject *bpy = PyImport_ImportModule("bpy");
+	PyObject *pycontext = PyObject_GetAttrString(bpy, "context");
+	PyObject *pyuserpref = PyObject_GetAttrString(pycontext, "user_preferences");
+	PyObject *pyptr = PyObject_CallMethod(pyuserpref, "as_pointer", NULL);
+
+	PointerRNA ptr;
+	RNA_pointer_create(NULL, &RNA_UserPreferences, (void*)PyLong_AsVoidPtr(pyptr), &ptr);
+
+	Py_DECREF(pyptr);
+	Py_DECREF(pyuserpref);
+	Py_DECREF(pycontext);
+	Py_DECREF(bpy);
+
+	return ptr;
+}
+
 static const char *PyC_UnicodeAsByte(PyObject *py_str, PyObject **coerce)
 {
 	const char *result = _PyUnicode_AsString(py_str);
@@ -751,11 +769,11 @@ static PyObject *denoise_files_func(PyObject * /*self*/, PyObject *args, PyObjec
 	session_params.threads = 0;
 
 	PyObject *pyframelist;
-	int midframe, half_output = 0;
+	int midframe, half_output = 0, use_gpu = 0;
 	const char *output = NULL;
 
-	static const char* keylist[] = {"frames", "midframe", "output", "half_float", "samples", "threads", "tile_x", "tile_y", "filter_strength", "filter_weight_adjust"};
-	if(!PyArg_ParseTupleAndKeywords(args, keywords, "Ois|piiiiff", const_cast<char **>(keylist), &pyframelist, &midframe, &output, &half_output,
+	static const char* keylist[] = {"frames", "midframe", "output", "half_float", "use_gpu", "samples", "threads", "tile_x", "tile_y", "filter_strength", "filter_weight_adjust"};
+	if(!PyArg_ParseTupleAndKeywords(args, keywords, "Ois|ppiiiiff", const_cast<char **>(keylist), &pyframelist, &midframe, &output, &half_output, &use_gpu,
 	                                &session_params.samples, &session_params.threads, &session_params.tile_size.x, &session_params.tile_size.y,
 	                                &session_params.filter_strength, &session_params.filter_weight_adjust)) {
 		return NULL;
@@ -763,6 +781,9 @@ static PyObject *denoise_files_func(PyObject * /*self*/, PyObject *args, PyObjec
 	session_params.output_half_float = (half_output > 0);
 	session_params.output_path = string(output);
 
+	BL::UserPreferences b_userpref(get_user_preferences());
+	session_params.device = BlenderSync::get_device_info(b_userpref, use_gpu);
+
 	int numframes = PyList_Size(pyframelist);
 	if(numframes < 1) {
 		Py_RETURN_FALSE;
diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index 093870eebb..9985029635 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -683,35 +683,30 @@ bool BlenderSync::get_session_pause(BL::Scene& b_scene, bool background)
 	return (background)? false: get_boolean(cscene, "preview_pause");
 }
 
-SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
-                                              BL::UserPreferences& b_userpref,
-                                              BL::Scene& b_scene,
-                                              bool background)
+DeviceInfo BlenderSync::get_device_info(BL::UserPreferences& b_userpref, int device_type)
 {
-	SessionParams params;
-	PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
-
-	/* feature set */
-	params.experimental = (get_enum(cscene, "feature_set") != 0);
+	DeviceInfo cpu;
 
 	/* device type */
 	vector<DeviceInfo>& devices = Device::available_devices();
-	
+
 	/* device default CPU */
 	foreach(DeviceInfo& device, devices) {
 		if(device.type == DEVICE_CPU) {
-			params.device = device;
+			cpu = device;
 			break;
 		}
 	}
 
-	if(get_enum(cscene, "device") == 2) {
+	if(device_type == 2) {
 		/* find network device */
-		foreach(DeviceInfo& info, devices)
-			if(info.type == DEVICE_NETWORK)
-				params.device = info;
+		foreach(DeviceInfo& info, devices) {
+			if(info.type == DEVICE_NETWORK) {
+				return info;
+			}
+		}
 	}
-	else if(get_enum(cscene, "device") == 1) {
+	else if(device_type == 1) {
 		PointerRNA b_preferences;
 
 		BL::UserPreferences::addons_iterator b_addon_iter;
@@ -739,15 +734,31 @@ SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
 			} RNA_END
 
 			if(used_devices.size() == 1) {
-				params.device = used_devices[0];
+				return used_devices[0];
 			}
 			else if(used_devices.size() > 1) {
-				params.device = Device::get_multi_device(used_devices);
+				return Device::get_multi_device(used_devices);
 			}
-			/* Else keep using the CPU device that was set before. */
 		}
 	}
 
+	return cpu;
+}
+
+SessionParams BlenderSync::get_session_params(BL::RenderEngine& b_engine,
+                                              BL::UserPreferences& b_userpref,
+                                              BL::Scene& b_scene,
+                                              bool background)
+{
+	SessionParams params;
+	PointerRNA cscene = RNA_pointer_get(&b_scene.ptr, "cycles");
+
+	/* feature set */
+	params.experimental = (get_enum(cscene, "feature_set") != 0);
+
+	/* device */
+	params.device = BlenderSync::get_device_info(b_userpref, get_enum(cscene, "device"));
+
 	/* Background */
 	params.background = background;
 
diff --git a/intern/cycles/blender/blender_sync.h b/intern/cycles/blender/blender_sync.h
index 5a221562a6..23420b25c1 100644
--- a/intern/cycles/blender/blender_sync.h
+++ b/intern/cycles/blender/blender_sync.h
@@ -103,6 +103,8 @@ public:
 	static PassType get_pass_type(BL::RenderPass& b_pass);
 	static DenoisingPassType get_denoising_pass_type(BL::RenderPass& b_pass);
 
+	static DeviceInfo get_device_info(BL::UserPreferences& b_userpref, int device_type);
+
 private:
 	/* sync */
 	void sync_lamps(bool update_all);




More information about the Bf-blender-cvs mailing list