[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49535] branches/soc-2011-tomato/intern/ cycles: Tomato Cycles: internal cleanup of tile-based integrator

Sergey Sharybin sergey.vfx at gmail.com
Fri Aug 3 17:18:42 CEST 2012


Revision: 49535
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49535
Author:   nazgul
Date:     2012-08-03 15:18:42 +0000 (Fri, 03 Aug 2012)
Log Message:
-----------
Tomato Cycles: internal cleanup of tile-based integrator

This commit solves couple of issues appeared with new integrator:

- Render job progress bar is now shows progress based on number of
  rendered tiles. This is the same as Blender Internal does.

  This still requires some further thoughts because for GPU it's
  better to use single tile and in this case progress bar should
  be based on number of rendered samples.

- Removes "global" sample counter from progress descriptor. There's
  no more global-being sample which makes sense.

  This counter was replaced with tile counter.

- Use proper sample number when copying render buffer to blender.
  It used to be final sample number used which lead to tiles
  appearing from complete dark to normal brightness as they're
  being rendered. Now tile would be displayed with proper
  brightness starting from the very first sample.

  Use sample counter stored in render tile descriptor and pass
  it to update / write callbacks.

This was tested on CPU and GPU CUDA rendering.

Additional change:

  OpenCL rendering now should be cancellable before it finished
  rendering all the samples (the same change as for CPU/CUDA from
  a while ago).

This part of commit wasn't actually tested, would do it later.

Modified Paths:
--------------
    branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp
    branches/soc-2011-tomato/intern/cycles/blender/blender_session.h
    branches/soc-2011-tomato/intern/cycles/blender/blender_util.h
    branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp
    branches/soc-2011-tomato/intern/cycles/device/device_cuda.cpp
    branches/soc-2011-tomato/intern/cycles/device/device_opencl.cpp
    branches/soc-2011-tomato/intern/cycles/render/buffers.cpp
    branches/soc-2011-tomato/intern/cycles/render/buffers.h
    branches/soc-2011-tomato/intern/cycles/render/session.cpp
    branches/soc-2011-tomato/intern/cycles/render/session.h
    branches/soc-2011-tomato/intern/cycles/util/util_progress.h

Modified: branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp	2012-08-03 15:05:20 UTC (rev 49534)
+++ branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp	2012-08-03 15:18:42 UTC (rev 49535)
@@ -189,9 +189,9 @@
 	RE_engine_end_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data, (int)cancel);
 }
 
-void BlenderSession::do_write_update_render_buffers(RenderBuffers *buffers, bool do_update_only)
+void BlenderSession::do_write_update_render_tile(RenderTile& rtile, bool do_update_only)
 {
-	BufferParams& params = buffers->params;
+	BufferParams& params = rtile.buffers->params;
 	int x = params.full_x - session->tile_manager.params.full_x;
 	int y = params.full_y - session->tile_manager.params.full_y;
 	int w = params.width;
@@ -211,31 +211,31 @@
 
 	if (do_update_only) {
 		/* update only needed */
-		update_render_result(b_rr, b_rlay, buffers);
+		update_render_result(b_rr, b_rlay, rtile);
 		end_render_result(b_engine, b_rr, true);
 	}
 	else {
 		/* write result */
-		write_render_result(b_rr, b_rlay, buffers);
+		write_render_result(b_rr, b_rlay, rtile);
 		end_render_result(b_engine, b_rr);
 	}
 }
 
-void BlenderSession::write_render_buffers(RenderBuffers *buffers)
+void BlenderSession::write_render_tile(RenderTile& rtile)
 {
-	do_write_update_render_buffers(buffers, false);
+	do_write_update_render_tile(rtile, false);
 }
 
