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();

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to