Commit: b10c64bd2f1dae93c38e2d1cc656ea08151ab704
Author: Lukas Stockner
Date:   Wed Jul 4 14:22:38 2018 +0200
Branches: master
https://developer.blender.org/rBb10c64bd2f1dae93c38e2d1cc656ea08151ab704

Cycles Denoising: Split main function into logical steps

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

M       intern/cycles/device/device_cpu.cpp
M       intern/cycles/device/device_cuda.cpp
M       intern/cycles/device/device_denoising.cpp
M       intern/cycles/device/device_denoising.h
M       intern/cycles/device/opencl/opencl_base.cpp
M       intern/cycles/device/opencl/opencl_mega.cpp
M       intern/cycles/device/opencl/opencl_split.cpp

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

diff --git a/intern/cycles/device/device_cpu.cpp 
b/intern/cycles/device/device_cpu.cpp
index 6be60f8bbb6..81a084c03b2 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -732,8 +732,6 @@ public:
                task.map_neighbor_tiles(rtiles, this);
                denoising.tiles_from_rendertiles(rtiles);
 
-               denoising.init_from_devicetask(task);
-
                denoising.run_denoising();
 
                task.unmap_neighbor_tiles(rtiles, this);
@@ -766,7 +764,7 @@ public:
                }
 
                RenderTile tile;
