[Bf-blender-cvs] [9a66b66] soc-2016-cycles_denoising: Cycles: Fix Progressive Rendering
Lukas Stockner
noreply at git.blender.org
Sat Dec 3 02:26:37 CET 2016
Commit: 9a66b66c57fbb7e806cbd0e91fd0e396c92a6872
Author: Lukas Stockner
Date: Thu Dec 1 22:43:55 2016 +0100
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB9a66b66c57fbb7e806cbd0e91fd0e396c92a6872
Cycles: Fix Progressive Rendering
This also fixes the material and world preview bug.
===================================================================
M intern/cycles/render/session.cpp
M intern/cycles/render/session.h
===================================================================
diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index 3ef3224..f648509 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -118,8 +118,8 @@ Session::~Session()
}
/* clean up */
- foreach(RenderBuffers *buffers, tile_buffers)
- delete buffers;
+ foreach(RenderTile &rtile, tile_buffers)
+ delete rtile.buffers;
tile_manager.free_device();
delete buffers;
@@ -414,6 +414,7 @@ bool Session::acquire_tile(Device *tile_device, RenderTile& rtile)
return true;
}
+ bool store_rtile = false;
if(tile->buffers == NULL) {
/* fill buffer parameters */
BufferParams buffer_params = tile_manager.params;
@@ -429,23 +430,31 @@ bool Session::acquire_tile(Device *tile_device, RenderTile& rtile)
if(params.progressive_refine) {
tile_lock.lock();
- if(tile_buffers.size() == 0)
- tile_buffers.resize(tile_manager.state.num_tiles, NULL);
+ if(tile_buffers.size() == 0) {
+ RenderTile nulltile;
+ nulltile.buffers = NULL;
+ tile_buffers.resize(tile_manager.state.num_tiles, nulltile);
+ }
/* In certain circumstances number of tiles in the tile manager could
* be changed. This is not supported by the progressive refine feature.
*/
assert(tile_buffers.size() == tile_manager.state.num_tiles);
- tile->buffers = tile_buffers[tile->index];
- if(tile->buffers == NULL) {
+ RenderTile &stored_rtile = tile_buffers[tile->index];
+ if(stored_rtile.buffers == NULL) {
tile->buffers = new RenderBuffers(tile_device);
- tile_buffers[tile->index] = tile->buffers;
-
tile->buffers->reset(tile_device, buffer_params);
+ store_rtile = true;
+ }
+ else {
+ assert(rtile.x == stored_rtile.x &&
+ rtile.y == stored_rtile.y &&
+ rtile.w == stored_rtile.w &&
+ rtile.h == stored_rtile.h);
+ tile_lock.unlock();
+ tile->buffers = stored_rtile.buffers;
}
-
- tile_lock.unlock();
}
else {
tile->buffers = new RenderBuffers(tile_device);
@@ -461,6 +470,11 @@ bool Session::acquire_tile(Device *tile_device, RenderTile& rtile)
rtile.buffers = tile->buffers;
rtile.sample = 0;
+ if(store_rtile) {
+ tile_buffers[tile->index] = rtile;
+ tile_lock.unlock();
+ }
+
/* this will tag tile as IN PROGRESS in blender-side render pipeline,
* which is needed to highlight currently rendering tile before first
* sample was processed for it
@@ -885,8 +899,8 @@ void Session::reset(BufferParams& buffer_params, int samples)
if(params.progressive_refine) {
thread_scoped_lock buffers_lock(buffers_mutex);
- foreach(RenderBuffers *buffers, tile_buffers)
- delete buffers;
+ foreach(RenderTile &rtile, tile_buffers)
+ delete rtile.buffers;
tile_buffers.clear();
}
@@ -1118,9 +1132,7 @@ bool Session::update_progressive_refine(bool cancel)
}
if(params.progressive_refine) {
- foreach(RenderBuffers *buffers, tile_buffers) {
- RenderTile rtile;
- rtile.buffers = buffers;
+ foreach(RenderTile &rtile, tile_buffers) {
rtile.sample = sample;
if(write) {
@@ -1143,8 +1155,8 @@ void Session::device_free()
{
scene->device_free();
- foreach(RenderBuffers *buffers, tile_buffers)
- delete buffers;
+ foreach(RenderTile &tile, tile_buffers)
+ delete tile.buffers;
tile_manager.free_device();
tile_buffers.clear();
diff --git a/intern/cycles/render/session.h b/intern/cycles/render/session.h
index 2f0597a..4b3a501 100644
--- a/intern/cycles/render/session.h
+++ b/intern/cycles/render/session.h
@@ -242,7 +242,7 @@ protected:
double last_update_time;
bool update_progressive_refine(bool cancel);
- vector<RenderBuffers *> tile_buffers;
+ vector<RenderTile> tile_buffers;
DeviceRequestedFeatures get_requested_device_features();
More information about the Bf-blender-cvs
mailing list