[Bf-blender-cvs] [15decbd] soc-2016-cycles_denoising: Cycles: Allocate and sync the denoise passes

Lukas Stockner noreply at git.blender.org
Sat Jun 4 22:03:11 CEST 2016


Commit: 15decbde5c79d9021e55e08e4c9ac5d5ae8e04ca
Author: Lukas Stockner
Date:   Sat Jun 4 21:35:23 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB15decbde5c79d9021e55e08e4c9ac5d5ae8e04ca

Cycles: Allocate and sync the denoise passes

With this commit, Cycles will add the passes to the result if keeping them is activated.
The actual data isn't written yet, so it just returns zeros.

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

M	intern/cycles/blender/blender_session.cpp
M	intern/cycles/blender/blender_util.h
M	intern/cycles/render/buffers.cpp
M	intern/cycles/render/buffers.h

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

diff --git a/intern/cycles/blender/blender_session.cpp b/intern/cycles/blender/blender_session.cpp
index 842d082..c3c0b6a 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -379,6 +379,14 @@ static void end_render_result(BL::RenderEngine& b_engine,
 	b_engine.end_result(b_rr, (int)cancel, (int)do_merge_results);
 }
 
+static void add_pass(BL::RenderEngine& b_engine,
+                     int passtype, int channels,
+                     const char *layername,
+                     const char *viewname)
+{
+	b_engine.add_pass(passtype, channels, layername, viewname);
+}
+
 void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_update_only, bool highlight)
 {
 	BufferParams& params = rtile.buffers->params;
@@ -504,6 +512,20 @@ void BlenderSession::render()
 		scene->integrator->tag_update(scene);
 		session->tile_manager.denoise = b_layer_iter->denoise_result();
 
+		if(b_layer_iter->keep_denoise_data()) {
+			add_pass(b_engine, SCE_PASS_DENOISE_NORMAL, 3, b_rlay_name.c_str(), NULL);
+			add_pass(b_engine, SCE_PASS_DENOISE_NORMAL_VAR, 3, b_rlay_name.c_str(), NULL);
+			add_pass(b_engine, SCE_PASS_DENOISE_ALBEDO, 3, b_rlay_name.c_str(), NULL);
+			add_pass(b_engine, SCE_PASS_DENOISE_ALBEDO_VAR, 3, b_rlay_name.c_str(), NULL);
+			add_pass(b_engine, SCE_PASS_DENOISE_DEPTH, 1, b_rlay_name.c_str(), NULL);
+			add_pass(b_engine, SCE_PASS_DENOISE_DEPTH_VAR, 1, b_rlay_name.c_str(), NULL);
+			add_pass(b_engine, SCE_PASS_DENOISE_NOISY, 3, b_rlay_name.c_str(), NULL);
+			add_pass(b_engine, SCE_PASS_DENOISE_NOISY_VAR, 3, b_rlay_name.c_str(), NULL);
+			if(buffer_params.selective_denoising) {
+				add_pass(b_engine, SCE_PASS_DENOISE_CLEAN, 3, b_rlay_name.c_str(), NULL);
+			}
+		}
+
 		for(b_rr.views.begin(b_view_iter); b_view_iter != b_rr.views.end(); ++b_view_iter) {
 			b_rview_name = b_view_iter->name();
 
@@ -743,13 +765,21 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 		for(b_rlay.passes.begin(b_iter); b_iter != b_rlay.passes.end(); ++b_iter) {
 			BL::RenderPass b_pass(*b_iter);
 
-			/* find matching pass type */
-			PassType pass_type = get_pass_type(b_pass);
+			int extended_type = b_pass.extended_type();
 			int components = b_pass.channels();
 
 			/* copy pixels */
-			if(!buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0]))
-				memset(&pixels[0], 0, pixels.size()*sizeof(float));
+			if(extended_type) {
+				if(!buffers->get_denoising_rect(extended_type, exposure, sample, components, &pixels[0]))
+					memset(&pixels[0], 0, pixels.size()*sizeof(float));
+			}
+			else {
+				/* find matching pass type */
+				PassType pass_type = get_pass_type(b_pass);
+
+				if(!buffers->get_pass_rect(pass_type, exposure, sample, components, &pixels[0]))
+					memset(&pixels[0], 0, pixels.size()*sizeof(float));
+			}
 
 			b_pass.rect(&pixels[0]);
 		}
diff --git a/intern/cycles/blender/blender_util.h b/intern/cycles/blender/blender_util.h
index d856982..1a70280 100644
--- a/intern/cycles/blender/blender_util.h
+++ b/intern/cycles/blender/blender_util.h
@@ -37,6 +37,19 @@ float *BKE_image_get_float_pixels_for_frame(void *image, int frame);
 
 CCL_NAMESPACE_BEGIN
 
+/* TODO Wrap through RNA */
+typedef enum BlenderDenoisePasses {
+        SCE_PASS_DENOISE_NORMAL           = 32,
+        SCE_PASS_DENOISE_NORMAL_VAR       = 33,
+        SCE_PASS_DENOISE_ALBEDO           = 34,
+        SCE_PASS_DENOISE_ALBEDO_VAR       = 35,
+        SCE_PASS_DENOISE_DEPTH            = 36,
+        SCE_PASS_DENOISE_DEPTH_VAR        = 37,
+        SCE_PASS_DENOISE_NOISY            = 38, /* The original noisy image (only the components that are denoised). */
+        SCE_PASS_DENOISE_NOISY_VAR        = 39,
+        SCE_PASS_DENOISE_CLEAN            = 40, /* If present, these image components are added to the denoised image. */
+} BlenderDenoisePasses;
+
 void python_thread_state_save(void **python_thread_state);
 void python_thread_state_restore(void **python_thread_state);
 
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 5ad1e18..32778b3 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -81,6 +81,16 @@ int BufferParams::get_passes_size()
 	return align_up(size, 4);
 }
 
+int BufferParams::get_denoise_offset()
+{
+	int offset = 0;
+
+	foreach(Pass& pass, passes)
+		offset += pass.components;
+
+	return offset;
+}
+
 /* Render Buffer Task */
 
 RenderTile::RenderTile()
@@ -165,6 +175,11 @@ bool RenderBuffers::copy_from_device()
 	return true;
 }
 
+bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int components, float *pixels)
+{
+	return false;
+}
+
 bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels)
 {
 	int pass_offset = 0;
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 0188712..321cd54 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -62,6 +62,7 @@ public:
 	bool modified(const BufferParams& params);
 	void add_pass(PassType type);
 	int get_passes_size();
+	int get_denoise_offset();
 };
 
 /* Render Buffers */
@@ -83,6 +84,7 @@ public:
 
 	bool copy_from_device();
 	bool get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels);
+	bool get_denoising_rect(int denoising_pass, float exposure, int sample, int components, float *pixels);
 
 protected:
 	void device_free();




More information about the Bf-blender-cvs mailing list