[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49183] branches/soc-2011-tomato: Tomato Cycles: fix for memory overflow issue

Sergey Sharybin sergey.vfx at gmail.com
Tue Jul 24 22:05:02 CEST 2012


Revision: 49183
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49183
Author:   nazgul
Date:     2012-07-24 20:05:00 +0000 (Tue, 24 Jul 2012)
Log Message:
-----------
Tomato Cycles: fix for memory overflow issue

This fixes memory overflow caused by creating render result every time
RenderResult is creating when updating sample and not being freed until
tile is fully rendered.

Solved in probably not best way -- RenderResult is being stored in
RenderBuffers, so it's creating only once.

This solves memory issues, but while was looking into this issue
discovered dramatic slowdown caused by samples update in some files
from mango svn.

Solving this slowdown is becoming first priority from now on.

Modified Paths:
--------------
    branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp
    branches/soc-2011-tomato/intern/cycles/render/buffers.cpp
    branches/soc-2011-tomato/intern/cycles/render/buffers.h
    branches/soc-2011-tomato/source/blender/render/intern/source/external_engine.c

Modified: branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp	2012-07-24 19:29:24 UTC (rev 49182)
+++ branches/soc-2011-tomato/intern/cycles/blender/blender_session.cpp	2012-07-24 20:05:00 UTC (rev 49183)
@@ -176,17 +176,31 @@
 	return PASS_NONE;
 }
 
-static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername)
+static BL::RenderResult begin_render_result(BL::RenderEngine b_engine, int x, int y, int w, int h, const char *layername, BufferParams *params)
 {
-	RenderResult *rrp = RE_engine_begin_result((RenderEngine*)b_engine.ptr.data, x, y, w, h, 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;
+	}
+
 	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, bool cancel = false)
+static void end_render_result(BL::RenderEngine b_engine, BL::RenderResult b_rr, BufferParams *params, 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, bool do_write)
@@ -198,7 +212,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());
+	BL::RenderResult b_rr = begin_render_result(b_engine, x, y, w, h, b_rlay_name.c_str(), &params);
 
 	/* can happen if the intersected rectangle gives 0 width or height */
 	if (b_rr.ptr.data == NULL) {
@@ -214,7 +228,7 @@
 		write_render_result(b_rr, b_rlay, buffers);
 
 	if (do_write)
-		end_render_result(b_engine, b_rr);
+		end_render_result(b_engine, b_rr, &params);
 }
 
 void BlenderSession::write_render_buffers(RenderBuffers *buffers)
@@ -245,13 +259,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());
+		BL::RenderResult b_rr = begin_render_result(b_engine, 0, 0, 1, 1, b_rlay_name.c_str(), NULL);
 		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, true);
+			end_render_result(b_engine, b_rr, NULL, true);
 			continue;
 		}
 
@@ -278,7 +292,7 @@
 		}
 
 		/* free result without merging */
-		end_render_result(b_engine, b_rr, true);
+		end_render_result(b_engine, b_rr, NULL, true);
 
 		buffer_params.passes = passes;
 		scene->film->tag_passes_update(scene, passes);

Modified: branches/soc-2011-tomato/intern/cycles/render/buffers.cpp
===================================================================
--- branches/soc-2011-tomato/intern/cycles/render/buffers.cpp	2012-07-24 19:29:24 UTC (rev 49182)
+++ branches/soc-2011-tomato/intern/cycles/render/buffers.cpp	2012-07-24 20:05:00 UTC (rev 49183)
@@ -44,6 +44,8 @@
 	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-24 19:29:24 UTC (rev 49182)
+++ branches/soc-2011-tomato/intern/cycles/render/buffers.h	2012-07-24 20:05:00 UTC (rev 49183)
@@ -52,6 +52,8 @@
 	/* passes */
 	vector<Pass> passes;
 
+	void *render_result;
+
 	/* functions */
 	BufferParams();
 

Modified: branches/soc-2011-tomato/source/blender/render/intern/source/external_engine.c
===================================================================
--- branches/soc-2011-tomato/source/blender/render/intern/source/external_engine.c	2012-07-24 19:29:24 UTC (rev 49182)
+++ branches/soc-2011-tomato/source/blender/render/intern/source/external_engine.c	2012-07-24 20:05:00 UTC (rev 49183)
@@ -233,7 +233,8 @@
 	}
 
 	/* free */
-	render_result_free_list(&engine->fullresult, result);
+	BLI_remlink(&engine->fullresult, result);
+	render_result_free(result);
 }
 
 /* Cancel */




More information about the Bf-blender-cvs mailing list