[Bf-blender-cvs] [196062d] cycles_split_kernel: Cycles: Begin implementing host side of CPU split kernel

Mai Lavelle noreply at git.blender.org
Fri Oct 21 18:17:43 CEST 2016


Commit: 196062deabef0a10614c41bd5301e82b4e2e2b5b
Author: Mai Lavelle
Date:   Fri Oct 21 18:15:31 2016 +0200
Branches: cycles_split_kernel
https://developer.blender.org/rB196062deabef0a10614c41bd5301e82b4e2e2b5b

Cycles: Begin implementing host side of CPU split kernel

Doesn't do anything yet, just getting things started.

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

M	intern/cycles/device/device_cpu.cpp

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

diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index 73babc2..9f15ac1 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -26,6 +26,7 @@
 
 #include "device.h"
 #include "device_intern.h"
+#include "device_split_kernel.h"
 
 #include "kernel.h"
 #include "kernel_compat_cpu.h"
@@ -48,6 +49,21 @@
 
 CCL_NAMESPACE_BEGIN
 
+class CPUDevice;
+
+class CPUSplitKernelFunction : public SplitKernelFunction {
+public:
+	CPUDevice* device;
+
+	CPUSplitKernelFunction(CPUDevice* device) : device(device) {}
+	~CPUSplitKernelFunction() {}
+
+	virtual bool enqueue(const KernelDimensions& dim, device_memory& kg, device_memory& data)
+	{
+		return false;
+	}
+};
+
 class CPUDevice : public Device
 {
 public:
@@ -58,11 +74,14 @@ public:
 	OSLGlobals osl_globals;
 #endif
 
-	bool split_kernel;
+	bool use_split_kernel;
+
+	DeviceRequestedFeatures requested_features;
 	
 	CPUDevice(DeviceInfo& info, Stats &stats, bool background)
 	: Device(info, stats, background)
 	{
+
 #ifdef WITH_OSL
 		kernel_globals.osl = &osl_globals;
 #endif
@@ -108,8 +127,8 @@ public:
 			VLOG(1) << "Will be using regular kernels.";
 		}
 
-		split_kernel = DebugFlags().cpu.split_kernel;
-		if(split_kernel) {
+		use_split_kernel = DebugFlags().cpu.split_kernel;
+		if(use_split_kernel) {
 			VLOG(1) << "Will be using split kernel.";
 		}
 	}
@@ -198,8 +217,14 @@ public:
 
 	void thread_run(DeviceTask *task)
 	{
-		if(task->type == DeviceTask::PATH_TRACE)
-			thread_path_trace(*task);
+		if(task->type == DeviceTask::PATH_TRACE) {
+			if(!use_split_kernel) {
+				thread_path_trace(*task);
+			}
+			else {
+				thread_path_trace_split(*task);
+			}
+		}
 		else if(task->type == DeviceTask::FILM_CONVERT)
 			thread_film_convert(*task);
 		else if(task->type == DeviceTask::SHADER)
@@ -260,7 +285,7 @@ public:
 		{
 			path_trace_kernel = kernel_cpu_path_trace;
 		}
-		
+
 		while(task.acquire_tile(this, tile)) {
 			float *render_buffer = (float*)tile.buffer;
 			uint *rng_state = (uint*)tile.rng_state;
@@ -296,6 +321,43 @@ public:
 		thread_kernel_globals_free(&kg);
 	}
 
+	void thread_path_trace_split(DeviceTask& task)
+	{
+		if(task_pool.canceled()) {
+			if(task.need_finish_queue == false)
+				return;
+		}
+
+		KernelGlobals kg = thread_kernel_globals_init();
+		RenderTile tile;
+
+		DeviceSplitKernel *split_kernel = new DeviceSplitKernel(this);
+
+		if(!split_kernel->load_kernels(requested_features)) {
+			delete split_kernel;
+
+			return;
+		}
+
+		while(task.acquire_tile(this, tile)) {
+			device_memory data;
+			split_kernel->path_trace(&task, tile, data);
+
+			tile.sample = tile.start_sample + tile.num_samples;
+
+			task.release_tile(tile);
+
+			if(task_pool.canceled()) {
+				if(task.need_finish_queue == false)
+					break;
+			}
+		}
+
+		delete split_kernel;
+
+		thread_kernel_globals_free(&kg);
+	}
+
 	void thread_film_convert(DeviceTask& task)
 	{
 		float sample_scale = 1.0f/(task.sample + 1);
@@ -517,6 +579,41 @@ protected:
 		OSLShader::thread_free(kg);
 #endif
 	}
+
+	virtual bool load_kernels(DeviceRequestedFeatures& requested_features_) {
+		requested_features = requested_features_;
+
+		return true;
+	}
+
+	/* split kernel */
+	virtual bool enqueue_split_kernel_data_init(const KernelDimensions& /*dim*/,
+	                                            RenderTile& /*rtile*/,
+	                                            int /*num_global_elements*/,
+	                                            int /*num_parallel_samples*/,
+	                                            device_memory& /*kernel_globals*/,
+	                                            device_memory& /*kernel_data*/,
+	                                            device_memory& /*split_data*/,
+	                                            device_memory& /*ray_state*/,
+	                                            device_memory& /*queue_index*/,
+	                                            device_memory& /*use_queues_flag*/,
+	                                            device_memory& /*work_pool_wgs*/)
+	{
+		assert(!"not implemented for this device");
+		return false;
+	}
+
+	virtual SplitKernelFunction* get_split_kernel_function(string /*kernel_name*/, const DeviceRequestedFeatures&)
+	{
+		CPUSplitKernelFunction *kernel = new CPUSplitKernelFunction(this);
+
+		return kernel;
+	}
+
+	virtual size_t sizeof_KernelGlobals()
+	{
+		return sizeof(KernelGlobals);
+	}
 };
 
 Device *device_cpu_create(DeviceInfo& info, Stats &stats, bool background)




More information about the Bf-blender-cvs mailing list