[Bf-blender-cvs] [e755ecd] soc-2016-cycles_denoising: Cycles: Support denoising after rendering on CUDA

Lukas Stockner noreply at git.blender.org
Mon Jul 11 23:32:19 CEST 2016


Commit: e755ecde9f0101fceea9577499acaae5ef134d58
Author: Lukas Stockner
Date:   Fri Jul 8 04:36:59 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBe755ecde9f0101fceea9577499acaae5ef134d58

Cycles: Support denoising after rendering on CUDA

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

M	intern/cycles/blender/blender_sync.cpp
M	intern/cycles/device/device_cuda.cpp
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/buffers.h
M	intern/cycles/render/session.cpp

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

diff --git a/intern/cycles/blender/blender_sync.cpp b/intern/cycles/blender/blender_sync.cpp
index f1bbc3d..457b258 100644
--- a/intern/cycles/blender/blender_sync.cpp
+++ b/intern/cycles/blender/blender_sync.cpp
@@ -814,6 +814,8 @@ RenderBuffers* BlenderSync::get_render_buffer(Device *device,
 			buffer->get_pass_rect(type, 1.0f, samples, b_pass->channels(), rect, b_rect.data, true);
 	}
 
+	buffer->copy_to_device();
+
 	return buffer;
 }
 
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index c0bf5c1..7bb565c 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -1310,7 +1310,9 @@ public:
 					}
 				}
 				else if(tile.task == RenderTile::DENOISE) {
-					assert(!"Explicitly scheduling tiles for denoising isn't supported on GPUs yet!");
+					int sample = tile.start_sample + tile.num_samples;
+					denoise(tile, sample);
+					tile.sample = sample;
 				}
 
 				task->release_tile(tile);
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 4a8f869..179cee2 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -181,6 +181,16 @@ bool RenderBuffers::copy_from_device()
 	return true;
 }
 
+bool RenderBuffers::copy_to_device()
+{
+	if(!buffer.device_pointer)
+		return false;
+
+	device->mem_copy_to(buffer);
+
+	return true;
+}
+
 /* When calling from the BlenderSession, rect is in final image coordinates.
  * To make addressing the buffer easier, rect is brought to "buffer coordinates"
  * where the buffer starts at (0, 0) and ends at (width, height). */
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index eeb95d7..d7e7047 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -112,6 +112,7 @@ public:
 	void reset(Device *device, BufferParams& params);
 
 	bool copy_from_device();
+	bool copy_to_device();
 	bool get_pass_rect(PassType type, float exposure, int sample, int components, int4 rect, float *pixels, bool read_pixels = false);
 	bool get_denoising_rect(int denoising_pass, float exposure, int sample, int components, int4 rect, float *pixels, bool read_pixels = false);
 
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index d1462a1..401e35e 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -765,6 +765,24 @@ void Session::run()
 void Session::run_denoise()
 {
 	if(!progress.get_cancel()) {
+		if(!kernels_loaded) {
+			progress.set_status("Loading render kernels (may take a few minutes the first time)");
+
+			DeviceRequestedFeatures requested_features;
+			if(!device->load_kernels(requested_features)) {
+				string message = device->error_message();
+				if(message.empty())
+					message = "Failed loading render kernel, see console for errors";
+
+				progress.set_error(message);
+				progress.set_status("Error", message);
+				progress.set_update();
+				return;
+			}
+
+			kernels_loaded = true;
+		}
+
 		progress.reset_sample();
 		tile_manager.reset(buffers->params, params.samples);
 		tile_manager.state.global_buffers = buffers;




More information about the Bf-blender-cvs mailing list