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