[Bf-blender-cvs] [7f1cbfb] soc-2016-cycles_denoising: Cycles: Fix a memory leak when cancelling a denoised render

Lukas Stockner noreply at git.blender.org
Sat Aug 6 05:41:01 CEST 2016


Commit: 7f1cbfb9fb6dcb4ab91a74b16306a1362f8286aa
Author: Lukas Stockner
Date:   Wed Jul 27 22:36:06 2016 +0200
Branches: soc-2016-cycles_denoising
https://developer.blender.org/rB7f1cbfb9fb6dcb4ab91a74b16306a1362f8286aa

Cycles: Fix a memory leak when cancelling a denoised render

===================================================================

M	intern/cycles/render/session.cpp
M	intern/cycles/render/tile.cpp
M	intern/cycles/render/tile.h

===================================================================

diff --git a/intern/cycles/render/session.cpp b/intern/cycles/render/session.cpp
index f266815..ec9dcec 100644
--- a/intern/cycles/render/session.cpp
+++ b/intern/cycles/render/session.cpp
@@ -119,6 +119,7 @@ Session::~Session()
 	/* clean up */
 	foreach(RenderBuffers *buffers, tile_buffers)
 		delete buffers;
+	tile_manager.free_device();
 
 	delete buffers;
 	delete display;
@@ -493,8 +494,7 @@ void Session::release_tile(RenderTile& rtile)
 			write_render_tile_cb(rtile);
 			if(delete_tile) {
 				delete rtile.buffers;
-				/* TODO(lukas): Set buffers in tile_manager.state.tiles[] to zero.
-				 * Shoudn't matter in theory since the tile won't be used again, but it's more error-proof. */
+				tile_manager.state.tiles[rtile.tile_index].buffers = NULL;
 			}
 		}
 	}
@@ -1129,6 +1129,7 @@ void Session::device_free()
 
 	foreach(RenderBuffers *buffers, tile_buffers)
 		delete buffers;
+	tile_manager.free_device();
 
 	tile_buffers.clear();
 
diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp
index 0e298a5..18e8e5b 100644
--- a/intern/cycles/render/tile.cpp
+++ b/intern/cycles/render/tile.cpp
@@ -112,6 +112,16 @@ TileManager::~TileManager()
 {
 }
 
+void TileManager::free_device()
+{
+	if(schedule_denoising) {
+		for(int i = 0; i < state.tiles.size(); i++) {
+			delete state.tiles[i].buffers;
+			state.tiles[i].buffers = NULL;
+		}
+	}
+}
+
 void TileManager::reset(BufferParams& params_, int num_samples_)
 {
 	params = params_;
diff --git a/intern/cycles/render/tile.h b/intern/cycles/render/tile.h
index 6d9b63b..7c0c0a6 100644
--- a/intern/cycles/render/tile.h
+++ b/intern/cycles/render/tile.h
@@ -88,6 +88,7 @@ public:
 	            bool preserve_tile_device, bool background, TileOrder tile_order, int num_devices = 1, bool only_denoise = false);
 	~TileManager();
 
+	void free_device();
 	void reset(BufferParams& params, int num_samples);
 	void set_samples(int num_samples);
 	bool next();




More information about the Bf-blender-cvs mailing list