[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49185] branches/soc-2011-tomato/intern/ cycles/blender: Tomato Cycles: speedup realtime samples update

Sergey Sharybin sergey.vfx at gmail.com
Tue Jul 24 22:54:07 CEST 2012


Revision: 49185
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49185
Author:   nazgul
Date:     2012-07-24 20:54:06 +0000 (Tue, 24 Jul 2012)
Log Message:
-----------
Tomato Cycles: speedup realtime samples update

Copy pixels for combined pass only when updating tile after each sample
skipping all other passes. Behaves noticeable faster on scenes with
lots passes used.

Would check further tomorrow from studio whether stuff could be speed
up further.

Modified Paths:
--------------
    branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp
    branches/soc-2011-tomato/intern/cycles/blender/blender_session.h

Modified: branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp	2012-07-24 20:33:55 UTC (rev 49184)
+++ branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp	2012-07-24 20:54:06 UTC (rev 49185)
@@ -203,7 +203,7 @@
 		params->render_result = NULL;
 }
 
-void BlenderSession::do_write_update_render_buffers(RenderBuffers *buffers, bool do_update, bool do_write)
+void BlenderSession::do_write_update_render_buffers(RenderBuffers *buffers, bool do_update_only)
 {
 	BufferParams& params = buffers->params;
 	int x = params.full_x - session->tile_manager.params.full_x;
@@ -223,22 +223,25 @@
 	b_rr.layers.begin(b_single_rlay);
 	BL::RenderLayer b_rlay = *b_single_rlay;
 
-	/* write result */
-	if (do_update)
+	if (do_update_only) {
+		/* update only needed */
+		update_render_result(b_rr, b_rlay, buffers);
+	}
+	else {
+		/* write result */
 		write_render_result(b_rr, b_rlay, buffers);
-
-	if (do_write)
 		end_render_result(b_engine, b_rr, &params);
+	}
 }
 
 void BlenderSession::write_render_buffers(RenderBuffers *buffers)
 {
-	do_write_update_render_buffers(buffers, true, true);
+	do_write_update_render_buffers(buffers, false);
 }
 
 void BlenderSession::update_render_buffers(RenderBuffers *buffers)
 {
-	do_write_update_render_buffers(buffers, true, false);
+	do_write_update_render_buffers(buffers, true);
 }
 
 void BlenderSession::render()
@@ -319,7 +322,7 @@
 	session->update_render_buffers_cb = NULL;
 }
 
-void BlenderSession::write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers)
+void BlenderSession::do_write_update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers, bool do_update_only)
 {
 	/* copy data from device */
 	if(!buffers->copy_from_device())
@@ -334,19 +337,21 @@
 
 	vector<float> pixels(params.width*params.height*4);
 
-	/* copy each pass */
-	BL::RenderLayer::passes_iterator b_iter;
-	
-	for(b_rlay.passes.begin(b_iter); b_iter != b_rlay.passes.end(); ++b_iter) {
-		BL::RenderPass b_pass(*b_iter);
+	if (!do_update_only) {
+		/* copy each pass */
+		BL::RenderLayer::passes_iterator b_iter;
 
-		/* find matching pass type */
-		PassType pass_type = get_pass_type(b_pass);
-		int components = b_pass.channels();
+		for(b_rlay.passes.begin(b_iter); b_iter != b_rlay.passes.end(); ++b_iter) {
+			BL::RenderPass b_pass(*b_iter);
 
-		/* copy pixels */
-		if(buffers->get_pass(pass_type, exposure, sample, components, &pixels[0]))
-			rna_RenderPass_rect_set(&b_pass.ptr, &pixels[0]);
+			/* find matching pass type */
+			PassType pass_type = get_pass_type(b_pass);
+			int components = b_pass.channels();
+
+			/* copy pixels */
+			if(buffers->get_pass(pass_type, exposure, sample, components, &pixels[0]))
+				rna_RenderPass_rect_set(&b_pass.ptr, &pixels[0]);
+		}
 	}
 
 	/* copy combined pass */
@@ -357,6 +362,16 @@
 	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)
+{
+	do_write_update_render_result(b_rr, b_rlay, buffers, false);
+}
+
+void BlenderSession::update_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers)
+{
+	do_write_update_render_result(b_rr, b_rlay, buffers, true);
+}
+
 void BlenderSession::synchronize()
 {
 	/* on session/scene parameter changes, we recreate session entirely */

Modified: branches/soc-2011-tomato/intern/cycles/blender/blender_session.h
===================================================================
--- branches/soc-2011-tomato/intern/cycles/blender/blender_session.h	2012-07-24 20:33:55 UTC (rev 49184)
+++ branches/soc-2011-tomato/intern/cycles/blender/blender_session.h	2012-07-24 20:54:06 UTC (rev 49185)
@@ -47,9 +47,14 @@
 
 	/* offline render */
 	void render();
-	void do_write_update_render_buffers(RenderBuffers *buffers, bool do_update, bool do_write);
+
 	void write_render_result(BL::RenderResult b_rr, BL::RenderLayer b_rlay, RenderBuffers *buffers);
 	void write_render_buffers(RenderBuffers *buffers);
+
+	/* 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);
 
 	/* interactive updates */
@@ -82,6 +87,10 @@
 	float last_progress;
 
 	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);
 };
 
 CCL_NAMESPACE_END




More information about the Bf-blender-cvs mailing list