[Bf-blender-cvs] [e1f5b6bdcb2] temp-cycles-denoising: Cycles Denoising: Merge all the changes from the version that's being reviewed
Lukas Stockner
noreply at git.blender.org
Wed Apr 26 19:32:11 CEST 2017
Commit: e1f5b6bdcb20f5a58b1049761aa07971d2c69346
Author: Lukas Stockner
Date: Mon Apr 24 22:15:09 2017 +0200
Branches: temp-cycles-denoising
https://developer.blender.org/rBe1f5b6bdcb20f5a58b1049761aa07971d2c69346
Cycles Denoising: Merge all the changes from the version that's being reviewed
No functional changes.
===================================================================
M intern/cycles/blender/blender_session.cpp
M intern/cycles/device/device.cpp
M intern/cycles/device/device.h
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_memory.h
M intern/cycles/device/device_multi.cpp
M intern/cycles/device/device_task.h
M intern/cycles/device/opencl/opencl.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
M intern/cycles/device/opencl/opencl_util.cpp
M intern/cycles/kernel/closure/bsdf.h
D intern/cycles/kernel/closure/bssrdf.h.orig
M intern/cycles/kernel/filter/filter_defines.h
M intern/cycles/kernel/filter/filter_features.h
M intern/cycles/kernel/filter/filter_features_sse.h
M intern/cycles/kernel/filter/filter_nlm_cpu.h
M intern/cycles/kernel/filter/filter_nlm_gpu.h
M intern/cycles/kernel/filter/filter_prefilter.h
M intern/cycles/kernel/filter/filter_reconstruction.h
M intern/cycles/kernel/filter/filter_transform.h
M intern/cycles/kernel/filter/filter_transform_gpu.h
M intern/cycles/kernel/filter/filter_transform_sse.h
M intern/cycles/kernel/kernel_compat_cpu.h
M intern/cycles/kernel/kernel_compat_cuda.h
M intern/cycles/kernel/kernel_compat_opencl.h
M intern/cycles/kernel/kernel_passes.h
M intern/cycles/kernel/kernel_path.h
M intern/cycles/kernel/kernel_path_branched.h
M intern/cycles/kernel/kernel_path_surface.h
M intern/cycles/kernel/kernel_types.h
M intern/cycles/kernel/kernels/cuda/filter.cu
M intern/cycles/kernel/kernels/opencl/filter.cl
D intern/cycles/kernel/split/kernel_holdout_emission_blurring_pathtermination_ao.h.orig
D intern/cycles/kernel/svm/svm_types.h.orig
M intern/cycles/render/buffers.cpp
M intern/cycles/render/film.cpp
M intern/cycles/render/film.h
M intern/cycles/render/session.cpp
M intern/cycles/render/session.h
M intern/cycles/render/tile.cpp
M intern/cycles/render/tile.h
M intern/cycles/test/CMakeLists.txt
D intern/cycles/util/util_cuda.h
M intern/cycles/util/util_math_matrix.h
M intern/cycles/util/util_types.h
M source/blender/blenloader/intern/versioning_270.c
M source/blender/makesdna/DNA_scene_types.h
===================================================================
diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 3ed005a2919..de7e9de6a78 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -519,13 +519,9 @@ void BlenderSession::render()
scene->film->denoising_clean_pass = (scene->film->denoising_flags & DENOISING_CLEAN_ALL_PASSES);
buffer_params.denoising_clean_pass = scene->film->denoising_clean_pass;
session->params.denoising_radius = b_layer_iter->denoising_radius();
- session->params.denoising_k2 = powf(2.0f, b_layer_iter->denoising_strength() - 1.0f);
- if(b_layer_iter->denoising_relative_pca()) {
- session->params.denoising_pca = -powf(10.0f, b_layer_iter->denoising_feature_strength() - 4.0f);
- }
- else {
- session->params.denoising_pca = powf(10.0f, b_layer_iter->denoising_feature_strength() - 1.0f);
- }
+ session->params.denoising_strength = b_layer_iter->denoising_strength();
+ session->params.denoising_feature_strength = b_layer_iter->denoising_feature_strength();
+ session->params.denoising_relative_pca = b_layer_iter->denoising_relative_pca();
scene->film->pass_alpha_threshold = b_layer_iter->pass_alpha_threshold();
scene->film->tag_passes_update(scene, passes);
diff --git a/intern/cycles/device/device.cpp b/intern/cycles/device/device.cpp
index 9c37e3fa5cb..7688505a119 100644
--- a/intern/cycles/device/device.cpp
+++ b/intern/cycles/device/device.cpp
@@ -401,15 +401,15 @@ void Device::free_memory()
}
-offset_ptr::offset_ptr(Device *device, device_memory& mem, int offset, int size, MemoryType type)
+device_sub_ptr::device_sub_ptr(Device *device, device_memory& mem, int offset, int size, MemoryType type)
: device(device)
{
- ptr = device->mem_get_offset_ptr(mem, offset, size, type);
+ ptr = device->mem_alloc_sub_ptr(mem, offset, size, type);
}
-offset_ptr::~offset_ptr()
+device_sub_ptr::~device_sub_ptr()
{
- device->mem_free_offset_ptr(ptr);
+ device->mem_free_sub_ptr(ptr);
}
CCL_NAMESPACE_END
diff --git a/intern/cycles/device/device.h b/intern/cycles/device/device.h
index cc929bedfa6..604dcd9fd53 100644
--- a/intern/cycles/device/device.h
+++ b/intern/cycles/device/device.h
@@ -220,6 +220,7 @@ struct DeviceDrawParams {
};
class Device {
+ friend class device_sub_ptr;
protected:
Device(DeviceInfo& info_, Stats &stats_, bool background) : background(background), vertex_buffer(0), info(info_), stats(stats_) {}
@@ -229,6 +230,14 @@ protected:
/* used for real time display */
unsigned int vertex_buffer;
+ virtual device_ptr mem_alloc_sub_ptr(device_memory& /*mem*/, int /*offset*/, int /*size*/, MemoryType /*type*/)
+ {
+ /* Only required for devices that implement denoising. */
+ assert(false);
+ return (device_ptr) 0;
+ }
+ virtual void mem_free_sub_ptr(device_ptr /*ptr*/) {};
+
public:
virtual ~Device();
@@ -257,14 +266,7 @@ public:
virtual void mem_zero(device_memory& mem) = 0;
virtual void mem_free(device_memory& mem) = 0;
- virtual int mem_get_offset_alignment() { return 1; }
- virtual device_ptr mem_get_offset_ptr(device_memory& /*mem*/, int /*offset*/, int /*size*/, MemoryType /*type*/)
- {
- /* Only required for devices that implement denoising. */
- assert(false);
- return (device_ptr) 0;
- }
- virtual void mem_free_offset_ptr(device_ptr /*ptr*/) {};
+ virtual int mem_address_alignment() { return 16; }
/* constant memory */
virtual void const_copy_to(const char *name, void *host, size_t size) = 0;
diff --git a/intern/cycles/device/device_cpu.cpp b/intern/cycles/device/device_cpu.cpp
index efced170434..13a12a137e1 100644
--- a/intern/cycles/device/device_cpu.cpp
+++ b/intern/cycles/device/device_cpu.cpp
@@ -308,9 +308,9 @@ public:
}
}
- virtual device_ptr mem_get_offset_ptr(device_memory& mem, int offset, int /*size*/, MemoryType /*type*/)
+ virtual device_ptr mem_alloc_sub_ptr(device_memory& mem, int offset, int /*size*/, MemoryType /*type*/)
{
- return (device_ptr) (((char*) mem.device_pointer) + mem.memory_num_to_bytes(offset));
+ return (device_ptr) (((char*) mem.device_pointer) + mem.memory_elements_size(offset));
}
void const_copy_to(const char *name, void *host, size_t size)
@@ -637,14 +637,14 @@ public:
RenderTile rtiles[9];
rtiles[4] = tile;
- task.get_neighbor_tiles(rtiles, this);
+ task.map_neighbor_tiles(rtiles, this);
denoising.tiles_from_rendertiles(rtiles);
denoising.init_from_devicetask(task);
denoising.run_denoising();
- task.release_neighbor_tiles(rtiles, this);
+ task.unmap_neighbor_tiles(rtiles, this);
task.update_progress(&tile, tile.w*tile.h);
}
diff --git a/intern/cycles/device/device_cuda.cpp b/intern/cycles/device/device_cuda.cpp
index 151f88872d5..77b6eb4c6eb 100644
--- a/intern/cycles/device/device_cuda.cpp
+++ b/intern/cycles/device/device_cuda.cpp
@@ -603,9 +603,9 @@ public:
}
}
- virtual device_ptr mem_get_offset_ptr(device_memory& mem, int offset, int /*size*/, MemoryType /*type*/)
+ virtual device_ptr mem_alloc_sub_ptr(device_memory& mem, int offset, int /*size*/, MemoryType /*type*/)
{
- return (device_ptr) (((char*) mem.device_pointer) + mem.memory_num_to_bytes(offset));
+ return (device_ptr) (((char*) mem.device_pointer) + mem.memory_elements_size(offset));
}
void const_copy_to(const char *name, void *host, size_t size)
@@ -944,7 +944,7 @@ public:
cuda_push_context();
int4 rect = task->rect;
- int w = align_up(rect.z-rect.x, 4);
+ int w = rect.z-rect.x;
int h = rect.w-rect.y;
int r = task->nlm_state.r;
int f = task->nlm_state.f;
@@ -1260,14 +1260,14 @@ public:
RenderTile rtiles[9];
rtiles[4] = rtile;
- task.get_neighbor_tiles(rtiles, this);
+ task.map_neighbor_tiles(rtiles, this);
denoising.tiles_from_rendertiles(rtiles);
denoising.init_from_devicetask(task);
denoising.run_denoising();
- task.release_neighbor_tiles(rtiles, this);
+ task.unmap_neighbor_tiles(rtiles, this);
}
void path_trace(RenderTile& rtile, int sample, bool branched)
diff --git a/intern/cycles/device/device_denoising.cpp b/intern/cycles/device/device_denoising.cpp
index deca358cd30..6e46f34c7c8 100644
--- a/intern/cycles/device/device_denoising.cpp
+++ b/intern/cycles/device/device_denoising.cpp
@@ -23,8 +23,13 @@ CCL_NAMESPACE_BEGIN
void DenoisingTask::init_from_devicetask(const DeviceTask &task)
{
radius = task.denoising_radius;
- nlm_k_2 = task.denoising_k2;
- pca_threshold = task.denoising_pca;
+ nlm_k_2 = powf(2.0f, task.denoising_strength - 1.0f);
+ if(task.denoising_relative_pca) {
+ pca_threshold = -powf(10.0f, task.denoising_feature_strength - 4.0f);
+ }
+ else {
+ pca_threshold = powf(10.0f, task.denoising_feature_strength - 1.0f);
+ }
render_buffer.pass_stride = task.pass_stride;
render_buffer.denoising_data_offset = task.pass_denoising_data;
@@ -69,7 +74,7 @@ bool DenoisingTask::run_denoising()
buffer.passes = 14;
buffer.w = align_up(rect.z - rect.x, 4);
buffer.h = rect.w - rect.y;
- buffer.pass_stride = align_up(buffer.w * buffer.h, device->mem_get_offset_alignment());
+ buffer.pass_stride = align_up(buffer.w * buffer.h, divide_up(device->mem_address_alignment(), sizeof(float)));
buffer.mem.resize(buffer.pass_stride * buffer.passes);
device->mem_alloc("Denoising Pixel Buffer", buffer.mem, MEM_READ_WRITE);
@@ -77,15 +82,15 @@ bool DenoisingTask::run_denoising()
/* Prefilter shadow feature. */
{
- offset_ptr unfiltered_a (device, buffer.mem, 0, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr unfiltered_b (device, buffer.mem, 1*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr sample_var (device, buffer.mem, 2*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr sample_var_var (device, buffer.mem, 3*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr buffer_var (device, buffer.mem, 5*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr filtered_var (device, buffer.mem, 6*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr nlm_temporary_1(device, buffer.mem, 7*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr nlm_temporary_2(device, buffer.mem, 8*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr nlm_temporary_3(device, buffer.mem, 9*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr unfiltered_a (device, buffer.mem, 0, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr unfiltered_b (device, buffer.mem, 1*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr sample_var (device, buffer.mem, 2*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr sample_var_var (device, buffer.mem, 3*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr buffer_var (device, buffer.mem, 5*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr filtered_var (device, buffer.mem, 6*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr nlm_temporary_1(device, buffer.mem, 7*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr nlm_temporary_2(device, buffer.mem, 8*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr nlm_temporary_3(device, buffer.mem, 9*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
nlm_state.temporary_1_ptr = *nlm_temporary_1;
nlm_state.temporary_2_ptr = *nlm_temporary_2;
@@ -118,17 +123,17 @@ bool DenoisingTask::run_denoising()
functions.non_local_means(filtered_b, filtered_a, residual_var, final_b);
/* Combine the two double-filtered halves to a final shadow feature. */
- offset_ptr shadow_pass(device, buffer.mem, 4*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
+ device_sub_ptr shadow_pass(device, buffer.mem, 4*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
functions.combine_halves(final_a, final_b, *shadow_pass, null_ptr, 0, rect);
}
/* Prefilter general features. */
{
- offset_ptr unfiltered (device, buffer.mem, 8*buffer.pass_stride, buffer.pass_stride, MEM_READ_WRITE);
- offset_ptr variance (device, b
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list