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.
This commit is contained in:
Sergey Sharybin
2012-07-24 20:05:00 +00:00
parent c363fc3dce
commit de6d480f71
4 changed files with 28 additions and 9 deletions

View File

@@ -176,17 +176,31 @@ static PassType get_pass_type(BL::RenderPass b_pass)
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 @@ void BlenderSession::do_write_update_render_buffers(RenderBuffers *buffers, bool
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 @@ void BlenderSession::do_write_update_render_buffers(RenderBuffers *buffers, bool
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 @@ void BlenderSession::render()
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 @@ void BlenderSession::render()
}
/* 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);

View File

@@ -44,6 +44,8 @@ BufferParams::BufferParams()
full_width = 0;
full_height = 0;
render_result = NULL;
Pass::add(PASS_COMBINED, passes);
}

View File

@@ -52,6 +52,8 @@ public:
/* passes */
vector<Pass> passes;
void *render_result;
/* functions */
BufferParams();

View File

@@ -233,7 +233,8 @@ void RE_engine_end_result(RenderEngine *engine, RenderResult *result, int cancel
}
/* free */
render_result_free_list(&engine->fullresult, result);
BLI_remlink(&engine->fullresult, result);
render_result_free(result);
}
/* Cancel */