[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49209] branches/soc-2011-tomato/intern/ cycles: Tomato Cycles: resolve slowdown introduced by interactive samples view commit

Sergey Sharybin sergey.vfx at gmail.com
Wed Jul 25 16:29:14 CEST 2012


Revision: 49209
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49209
Author:   nazgul
Date:     2012-07-25 14:29:14 +0000 (Wed, 25 Jul 2012)
Log Message:
-----------
Tomato Cycles: resolve slowdown introduced by interactive samples view commit

Update samples displayign in the interface once in a whiel only
(currently once in 1 sec). This still keeps rendering interactive
enough for artists and it eliminates slowdown caused by constant
uploading sampels from GPU to host.

This also allowed to get rid of hack with storing render result
in render buffers, due to it's not so big overhead ow to create
render result when sample needs to be updated.

Tests made with different files shows that now render speed is
really close to oroginal speed from before we started hackign
into this stuff.

There still some issues with interactive update when rendering
several render layers, but that seems to be irrelivant to all
this sampels commtis, so woudl look into this as a separate
patch.

Modified Paths:
--------------
    branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp
    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_task.cpp
    branches/soc-2011-tomato/intern/cycles/device/device_task.h
    branches/soc-2011-tomato/intern/cycles/render/buffers.cpp
    branches/soc-2011-tomato/intern/cycles/render/buffers.h

Modified: branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp	2012-07-25 13:55:16 UTC (rev 49208)
+++ branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp	2012-07-25 14:29:14 UTC (rev 49209)
@@ -176,31 +176,17 @@
 	return PASS_NONE;
 }
 
-static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername, BufferParams *params)
+static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername)
 {
-	RenderResult *rrp = NULL;
-
-	if (params)
-		rrp = (RenderResult *) params->render_result;
-
-	if (!rrp) {
-		rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, x, y, w, h, layername);
-
-		if (params)
-			params->render_result = rrp;
-	}
-
+	RenderResult *rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, x, y, w, h, layername);
 	PointerRNA rrptr;
 	RNA_pointer_create(NULL, &RNA_RenderResult, rrp, &rrptr);
 	return BL::RenderResult(rrptr);
 }
 
-static void end_render_result(BL::RenderEngine b_engine, BL::RenderResult b_rr, BufferParams *params, bool cancel = false)
+static void end_render_result(BL::RenderEngine b_engine, BL::RenderResult b_rr, bool cancel = false)
 {
 	RE_engine_end_result((RenderEngine*)b_engine.ptr.data, (RenderResult*)b_rr.ptr.data, (int)cancel);
-
-	if (params)
-		params->render_result = NULL;
 }
 
 void BlenderSession::do_write_update_render_buffers(RenderBuffers *buffers, bool do_update_only)
@@ -212,7 +198,7 @@
 	int h = params.height;
 
 	/* get render result */
-	BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str(), &params);
+	BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str());
 
 	/* can happen if the intersected rectangle gives 0 width or height */
 	if (b_rr.ptr.data == NULL) {
@@ -226,11 +212,12 @@
 	if (do_update_only) {
 		/* update only needed */
 		update_render_result(b_rr, b_rlay, buffers);
+		end_render_result(b_engine, b_rr, true);
 	}
 	else {
 		/* write result */
 		write_render_result(b_rr, b_rlay, buffers);
-		end_render_result(b_engine, b_rr, &params);
+		end_render_result(b_engine, b_rr);
 	}
 }
 
@@ -262,13 +249,13 @@
 		b_rlay_name = b_iter->name();
 
 		/* temporary render result to find needed passes */
-		BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str(), NULL);
+		BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str());
 		BL::RenderResult::layers_iterator b_single_rlay;
 		b_rr.layers.begin(b_single_rlay);
 
 		/* layer will be missing if it was disabled in the UI */
 		if(b_single_rlay == b_rr.layers.end()) {
-			end_render_result(b_engine, b_rr, NULL, true);
+			end_render_result(b_engine, b_rr, true);
 			continue;
 		}
 
@@ -295,7 +282,7 @@
 		}
 
 		/* free result without merging */
-		end_render_result(b_engine, b_rr, NULL, true);
+		end_render_result(b_engine, b_rr, true);
 
 		buffer_params.passes = passes;
 		scene->film->tag_passes_update(scene, passes);

