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;

_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to