[Bf-blender-cvs] [80617e8bd2] temp-cycles-denoising: Cycles Denoising: Deduplicate split/mega kernel code in the CUDADevice

Lukas Stockner noreply at git.blender.org
Fri Mar 24 20:18:23 CET 2017


Commit: 80617e8bd211c452ba12e2f50747b1f27d9b39ec
Author: Lukas Stockner
Date:   Wed Mar 15 20:16:00 2017 +0100
Branches: temp-cycles-denoising
https://developer.blender.org/rB80617e8bd211c452ba12e2f50747b1f27d9b39ec

Cycles Denoising: Deduplicate split/mega kernel code in the CUDADevice

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

M	intern/cycles/device/device_cuda.cpp

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

diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index 64496baaa8..5043844171 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -1678,60 +1678,61 @@ public:
 			/* Upload Bindless Mapping */
 			load_bindless_mapping();
 
-			if(!use_split_kernel()) {
-				/* keep rendering tiles until done */
-				while(task->acquire_tile(this, tile)) {
+			DeviceRequestedFeatures requested_features;
+			CUDASplitKernel *split_kernel = NULL;
+			if(use_split_kernel()) {
+				if(!use_adaptive_compilation()) {
+					requested_features.max_closure = 64;
+				}
+
+				split_kernel = new CUDASplitKernel(this);
+				split_kernel->load_kernels(requested_features);
+			}
+
+			/* keep rendering tiles until done */
+			while(task->acquire_tile(this, tile)) {
 				if(tile.task == RenderTile::PATH_TRACE) {
-					int start_sample = tile.start_sample;
-					int end_sample = tile.start_sample + tile.num_samples;
+					if(use_split_kernel()) {
+						device_memory void_buffer;
+						split_kernel->path_trace(task, tile, void_buffer, void_buffer);
+					}
+					else {
+						int start_sample = tile.start_sample;
+						int end_sample = tile.start_sample + tile.num_samples;
 
-					for(int sample = start_sample; sample < end_sample; sample++) {
-						if(task->get_cancel()) {
-							if(task->need_finish_queue == false)
-								break;
-						}
+						for(int sample = start_sample; sample < end_sample; sample++) {
+							if(task->get_cancel()) {
+								if(task->need_finish_queue == false)
+									break;
+							}
 
-						path_trace(tile, sample, branched);
+							path_trace(tile, sample, branched);
 
-						tile.sample = sample + 1;
+							tile.sample = sample + 1;
 
-						task->update_progress(&tile, tile.w*tile.h);
+							task->update_progress(&tile, tile.w*tile.h);
+						}
 					}
 
 					if(tile.buffers->params.overscan && !task->get_cancel()) { /* TODO(lukas) Works, but seems hacky? */
-						denoise(tile, *task, end_sample);
+						denoise(tile, *task, tile.start_sample + tile.num_samples);
 					}
 				}
 				else if(tile.task == RenderTile::DENOISE) {
 					int sample = tile.start_sample + tile.num_samples;
 					denoise(tile, *task, sample);
 					tile.sample = sample;
-					}
-
-					task->release_tile(tile);
-				}
-			}
-			else {
-				DeviceRequestedFeatures requested_features;
-				if(!use_adaptive_compilation()) {
-					requested_features.max_closure = 64;
 				}
 
-				CUDASplitKernel split_kernel(this);
-				split_kernel.load_kernels(requested_features);
-
-				while(task->acquire_tile(this, tile)) {
-					device_memory void_buffer;
-					split_kernel.path_trace(task, tile, void_buffer, void_buffer);
-
-					task->release_tile(tile);
+				task->release_tile(tile);
 
-					if(task->get_cancel()) {
-						if(task->need_finish_queue == false)
-							break;
-					}
+				if(task->get_cancel()) {
+					if(task->need_finish_queue == false)
+						break;
 				}
 			}
+
+			delete split_kernel;
 		}
 		else if(task->type == DeviceTask::SHADER) {
 			/* Upload Bindless Mapping */




More information about the Bf-blender-cvs mailing list