Index: cc/resources/tile_manager.cc |
diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
index da888cd77297c66a19ba39bc84425ce3abe040f4..2b247aa20856e22a2ba12b321ce0d3dd6f2e9d7c 100644 |
--- a/cc/resources/tile_manager.cc |
+++ b/cc/resources/tile_manager.cc |
@@ -362,6 +362,11 @@ void TileManager::PrepareTiles( |
scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
client_->BuildRasterQueue(global_state_.tree_priority, |
RasterTilePriorityQueue::Type::ALL)); |
+ // Inform the client that will likely require a draw if the top tile is |
+ // required for draw. |
+ client_->SetIsLikelyToRequireADraw( |
+ !raster_priority_queue->IsEmpty() && |
+ raster_priority_queue->Top()->required_for_draw()); |
AssignGpuMemoryToTiles(raster_priority_queue.get(), |
scheduled_raster_task_limit_, |
&tiles_that_need_to_be_rasterized); |
@@ -830,8 +835,10 @@ void TileManager::UpdateTileDrawInfo( |
if (analysis.is_solid_color) { |
draw_info.set_solid_color(analysis.solid_color); |
- resource_pool_->ReleaseResource(resource.Pass()); |
+ if (resource) |
+ resource_pool_->ReleaseResource(resource.Pass()); |
} else { |
+ DCHECK(resource); |
draw_info.set_use_resource(); |
draw_info.resource_ = resource.Pass(); |
} |
@@ -863,31 +870,31 @@ void TileManager::SetTileTaskRunnerForTesting( |
tile_task_runner_->SetClient(this); |
} |
-bool TileManager::IsReadyToActivate() const { |
- TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); |
- const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); |
- |
- // TODO(vmpstr): Replace this with building a REQUIRED_TO_ACTIVATE raster |
- // queue and checking if the tiles it contains are all ready to draw. |
- for (const auto& layer : layers) { |
- if (!layer->AllTilesRequiredForActivationAreReadyToDraw()) |
+bool TileManager::AreRequiredTilesReadyToDraw( |
+ RasterTilePriorityQueue::Type type) const { |
+ scoped_ptr<RasterTilePriorityQueue> raster_priority_queue( |
+ client_->BuildRasterQueue(global_state_.tree_priority, 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 |
+ // have to iterate the queue to check whether the required tiles are ready to |
+ // draw. |
+ for (; !raster_priority_queue->IsEmpty(); raster_priority_queue->Pop()) { |
+ if (!raster_priority_queue->Top()->IsReadyToDraw()) |
return false; |
} |
- |
return true; |
} |
+bool TileManager::IsReadyToActivate() const { |
+ TRACE_EVENT0("cc", "TileManager::IsReadyToActivate"); |
+ return AreRequiredTilesReadyToDraw( |
+ RasterTilePriorityQueue::Type::REQUIRED_FOR_ACTIVATION); |
+} |
bool TileManager::IsReadyToDraw() const { |
- const std::vector<PictureLayerImpl*>& layers = client_->GetPictureLayers(); |
- |
- // TODO(vmpstr): Replace this with building a REQUIRED_TO_DRAW raster queue |
- // and checking if the tiles it contains are all ready to draw. |
- for (const auto& layer : layers) { |
- if (!layer->AllTilesRequiredForDrawAreReadyToDraw()) |
- return false; |
- } |
- |
- return true; |
+ TRACE_EVENT0("cc", "TileManager::IsReadyToDraw"); |
+ return AreRequiredTilesReadyToDraw( |
+ RasterTilePriorityQueue::Type::REQUIRED_FOR_DRAW); |
} |
void TileManager::NotifyReadyToActivate() { |