[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