[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