-void BlenderSession::update_render_buffers(RenderBuffers *buffers)
+void BlenderSession::update_render_tile(RenderTile& rtile)
 {
-	do_write_update_render_buffers(buffers, true);
+	do_write_update_render_tile(rtile, true);
 }
 
 void BlenderSession::render()
 {
 	/* set callback to write out render results */
-	session->write_render_buffers_cb = function_bind(&BlenderSession::write_render_buffers, this, _1);
-	session->update_render_buffers_cb = function_bind(&BlenderSession::update_render_buffers, this, _1);
+	session->write_render_tile_cb = function_bind(&BlenderSession::write_render_tile, this, _1);
+	session->update_render_tile_cb = function_bind(&BlenderSession::update_render_tile, this, _1);
 
 	/* get buffer parameters */
 	SessionParams session_params = BlenderSync::get_session_params(b_engine, b_userpref, b_scene, background);
@@ -305,23 +305,21 @@
 	}
 
 	/* clear callback */
-	session->write_render_buffers_cb = NULL;
-	session->update_render_buffers_cb = NULL;
+	session->write_render_tile_cb = NULL;
+	session->update_render_tile_cb = NULL;
 }
 
-void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers, bool do_update_only)
+void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only)
 {
+	RenderBuffers *buffers = rtile.buffers;
+
 	/* copy data from device */
 	if(!buffers->copy_from_device())
 		return;
 
 	BufferParams& params = buffers->params;
 	float exposure = scene->film->exposure;
-	double total_time, sample_time;
-	int sample;
 
-	session->progress.get_sample(sample, total_time, sample_time);
-
 	vector<float> pixels(params.width*params.height*4);
 
 	if (!do_update_only) {
@@ -336,27 +334,27 @@
 			int components = b_pass.channels();
 
 			/* copy pixels */
-			if(buffers->get_pass(pass_type, exposure, sample, components, &pixels[0]))
+			if(buffers->get_pass_rect(pass_type, exposure, rtile.sample, components, &pixels[0]))
 				rna_RenderPass_rect_set(&b_pass.ptr, &pixels[0]);
 		}
 	}
 
 	/* copy combined pass */
-	if(buffers->get_pass(PASS_COMBINED, exposure, sample, 4, &pixels[0]))
+	if(buffers->get_pass_rect(PASS_COMBINED, exposure, rtile.sample, 4, &pixels[0]))
 		rna_RenderLayer_rect_set(&b_rlay.ptr, &pixels[0]);
 
 	/* tag result as updated */
 	RE_engine_update_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data);
 }
 
-void BlenderSession::write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers)
+void BlenderSession::write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile)
 {
-	do_write_update_render_result(b_rr, b_rlay, buffers, false);
+	do_write_update_render_result(b_rr, b_rlay, rtile, false);
 }
 
-void BlenderSession::update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers)
+void BlenderSession::update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile)
 {
-	do_write_update_render_result(b_rr, b_rlay, buffers, true);
+	do_write_update_render_result(b_rr, b_rlay, rtile, true);
 }
 
 void BlenderSession::synchronize()
@@ -461,11 +459,12 @@
 
 void BlenderSession::get_progress(float& progress, double& total_time)
 {
-	double sample_time;
-	int sample;
+	double tile_time;
+	int tile;
+	int tile_total = session->tile_manager.state.num_tiles;
 
-	session->progress.get_sample(sample, total_time, sample_time);
-	progress = ((float)sample/(float)session->params.samples);
+	session->progress.get_tile(tile, total_time, tile_time);
+	progress = ((float)tile/(float)tile_total);
 }
 
 void BlenderSession::update_status_progress()

Modified: branches/soc-2011-tomato/intern/cycles/blender/blender_session.h
===================================================================
--- branches/soc-2011-tomato/intern/cycles/blender/blender_session.h	2012-08-03 15:05:20 UTC (rev 49534)
+++ branches/soc-2011-tomato/intern/cycles/blender/blender_session.h	2012-08-03 15:18:42 UTC (rev 49535)
@@ -30,6 +30,7 @@
 class Scene;
 class Session;
 class RenderBuffers;
+class RenderTile;
 
 class BlenderSession {
 public:
@@ -48,14 +49,14 @@
 	/* offline render */
 	void render();
 
-	void write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers);
-	void write_render_buffers(RenderBuffers *buffers);
+	void write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile);
+	void write_render_tile(RenderTile& rtile);
 
 	/* update functions are used to update display buffer only after sample was rendered
 	 * only needed for better visual feedback
 	 */