-               DenoisingTask denoising(this);
+               DenoisingTask denoising(this, task);
 
                while(task.acquire_tile(this, tile)) {
                        if(tile.task == RenderTile::PATH_TRACE) {
diff --git a/intern/cycles/device/device_cuda.cpp 
b/intern/cycles/device/device_cuda.cpp
index bf5a95dd233..34c64feb80a 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -1632,8 +1632,6 @@ public:
                task.map_neighbor_tiles(rtiles, this);
                denoising.tiles_from_rendertiles(rtiles);
 
-               denoising.init_from_devicetask(task);
-
                denoising.run_denoising();
 
                task.unmap_neighbor_tiles(rtiles, this);
@@ -2074,7 +2072,7 @@ public:
 
                        /* keep rendering tiles until done */
                        RenderTile tile;
-                       DenoisingTask denoising(this);
+                       DenoisingTask denoising(this, *task);
 
                        while(task->acquire_tile(this, tile)) {
                                if(tile.task == RenderTile::PATH_TRACE) {
diff --git a/intern/cycles/device/device_denoising.cpp 
b/intern/cycles/device/device_denoising.cpp
index 644cf6cd10e..4d2ba508aec 100644
--- a/intern/cycles/device/device_denoising.cpp
+++ b/intern/cycles/device/device_denoising.cpp
@@ -20,12 +20,24 @@
 
 CCL_NAMESPACE_BEGIN
 
-DenoisingTask::DenoisingTask(Device *device)
+DenoisingTask::DenoisingTask(Device *device, const DeviceTask &task)
 : tiles_mem(device, "denoising tiles_mem", MEM_READ_WRITE),
   storage(device),
   buffer(device),
   device(device)
 {
+       radius = task.denoising_radius;
+       nlm_k_2 = powf(2.0f, lerp(-5.0f, 3.0f, task.denoising_strength));
+       if(task.denoising_relative_pca) {
+               pca_threshold = -powf(10.0f, lerp(-8.0f, 0.0f, 
task.denoising_feature_strength));
+       }
+       else {
+               pca_threshold = powf(10.0f, lerp(-5.0f, 3.0f, 
task.denoising_feature_strength));
+       }
+
+       render_buffer.pass_stride = task.pass_stride;
+       render_buffer.denoising_data_offset = task.pass_denoising_data;
+       render_buffer.denoising_clean_offset = task.pass_denoising_clean;
 }
 
 DenoisingTask::~DenoisingTask()
@@ -41,26 +53,6 @@ DenoisingTask::~DenoisingTask()
        tiles_mem.free();
 }
 
-void DenoisingTask::init_from_devicetask(const DeviceTask &task)
-{
-       radius = task.denoising_radius;
-       nlm_k_2 = powf(2.0f, lerp(-5.0f, 3.0f, task.denoising_strength));
-       if(task.denoising_relative_pca) {
-               pca_threshold = -powf(10.0f, lerp(-8.0f, 0.0f, 
task.denoising_feature_strength));
-       }
-       else {
-               pca_threshold = powf(10.0f, lerp(-5.0f, 3.0f, 
task.denoising_feature_strength));
-       }
-
-       render_buffer.pass_stride = task.pass_stride;
-       render_buffer.denoising_data_offset  = task.pass_denoising_data;
-       render_buffer.denoising_clean_offset = task.pass_denoising_clean;
-
-       /* Expand filter_area by radius pixels and clamp the result to the 
extent of the neighboring tiles */
-       rect = rect_from_shape(filter_area.x, filter_area.y, filter_area.z, 
filter_area.w);
-       rect = rect_expand(rect, radius);
-       rect = rect_clip(rect, make_int4(tiles->x[0], tiles->y[0], tiles->x[3], 
tiles->y[3]));
-}
 
 void DenoisingTask::tiles_from_rendertiles(RenderTile *rtiles)
 {
@@ -88,120 +80,142 @@ void DenoisingTask::tiles_from_rendertiles(RenderTile 
*rtiles)
        functions.set_tiles(buffers);
 }
 
-bool DenoisingTask::run_denoising()
+void DenoisingTask::setup_denoising_buffer()
 {
-       /* Allocate denoising buffer. */
+       /* Expand filter_area by radius pixels and clamp the result to the 
extent of the neighboring tiles */
+       rect = rect_from_shape(filter_area.x, filter_area.y, filter_area.z, 
filter_area.w);
+       rect = rect_expand(rect, radius);
+       rect = rect_clip(rect, make_int4(tiles->x[0], tiles->y[0], tiles->x[3], 
tiles->y[3]));
+
        buffer.passes = 14;
        buffer.width = rect.z - rect.x;
        buffer.stride = align_up(buffer.width, 4);
        buffer.h = rect.w - rect.y;
-       buffer.pass_stride = align_up(buffer.stride * buffer.h, 
divide_up(device->mem_sub_ptr_alignment(), sizeof(float)));
-       buffer.mem.alloc_to_device(buffer.pass_stride * buffer.passes, false);
+       int alignment_floats = divide_up(device->mem_sub_ptr_alignment(), 
sizeof(float));
+       buffer.pass_stride = align_up(buffer.stride * buffer.h, 
alignment_floats);
+       /* Pad the total size by four floats since the SIMD kernels might go a 
bit over the end. */
+       int mem_size = align_up(buffer.pass_stride * buffer.passes + 4, 
alignment_floats);
+       buffer.mem.alloc_to_device(mem_size, false);
+}
 
+void DenoisingTask::prefilter_shadowing()
+{
        device_ptr null_ptr = (device_ptr) 0;
 
-       /* Prefilter shadow feature. */
-       {
-               device_sub_ptr unfiltered_a   (buffer.mem, 0,                   
 buffer.pass_stride);
-               device_sub_ptr unfiltered_b   (buffer.mem, 
1*buffer.pass_stride, buffer.pass_stride);
-               device_sub_ptr sample_var     (buffer.mem, 
2*buffer.pass_stride, buffer.pass_stride);
-               device_sub_ptr sample_var_var (buffer.mem, 
3*buffer.pass_stride, buffer.pass_stride);
-               device_sub_ptr buffer_var     (buffer.mem, 
5*buffer.pass_stride, buffer.pass_stride);
-               device_sub_ptr filtered_var   (buffer.mem, 
6*buffer.pass_stride, buffer.pass_stride);
-               device_sub_ptr nlm_temporary_1(buffer.mem, 
7*buffer.pass_stride, buffer.pass_stride);
-               device_sub_ptr nlm_temporary_2(buffer.mem, 
8*buffer.pass_stride, buffer.pass_stride);
-               device_sub_ptr nlm_temporary_3(buffer.mem, 
9*buffer.pass_stride, buffer.pass_stride);
-
-               nlm_state.temporary_1_ptr = *nlm_temporary_1;
-               nlm_state.temporary_2_ptr = *nlm_temporary_2;
-               nlm_state.temporary_3_ptr = *nlm_temporary_3;
-
-               /* Get the A/B unfiltered passes, the combined sample variance, 
the estimated variance of the sample variance and the buffer variance. */
-               functions.divide_shadow(*unfiltered_a, *unfiltered_b, 
*sample_var, *sample_var_var, *buffer_var);
-
-               /* Smooth the (generally pretty noisy) buffer variance using 
the spatial information from the sample variance. */
-               nlm_state.set_parameters(6, 3, 4.0f, 1.0f);
-               functions.non_local_means(*buffer_var, *sample_var, 
*sample_var_var, *filtered_var);
-
-               /* Reuse memory, the previous data isn't needed anymore. */
-               device_ptr filtered_a = *buffer_var,
-                          filtered_b = *sample_var;
-               /* Use the smoothed variance to filter the two shadow half 
images using each other for weight calculation. */
-               nlm_state.set_parameters(5, 3, 1.0f, 0.25f);
-               functions.non_local_means(*unfiltered_a, *unfiltered_b, 
*filtered_var, filtered_a);
-               functions.non_local_means(*unfiltered_b, *unfiltered_a, 
*filtered_var, filtered_b);
-
-               device_ptr residual_var = *sample_var_var;
-               /* Estimate the residual variance between the two filtered 
halves. */
-               functions.combine_halves(filtered_a, filtered_b, null_ptr, 
residual_var, 2, rect);
-
-               device_ptr final_a = *unfiltered_a,
-                          final_b = *unfiltered_b;
-               /* Use the residual variance for a second filter pass. */
-               nlm_state.set_parameters(4, 2, 1.0f, 0.5f);
-               functions.non_local_means(filtered_a, filtered_b, residual_var, 
final_a);
-               functions.non_local_means(filtered_b, filtered_a, residual_var, 
final_b);
-
-               /* Combine the two double-filtered halves to a final shadow 
feature. */
-               device_sub_ptr shadow_pass(buffer.mem, 4*buffer.pass_stride, 
buffer.pass_stride);
-               functions.combine_halves(final_a, final_b, *shadow_pass, 
null_ptr, 0, rect);
-       }
+       device_sub_ptr unfiltered_a   (buffer.mem, 0,                    
buffer.pass_stride);
+       device_sub_ptr unfiltered_b   (buffer.mem, 1*buffer.pass_stride, 
buffer.pass_stride);
+       device_sub_ptr sample_var     (buffer.mem, 2*buffer.pass_stride, 
buffer.pass_stride);
+       device_sub_ptr sample_var_var (buffer.mem, 3*buffer.pass_stride, 
buffer.pass_stride);
+       device_sub_ptr buffer_var     (buffer.mem, 5*buffer.pass_stride, 
buffer.pass_stride);
+       device_sub_ptr filtered_var   (buffer.mem, 6*buffer.pass_stride, 
buffer.pass_stride);
+       device_sub_ptr nlm_temporary_1(buffer.mem, 7*buffer.pass_stride, 
buffer.pass_stride);
+       device_sub_ptr nlm_temporary_2(buffer.mem, 8*buffer.pass_stride, 
buffer.pass_stride);
+       device_sub_ptr nlm_temporary_3(buffer.mem, 9*buffer.pass_stride, 
buffer.pass_stride);
+
+       nlm_state.temporary_1_ptr = *nlm_temporary_1;
+       nlm_state.temporary_2_ptr = *nlm_temporary_2;
+       nlm_state.temporary_3_ptr = *nlm_temporary_3;
+
+       /* Get the A/B unfiltered passes, the combined sample variance, the 
estimated variance of the sample variance and the buffer variance. */
+       functions.divide_shadow(*unfiltered_a, *unfiltered_b, *sample_var, 
*sample_var_var, *buffer_var);
+
+       /* Smooth the (generally pretty noisy) buffer variance using the 
spatial information from the sample variance. */
+       nlm_state.set_parameters(6, 3, 4.0f, 1.0f);
+       functions.non_local_means(*buffer_var, *sample_var, *sample_var_var, 
*filtered_var);
+
+       /* Reuse memory, the previous data isn't needed anymore. */
+       device_ptr filtered_a = *buffer_var,
+                  filtered_b = *sample_var;
+       /* Use the smoothed variance to filter the two shadow half images using 
each other for weight calculation. */
+       nlm_state.set_parameters(5, 3, 1.0f, 0.25f);
+       functions.non_local_means(*unfiltered_a, *unfiltered_b, *filtered_var, 
filtered_a);
+       functions.non_local_means(*unfiltered_b, *unfiltered_a, *filtered_var, 
filtered_b);
+
+       device_ptr residual_var = *sample_var_var;
+       /* Estimate the residual variance between the two filtered halves. */
+       functions.combine_halves(filtered_a, filtered_b, null_ptr, 
residual_var, 2, rect);
+
+       device_ptr final_a = *unfiltered_a,
+                  final_b = *unfiltered_b;
+       /* Use the residual variance for a second filter pass. */
+       nlm_state.set_parameters(4, 2, 1.0f, 0.5f);
+       functions.non_local_means(filtered_a, filtered_b, residual_var, 
final_a);
+       functions.non_local_means(filtered_b, filtered_a, residual_var, 
final_b);
+
+       /* Combine the two double-filtered halves to a final shadow feature. */
+       device_sub_ptr shadow_pass(buffer.mem, 4*buffer.pass_stride, 
buffer.pass_stride);
+       functions.combine_halves(fi

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to