Modified: branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp	2012-07-25 13:55:16 UTC (rev 49208)
+++ branches/soc-2011-tomato/intern/cycles/device/device_cpu.cpp	2012-07-25 14:29:14 UTC (rev 49209)
@@ -167,7 +167,7 @@
 						}
 					}
 
-					task.update_tile_sample(tile);
+					task.update_progress(tile);
 				}
 			}
 			else
@@ -189,7 +189,7 @@
 						}
 					}
 
-					task.update_tile_sample(tile);
+					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-07-25 13:55:16 UTC (rev 49208)
+++ branches/soc-2011-tomato/intern/cycles/device/device_cuda.cpp	2012-07-25 14:29:14 UTC (rev 49209)
@@ -842,7 +842,7 @@
 					}
 
 					path_trace(tile, sample);
-					task->update_tile_sample(tile);
+					task->update_progress(tile);
 				}
 
 				task->release_tile(tile);

Modified: branches/soc-2011-tomato/intern/cycles/device/device_task.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/device/device_task.cpp	2012-07-25 13:55:16 UTC (rev 49208)
+++ branches/soc-2011-tomato/intern/cycles/device/device_task.cpp	2012-07-25 14:29:14 UTC (rev 49209)
@@ -22,6 +22,7 @@
 #include "device_task.h"
 
 #include "util_algorithm.h"
+#include "util_time.h"
 
 CCL_NAMESPACE_BEGIN
 
@@ -33,6 +34,7 @@
   shader_input(0), shader_output(0),
   shader_eval_type(0), shader_x(0), shader_w(0)
 {
+	last_update_time = time_dt();
 }
 
 void DeviceTask::split_max_size(list<DeviceTask>& tasks, int max_size)
@@ -88,5 +90,21 @@
 	}
 }
 
+void DeviceTask::update_progress(RenderTile &rtile)
+{
+	if (type != PATH_TRACE)
+		return;
+
+	if (update_tile_sample) {
+		double current_time = time_dt();
+
+		if (current_time - last_update_time >= 1.0f) {
+			update_tile_sample(rtile);
+
+			last_update_time = current_time;
+		}
+	}
+}
+
 CCL_NAMESPACE_END
 

Modified: branches/soc-2011-tomato/intern/cycles/device/device_task.h
===================================================================
--- branches/soc-2011-tomato/intern/cycles/device/device_task.h	2012-07-25 13:55:16 UTC (rev 49208)
+++ branches/soc-2011-tomato/intern/cycles/device/device_task.h	2012-07-25 14:29:14 UTC (rev 49209)
@@ -57,10 +57,15 @@
 	void split(list<DeviceTask>& tasks, int num);
 	void split_max_size(list<DeviceTask>& tasks, int max_size);
 
+	void update_progress(RenderTile &rtile);
+
 	boost::function<bool(Device *device, RenderTile&)> acquire_tile;
 	boost::function<void(RenderTile&)> update_tile_sample;
 	boost::function<void(RenderTile&)> release_tile;
 	boost::function<bool(void)> get_cancel;
+
+protected:
+	double last_update_time;
 };
 
 CCL_NAMESPACE_END

Modified: branches/soc-2011-tomato/intern/cycles/render/buffers.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/render/buffers.cpp	2012-07-25 13:55:16 UTC (rev 49208)
+++ branches/soc-2011-tomato/intern/cycles/render/buffers.cpp	2012-07-25 14:29:14 UTC (rev 49209)
@@ -44,8 +44,6 @@
 	full_width = 0;
 	full_height = 0;
 
-	render_result = NULL;
-
 	Pass::add(PASS_COMBINED, passes);
 }
 

Modified: branches/soc-2011-tomato/intern/cycles/render/buffers.h
===================================================================
--- branches/soc-2011-tomato/intern/cycles/render/buffers.h	2012-07-25 13:55:16 UTC (rev 49208)
+++ branches/soc-2011-tomato/intern/cycles/render/buffers.h	2012-07-25 14:29:14 UTC (rev 49209)
@@ -52,8 +52,6 @@
 	/* passes */
 	vector<Pass> passes;
 
-	void *render_result;
-
 	/* functions */
 	BufferParams();
 




More information about the Bf-blender-cvs mailing list