Cycles: update buffers only once in a while when progressive refine is used

It'll mimic the same behavior as regular tile rendering update and it should
give pretty noticeable boost on simpler scenes.
This commit is contained in:
Sergey Sharybin 2012-10-23 17:24:23 +00:00
parent a32d134dc7
commit 40242c2f44
2 changed files with 17 additions and 2 deletions

@ -186,6 +186,7 @@ void Session::run_gpu()
start_time = time_dt(); start_time = time_dt();
reset_time = time_dt(); reset_time = time_dt();
paused_time = 0.0; paused_time = 0.0;
last_update_time = time_dt();
if(!params.background) if(!params.background)
progress.set_start_time(start_time + paused_time); progress.set_start_time(start_time + paused_time);
@ -447,6 +448,8 @@ void Session::run_cpu()
{ {
bool tiles_written = false; bool tiles_written = false;
last_update_time = time_dt();
{ {
/* reset once to start */ /* reset once to start */
thread_scoped_lock reset_lock(delayed_reset.mutex); thread_scoped_lock reset_lock(delayed_reset.mutex);
@ -807,6 +810,15 @@ void Session::tonemap()
bool Session::update_progressive_refine(bool cancel) bool Session::update_progressive_refine(bool cancel)
{ {
int sample = tile_manager.state.sample + 1; int sample = tile_manager.state.sample + 1;
bool write = sample == params.samples || cancel;
double current_time = time_dt();
if (current_time - last_update_time < 1.0f) {
/* if last sample was processed, we need to write buffers anyway */
if (!write)
return false;
}
if(params.progressive_refine) { if(params.progressive_refine) {
foreach(RenderBuffers *buffers, tile_buffers) { foreach(RenderBuffers *buffers, tile_buffers) {
@ -814,14 +826,16 @@ bool Session::update_progressive_refine(bool cancel)
rtile.buffers = buffers; rtile.buffers = buffers;
rtile.sample = sample; rtile.sample = sample;
if(rtile.sample == params.samples || cancel) if(write)
write_render_tile_cb(rtile); write_render_tile_cb(rtile);
else else
update_render_tile_cb(rtile); update_render_tile_cb(rtile);
} }
} }
return sample == params.samples; last_update_time = current_time;
return write;
} }
CCL_NAMESPACE_END CCL_NAMESPACE_END

@ -179,6 +179,7 @@ protected:
double paused_time; double paused_time;
/* progressive refine */ /* progressive refine */
double last_update_time;
bool update_progressive_refine(bool cancel); bool update_progressive_refine(bool cancel);
vector<RenderBuffers *> tile_buffers; vector<RenderBuffers *> tile_buffers;