Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index 94b6332a9aa4229bcfaa1b90831beba679a39416..e56af15b1d5a55668e1b2c7da3031b64ee17736f 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -263,6 +263,38 @@ TileManager::~TileManager() { |
CleanUpReleasedTiles(); |
} |
+void TileManager::RegisterPictureLayerTilingSet( |
+ int layer_id, |
+ WhichTree tree, |
+ PictureLayerTilingSet* tiling_set) { |
+ auto& paired_tiling_set = paired_picture_layer_tiling_sets_[layer_id]; |
+ if (tree == ACTIVE_TREE) { |
+ DCHECK(!paired_tiling_set.active); |
+ paired_tiling_set.active = tiling_set; |
+ } else { |
+ DCHECK(!paired_tiling_set.pending); |
+ paired_tiling_set.pending = tiling_set; |
+ } |
+} |
+ |
+void TileManager::UnregisterPictureLayerTilingSet(int layer_id, |
+ WhichTree tree) { |
+ auto paired_tiling_set_it = paired_picture_layer_tiling_sets_.find(layer_id); |
+ DCHECK(paired_tiling_set_it != paired_picture_layer_tiling_sets_.end()); |
+ |
+ auto& paired_tiling_set = paired_tiling_set_it->second; |
+ if (tree == ACTIVE_TREE) { |
+ DCHECK(paired_tiling_set.active); |
+ paired_tiling_set.active = nullptr; |
+ } else { |
+ DCHECK(paired_tiling_set.pending); |
+ paired_tiling_set.pending = nullptr; |
+ } |
+ |
+ if (!paired_tiling_set.active && !paired_tiling_set.pending) |
+ paired_picture_layer_tiling_sets_.erase(paired_tiling_set_it); |
+} |
+ |
void TileManager::Release(Tile* tile) { |
released_tiles_.push_back(tile); |
} |
@@ -360,8 +392,7 @@ void TileManager::PrepareTiles( |
TileVector tiles_that_need_to_be_rasterized; |
scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
- client_->BuildRasterQueue(global_state_.tree_priority, |
- RasterTilePriorityQueue::Type::ALL)); |
+ BuildRasterQueue(RasterTilePriorityQueue::Type::ALL)); |
// Inform the client that will likely require a draw if the top tile is |
// required for draw. |
client_->SetIsLikelyToRequireADraw( |
@@ -413,9 +444,7 @@ void TileManager::SynchronouslyRasterizeTiles( |
CleanUpReleasedTiles(); |
scoped_ptr<RasterTilePriorityQueue> required_for_draw_queue( |
- client_->BuildRasterQueue( |
- global_state_.tree_priority, |
- RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW)); |
+ BuildRasterQueue(RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW)); |
TileVector tiles_that_need_to_be_rasterized; |
AssignGpuMemoryToTiles(required_for_draw_queue.get(), |
std::numeric_limits<size_t>::max(), |
@@ -435,9 +464,8 @@ void TileManager::SynchronouslyRasterizeTiles( |
// assigned memory after reaching a steady memory state. |
// TODO(hendrikw): Figure out why this would improve jank on some tests - See |
// crbug.com/449288 |
- required_for_draw_queue = client_->BuildRasterQueue( |
- global_state_.tree_priority, |
- RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
+ required_for_draw_queue = |
+ BuildRasterQueue(RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
// Use on-demand raster for any tiles that have not been been assigned |
// memory. This ensures that we draw even when OOM. |
@@ -500,10 +528,8 @@ TileManager::FreeTileResourcesUntilUsageIsWithinLimit( |
const MemoryUsage& limit, |
MemoryUsage* usage) { |
while (usage->Exceeds(limit)) { |
- if (!eviction_priority_queue) { |
- eviction_priority_queue = |
- client_->BuildEvictionQueue(global_state_.tree_priority); |
- } |
+ if (!eviction_priority_queue) |
+ eviction_priority_queue = BuildEvictionQueue(); |
if (eviction_priority_queue->IsEmpty()) |
break; |
@@ -522,10 +548,8 @@ TileManager::FreeTileResourcesWithLowerPriorityUntilUsageIsWithinLimit( |
const TilePriority& other_priority, |
MemoryUsage* usage) { |
while (usage->Exceeds(limit)) { |
- if (!eviction_priority_queue) { |
- eviction_priority_queue = |
- client_->BuildEvictionQueue(global_state_.tree_priority); |
- } |
+ if (!eviction_priority_queue) |
+ eviction_priority_queue = BuildEvictionQueue(); |
if (eviction_priority_queue->IsEmpty()) |
break; |
@@ -874,7 +898,7 @@ void TileManager::SetTileTaskRunnerForTesting( |
bool TileManager::AreRequiredTilesReadyToDraw( |
RasterTilePriorityQueue::Type type) const { |
scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
- client_->BuildRasterQueue(global_state_.tree_priority, type)); |
+ BuildRasterQueue(type)); |
// It is insufficient to check whether the raster queue we constructed is |
// empty. The reason for this is that there are situations (rasterize on |
// demand) when the tile both needs raster and it's ready to draw. Hence, we |
@@ -898,6 +922,21 @@ bool TileManager::IsReadyToDraw() const { |
RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
} |
+scoped_ptr<RasterTilePriorityQueue> TileManager::BuildRasterQueue( |
+ RasterTilePriorityQueue::Type type) const { |
+ TRACE_EVENT0("cc", "TileManager::BuildRasterQueue"); |
+ return RasterTilePriorityQueue::Create(paired_picture_layer_tiling_sets_, |
+ client_->PendingTreeExists(), |
+ global_state_.tree_priority, type); |
+} |
+ |
+scoped_ptr<EvictionTilePriorityQueue> TileManager::BuildEvictionQueue() const { |
+ TRACE_EVENT0("cc", "TileManager::BuildEvictionQueue"); |
+ return EvictionTilePriorityQueue::Create(paired_picture_layer_tiling_sets_, |
+ client_->PendingTreeExists(), |
+ global_state_.tree_priority); |
+} |
+ |
void TileManager::NotifyReadyToActivate() { |
TRACE_EVENT0("cc", "TileManager::NotifyReadyToActivate"); |
if (did_notify_ready_to_activate_) |
@@ -950,8 +989,7 @@ void TileManager::CheckIfMoreTilesNeedToBePrepared() { |
// where top-priority tiles are initialized. |
TileVector tiles_that_need_to_be_rasterized; |
scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
- client_->BuildRasterQueue(global_state_.tree_priority, |
- RasterTilePriorityQueue::Type::ALL)); |
+ BuildRasterQueue(RasterTilePriorityQueue::Type::ALL)); |
AssignGpuMemoryToTiles(raster_priority_queue.get(), |
scheduled_raster_task_limit_, |
&tiles_that_need_to_be_rasterized); |
@@ -984,9 +1022,7 @@ void TileManager::CheckIfMoreTilesNeedToBePrepared() { |
// could have evicted some tiles that would not be picked up by the old raster |
// queue. |
scoped_ptr<RasterTilePriorityQueue> required_for_activation_queue( |
- client_->BuildRasterQueue( |
- global_state_.tree_priority, |
- RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); |
+ BuildRasterQueue(RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION)); |
// If we have tiles to mark as rasterize on demand, but we don't allow |
// rasterize on demand, then skip activation and return early. |