[Bf-blender-cvs] [ef814f0] soc-2016-cycles_denoising: Cycles: Explicitly pass region of interest to RenderBuffers when exporting pixels to Blender

Lukas Stockner noreply at git.blender.org
Wed Jul 6 04:28:52 CEST 2016


Commit: ef814f016ab3db4fb2de4504a9cef9f1ce1378b2
Author: Lukas Stockner
Date:   Wed Jul 6 03:44:23 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rBef814f016ab3db4fb2de4504a9cef9f1ce1378b2

Cycles: Explicitly pass region of interest to RenderBuffers when exporting pixels to Blender

By itself, that change is pretty useless, but it's important for the upcoming denoise-after-render support.

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

M	intern/cycles/blender/blender_session.cpp
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 b2eef02..4ec1dde 100644
--- a/intern/cycles/blender/blender_session.cpp
+++ b/intern/cycles/blender/blender_session.cpp
@@ -390,10 +390,10 @@ static void add_pass(BL::RenderEngine& b_engine,
 void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_update_only, bool highlight)
 {
 	BufferParams& params = rtile.buffers->params;
-	int x = params.full_x + params.overscan - session->tile_manager.params.full_x;
-	int y = params.full_y + params.overscan - session->tile_manager.params.full_y;
-	int w = params.final_width;
-	int h = params.final_height;
+	int x = rtile.x + params.overscan;
+	int y = rtile.y + params.overscan;
+	int w = rtile.w - 2*params.overscan;
+	int h = rtile.h - 2*params.overscan;
 
 	/* get render result */
 	BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str(), b_rview_name.c_str());
@@ -761,7 +761,10 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 	BufferParams& params = buffers->params;
 	float exposure = scene->film->exposure;
 
-	vector<float> pixels(params.final_width*params.final_height*4);
+	int4 rect = make_int4(rtile.x + params.overscan, rtile.y + params.overscan,
+	                      rtile.x+rtile.w - params.overscan, rtile.y+rtile.h - params.overscan);
+
+	vector<float> pixels((rect.w-rect.y)*(rect.z-rect.x)*4);
 
 	/* Adjust absolute sample number to the range. */
 	int sample = rtile.sample;
@@ -782,14 +785,14 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 
 			/* copy pixels */
 			if(extended_type) {
-				if(!buffers->get_denoising_rect(extended_type, exposure, sample, components, &pixels[0]))
+				if(!buffers->get_denoising_rect(extended_type, exposure, sample, components, rect, &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]))
+				if(!buffers->get_pass_rect(pass_type, exposure, sample, components, rect, &pixels[0]))
 					memset(&pixels[0], 0, pixels.size()*sizeof(float));
 			}
 
@@ -799,7 +802,7 @@ void BlenderSession::do_write_update_render_result(BL::RenderResult& b_rr,
 	else {
 		/* copy combined pass */
 		BL::RenderPass b_combined_pass(b_rlay.passes.find_by_type(BL::RenderPass::type_COMBINED, b_rview_name.c_str()));
-		if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
+		if(buffers->get_pass_rect(PASS_COMBINED, exposure, sample, 4, rect, &pixels[0]))
 			b_combined_pass.rect(&pixels[0]);
 	}
 
diff --git a/intern/cycles/render/buffers.cpp b/intern/cycles/render/buffers.cpp
index 7d0b074..1016061 100644
--- a/intern/cycles/render/buffers.cpp
+++ b/intern/cycles/render/buffers.cpp
@@ -181,7 +181,26 @@ bool RenderBuffers::copy_from_device()
 	return true;
 }
 
-bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int components, float *pixels)
+/* 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). */
+int4 RenderBuffers::rect_to_local(int4 rect) {
+	rect.x -= params.full_x;
+	rect.y -= params.full_y;
+	rect.z -= params.full_x;
+	rect.w -= params.full_y;
+	assert(rect.x >= 0 && rect.y >= 0 && rect.z <= params.width && rect.w <= params.height);
+	return rect;
+}
+
+/* Helper macro that loops over all the pixels in the rect.
+ * First, the buffer pointer is shifted to the starting point of the rect.
+ * Then, after each line, the buffer pointer is shifted to the start of the next one. */
+#define FOREACH_PIXEL in += (rect.y*params.width + rect.x)*pass_stride; \
+                      for(int y = rect.y; y < rect.w; y++, in += (params.width + rect.x - rect.z)*pass_stride) \
+                          for(int x = rect.x; x < rect.z; x++, in += pass_stride, pixels += components)
+
+bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int components, int4 rect, float *pixels, bool read_pixels)
 {
 	if(!params.denoising_passes)
 		/* The RenderBuffer doesn't have denoising passes. */
@@ -190,6 +209,8 @@ bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int
 		/* The type doesn't correspond to any denoising pass. */
 		return false;
 
+	rect = rect_to_local(rect);
+
 	float scale = 1.0f;
 	int type_offset = 0;
 	switch(type) {
@@ -210,10 +231,6 @@ bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int
 	float *in = (float*)buffer.data_pointer + pass_offset;
 	int pass_stride = params.get_passes_size();
 
-#define FOREACH_PIXEL in += (params.overscan*(params.width + 1))*pass_stride; \
-                      for(int y = params.overscan; y < params.height - params.overscan; y++, in += 2*params.overscan*pass_stride) \
-                          for(int x = params.overscan; x < params.width - params.overscan; x++, in += pass_stride, pixels += components)
-
 	if(components == 1) {
 		assert(type & (EX_TYPE_DENOISE_DEPTH | EX_TYPE_DENOISE_DEPTH_VAR));
 		FOREACH_PIXEL
@@ -233,8 +250,10 @@ bool RenderBuffers::get_denoising_rect(int type, float exposure, int sample, int
 	return true;
 }
 
-bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels)
+bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int components, int4 rect, float *pixels, bool read_pixels)
 {
+	rect = rect_to_local(rect);
+
 	int pass_offset = 0;
 
 	for(size_t j = 0; j < params.passes.size(); j++) {
diff --git a/intern/cycles/render/buffers.h b/intern/cycles/render/buffers.h
index 1797e28..eeb95d7 100644
--- a/intern/cycles/render/buffers.h
+++ b/intern/cycles/render/buffers.h
@@ -112,11 +112,12 @@ public:
 	void reset(Device *device, BufferParams& params);
 
 	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);
+	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);
 
 protected:
 	void device_free();
+	int4 rect_to_local(int4 rect);
 
 	Device *device;
 };




More information about the Bf-blender-cvs mailing list