-	void update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers);
-	void update_render_buffers(RenderBuffers *buffers);
+	void update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile);
+	void update_render_tile(RenderTile& rtile);
 
 	/* interactive updates */
 	void synchronize();
@@ -89,8 +90,8 @@
 	int width, height;
 
 protected:
-	void do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers, bool do_update_only);
-	void do_write_update_render_buffers(RenderBuffers *buffers, bool do_update_only);
+	void do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderTile& rtile, bool do_update_only);
+	void do_write_update_render_tile(RenderTile& rtile, bool do_update_only);
 };
 
 CCL_NAMESPACE_END

Modified: branches/soc-2011-tomato/intern/cycles/blender/blender_util.h
===================================================================
--- branches/soc-2011-tomato/intern/cycles/blender/blender_util.h	2012-08-03 15:05:20 UTC (rev 49534)
+++ branches/soc-2011-tomato/intern/cycles/blender/blender_util.h	2012-08-03 15:18:42 UTC (rev 49535)
@@ -55,7 +55,6 @@
 void rna_Scene_frame_set(void *scene, int frame, float subframe);
 void BKE_image_user_frame_calc(void *iuser, int cfra, int fieldnr);
 void BKE_image_user_file_path(void *iuser, void *ima, char *path);
-
 }
 
 CCL_NAMESPACE_BEGIN

Modified: branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp	2012-08-03 15:05:20 UTC (rev 49534)
+++ branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp	2012-08-03 15:18:42 UTC (rev 49535)
@@ -167,6 +167,7 @@
 						}
 					}
 
+					tile.sample = sample + 1;
 					task.update_progress(tile);
 				}
 			}
@@ -189,6 +190,7 @@
 						}
 					}
 
+					tile.sample = sample + 1;
 					task.update_progress(tile);
 				}
 			}

Modified: branches/soc-2011-tomato/intern/cycles/device/device_cuda.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/device/device_cuda.cpp	2012-08-03 15:05:20 UTC (rev 49534)
+++ branches/soc-2011-tomato/intern/cycles/device/device_cuda.cpp	2012-08-03 15:18:42 UTC (rev 49535)
@@ -837,11 +837,13 @@
 				int end_sample = tile.start_sample + tile.num_samples;
 
 				for(int sample = start_sample; sample < end_sample; sample++) {
-					if (task->get_cancel()) {
+					if (task->get_cancel())
 						break;
-					}
 
 					path_trace(tile, sample);
+
+					tile.sample = sample + 1;
+
 					task->update_progress(tile);
 				}
 

Modified: branches/soc-2011-tomato/intern/cycles/device/device_opencl.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/device/device_opencl.cpp	2012-08-03 15:05:20 UTC (rev 49534)
+++ branches/soc-2011-tomato/intern/cycles/device/device_opencl.cpp	2012-08-03 15:18:42 UTC (rev 49535)
@@ -685,9 +685,17 @@
 				int start_sample = tile.start_sample;
 				int end_sample = tile.start_sample + tile.num_samples;
 
-				for(int sample = start_sample; sample < end_sample; sample++)
+				for(int sample = start_sample; sample < end_sample; sample++) {
+					if (task->get_cancel())
+						break;
+
 					path_trace(tile, sample);
 
+					tile.sample = sample + 1;
+
+					task->update_progress(tile);
+				}
+
 				task->release_tile(tile);
 			}
 		}

Modified: branches/soc-2011-tomato/intern/cycles/render/buffers.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/render/buffers.cpp	2012-08-03 15:05:20 UTC (rev 49534)
+++ branches/soc-2011-tomato/intern/cycles/render/buffers.cpp	2012-08-03 15:18:42 UTC (rev 49535)
@@ -158,7 +158,7 @@
 	return true;
 }
 
-bool RenderBuffers::get_pass(PassType type, float exposure, int sample, int components, float *pixels)
+bool RenderBuffers::get_pass_rect(PassType type, float exposure, int sample, int components, float *pixels)
 {
 	int pass_offset = 0;
 

Modified: branches/soc-2011-tomato/intern/cycles/render/buffers.h
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list