[Bf-blender-cvs] [9b2dc8a] soc-2016-cycles_denoising: Cycles: Add function to get neighbor tiles for denoising

Lukas Stockner noreply at git.blender.org
Sun Jun 19 18:21:58 CEST 2016


Commit: 9b2dc8a9abe622ddccf89ed297aa05f8e709db27
Author: Lukas Stockner
Date:   Sun Jun 19 17:51:11 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB9b2dc8a9abe622ddccf89ed297aa05f8e709db27

Cycles: Add function to get neighbor tiles for denoising

This is needed by the denoising task to get the buffers of the nearby tiles.
Also, this commit syncs the half window option into the kernel data.

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

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/device/device_task.h
M	intern/cycles/kernel/kernel_types.h
M	intern/cycles/render/integrator.cpp
M	intern/cycles/render/integrator.h
M	intern/cycles/render/session.cpp
M	intern/cycles/render/session.h

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

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 27920e1..f538f57 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -515,6 +515,7 @@ void BlenderSession::render()
 		if(b_layer_iter->denoise_subsurface_indirect()) scene->film->denoise_flags |= DENOISE_SUBSURFACE_IND;
 		scene->film->selective_denoising = (scene->film->denoise_flags != DENOISE_ALL);
 		buffer_params.selective_denoising = scene->film->selective_denoising;
+		scene->integrator->half_window = b_layer_iter->half_window();
 
 		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_task.h b/intern/cycles/device/device_task.h
index f73906e..eff9948 100644
--- a/intern/cycles/device/device_task.h
+++ b/intern/cycles/device/device_task.h
@@ -63,6 +63,7 @@ public:
 	function<void(RenderTile&)> update_tile_sample;
 	function<void(RenderTile&)> release_tile;
 	function<bool(void)> get_cancel;
+	function<void(RenderTile*)> get_neighbor_tiles;
 
 	bool need_finish_queue;
 	bool integrator_branched;
diff --git a/intern/cycles/kernel/kernel_types.h b/intern/cycles/kernel/kernel_types.h
index 5e3039e..4f4998f 100644
--- a/intern/cycles/kernel/kernel_types.h
+++ b/intern/cycles/kernel/kernel_types.h
@@ -1143,7 +1143,8 @@ typedef struct KernelIntegrator {
 	float volume_step_size;
 	int volume_samples;
 
-	int pad;
+	/* denoiser */
+	int half_window;
 } KernelIntegrator;
 
 typedef struct KernelBVH {
diff --git a/intern/cycles/render/integrator.cpp b/intern/cycles/render/integrator.cpp
index fd4f34c..390e1de 100644
--- a/intern/cycles/render/integrator.cpp
+++ b/intern/cycles/render/integrator.cpp
@@ -183,6 +183,8 @@ void Integrator::device_update(Device *device, DeviceScene *dscene, Scene *scene
 		scene->film->tag_update(scene);
 	}
 
+	kintegrator->half_window = half_window;
+
 	need_update = false;
 }
 
@@ -223,6 +225,7 @@ bool Integrator::modified(const Integrator& integrator)
 		volume_samples == integrator.volume_samples &&
 		motion_blur == integrator.motion_blur &&
 		sampling_pattern == integrator.sampling_pattern &&
+		half_window == integrator.half_window &&
 		sample_all_lights_direct == integrator.sample_all_lights_direct &&
 		sample_all_lights_indirect == integrator.sample_all_lights_indirect);
 }
diff --git a/intern/cycles/render/integrator.h b/intern/cycles/render/integrator.h
index bb4e9c7..f23cdf0 100644
--- a/intern/cycles/render/integrator.h
+++ b/intern/cycles/render/integrator.h
@@ -77,6 +77,8 @@ public:
 
 	bool need_update;
 
+	int half_window;
+
 	Integrator();
 	~Integrator();
 
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 3cba497..371f4a4 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -489,6 +489,44 @@ void Session::release_tile(RenderTile& rtile)
 	update_status_time();
 }
 
+void Session::get_neighbor_tiles(RenderTile *tiles)
+{
+	int center_idx = tiles[4].tile_index;
+	assert(tile_manager.state.tiles[center_idx].state == Tile::DENOISE);
+	int width = tile_manager.params.width, height = tile_manager.params.height;
+	for(int dy = -1, i = 0; dy <= 1; dy++) {
+		for(int dx = -1; dx <= 1; dx++, i++) {
+			int px = tiles[4].x + dx*params.tile_size.x;
+			int py = tiles[4].y + dy*params.tile_size.y;
+			if(px >= 0 && py >= 0 && px < width && py < height) {
+				int tile_index = center_idx + dy*tile_manager.state.tile_stride + dx;
+				Tile *tile = &tile_manager.state.tiles[tile_index];
+				assert(tile->buffers);
+
+				tiles[i].buffer = tile->buffers->buffer.device_pointer;
+				tiles[i].x = tile_manager.state.buffer.full_x + tile->x;
+				tiles[i].y = tile_manager.state.buffer.full_y + tile->y;
+				tiles[i].w = tile->w;
+				tiles[i].h = tile->h;
+
+				BufferParams buffer_params = tile_manager.params;
+				buffer_params.full_x = tiles[i].x;
+				buffer_params.full_y = tiles[i].y;
+				buffer_params.width  = tiles[i].w;
+				buffer_params.height = tiles[i].h;
+
+				buffer_params.get_offset_stride(tiles[i].offset, tiles[i].stride);
+			}
+			else {
+				tiles[i].buffer = (device_ptr)NULL;
+				tiles[i].x = clamp(px, 0, width);
+				tiles[i].y = clamp(py, 0, height);
+				tiles[i].w = tiles[i].h = 0;
+			}
+		}
+	}
+}
+
 void Session::run_cpu()
 {
 	bool tiles_written = false;
@@ -927,6 +965,7 @@ void Session::render()
 	
 	task.acquire_tile = function_bind(&Session::acquire_tile, this, _1, _2);
 	task.release_tile = function_bind(&Session::release_tile, this, _1);
+	task.get_neighbor_tiles = function_bind(&Session::get_neighbor_tiles, this, _1);
 	task.get_cancel = function_bind(&Progress::get_cancel, &this->progress);
 	task.update_tile_sample = function_bind(&Session::update_tile_sample, this, _1);
 	task.update_progress_sample = function_bind(&Session::update_progress_sample, this);
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 4776f59..22e339c 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -173,6 +173,7 @@ protected:
 	bool acquire_tile(Device *tile_device, RenderTile& tile);
 	void update_tile_sample(RenderTile& tile);
 	void release_tile(RenderTile& tile);
+	void get_neighbor_tiles(RenderTile *tiles);
 
 	void update_progress_sample();




More information about the Bf-blender-cvs mailing list