Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Stockner <lukas.stockner@freenet.de>2015-12-24 02:29:40 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2015-12-24 03:42:59 +0300
commit8e07b878660550b8c3fbbdb5a2890b91b85aecaa (patch)
treea0d427c16b1c6182360e2434588b74378536cf2b
parent059b7a81e2a1ce19ac3c4262bd86eb8d961d5582 (diff)
Cycles: Fix Tile access in the TileManager for viewport rendering
- When rendering in the Viewport, next_tile is sometimes called after a reset has been performed, but before new tiles were generated. In that case, the tile list would be invalid, causing Blender to crash randomly. - When generating new tiles, the TileManager would not clear the tile lists before re-generating them, leading to some tiles being skipped during viewport rendering. - When popping the next tile from a tile list, a reference to the just-deleted object would be returned, now the object is copied before deleting it.
-rw-r--r--intern/cycles/render/tile.cpp6
1 files changed, 3 insertions, 3 deletions
diff --git a/intern/cycles/render/tile.cpp b/intern/cycles/render/tile.cpp
index 5849ac26118..8692be7dd51 100644
--- a/intern/cycles/render/tile.cpp
+++ b/intern/cycles/render/tile.cpp
@@ -128,6 +128,7 @@ int TileManager::gen_tiles(bool sliced)
int slice_num = sliced? num: 1;
int tile_index = 0;
+ state.tiles.clear();
state.tiles.resize(num);
vector<list<Tile> >::iterator tile_list = state.tiles.begin();
@@ -187,12 +188,11 @@ void TileManager::set_tiles()
bool TileManager::next_tile(Tile& tile, int device)
{
int logical_device = preserve_tile_device? device: 0;
- assert(logical_device < state.tiles.size());
- if(state.tiles[logical_device].empty())
+ if((logical_device >= state.tiles.size()) || state.tiles[logical_device].empty())
return false;
- tile = state.tiles[logical_device].front();
+ tile = Tile(state.tiles[logical_device].front());
state.tiles[logical_device].pop_front();
state.num_rendered_tiles++;
return true;