| Index: cc/resources/tile_manager.cc
|
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
|
| index 82b6bf4913ea3a47b0ff04661c1870a4eace4535..51e3c8eedb41aa23e9943d3d13d15d91f8b72d7a 100644
|
| --- a/cc/resources/tile_manager.cc
|
| +++ b/cc/resources/tile_manager.cc
|
| @@ -365,27 +365,28 @@ scoped_ptr<base::Value> RasterTaskCompletionStatsAsValue(
|
| // static
|
| scoped_ptr<TileManager> TileManager::Create(
|
| TileManagerClient* client,
|
| + base::SequencedTaskRunner* task_runner,
|
| ResourcePool* resource_pool,
|
| Rasterizer* rasterizer,
|
| Rasterizer* gpu_rasterizer,
|
| - bool use_rasterize_on_demand,
|
| RenderingStatsInstrumentation* rendering_stats_instrumentation) {
|
| return make_scoped_ptr(new TileManager(client,
|
| + task_runner,
|
| resource_pool,
|
| rasterizer,
|
| gpu_rasterizer,
|
| - use_rasterize_on_demand,
|
| rendering_stats_instrumentation));
|
| }
|
|
|
| TileManager::TileManager(
|
| TileManagerClient* client,
|
| + base::SequencedTaskRunner* task_runner,
|
| ResourcePool* resource_pool,
|
| Rasterizer* rasterizer,
|
| Rasterizer* gpu_rasterizer,
|
| - bool use_rasterize_on_demand,
|
| RenderingStatsInstrumentation* rendering_stats_instrumentation)
|
| : client_(client),
|
| + task_runner_(task_runner),
|
| resource_pool_(resource_pool),
|
| prioritized_tiles_dirty_(false),
|
| all_tiles_that_need_to_be_rasterized_have_memory_(true),
|
| @@ -398,7 +399,8 @@ TileManager::TileManager(
|
| rendering_stats_instrumentation_(rendering_stats_instrumentation),
|
| did_initialize_visible_tile_(false),
|
| did_check_for_completed_tasks_since_last_schedule_tasks_(true),
|
| - use_rasterize_on_demand_(use_rasterize_on_demand) {
|
| + check_if_ready_to_activate_pending_(false),
|
| + weak_ptr_factory_(this) {
|
| Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = {
|
| rasterizer, // RASTERIZER_TYPE_DEFAULT
|
| gpu_rasterizer, // RASTERIZER_TYPE_GPU
|
| @@ -535,12 +537,14 @@ void TileManager::DidFinishRunningTasks() {
|
| // If we can't raster on demand, give up early (and don't activate).
|
| if (!allow_rasterize_on_demand)
|
| return;
|
| - if (use_rasterize_on_demand_)
|
| - tile_version.set_rasterize_on_demand();
|
| +
|
| + tile_version.set_rasterize_on_demand();
|
| + client_->NotifyTileStateChanged(tile);
|
| }
|
| }
|
|
|
| - client_->NotifyReadyToActivate();
|
| + DCHECK(IsReadyToActivate());
|
| + ScheduleCheckIfReadyToActivate();
|
| }
|
|
|
| void TileManager::DidFinishRunningTasksRequiredForActivation() {
|
| @@ -552,7 +556,7 @@ void TileManager::DidFinishRunningTasksRequiredForActivation() {
|
| if (!all_tiles_required_for_activation_have_memory_)
|
| return;
|
|
|
| - client_->NotifyReadyToActivate();
|
| + ScheduleCheckIfReadyToActivate();
|
| }
|
|
|
| void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) {
|
| @@ -671,7 +675,7 @@ void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) {
|
| // can visit it.
|
| if (mts.bin == NEVER_BIN &&
|
| !mts.tile_versions[mts.raster_mode].raster_task_) {
|
| - FreeResourcesForTile(tile);
|
| + FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile);
|
| continue;
|
| }
|
|
|
| @@ -860,7 +864,7 @@ void TileManager::AssignGpuMemoryToTiles(
|
|
|
| // If the tile is not needed, free it up.
|
| if (mts.bin == NEVER_BIN) {
|
| - FreeResourcesForTile(tile);
|
| + FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile);
|
| continue;
|
| }
|
|
|
| @@ -902,14 +906,19 @@ void TileManager::AssignGpuMemoryToTiles(
|
|
|
| // Tile is OOM.
|
| if (tile_bytes > tile_bytes_left || tile_resources > resources_left) {
|
| + bool was_ready_to_draw = tile->IsReadyToDraw();
|
| +
|
| FreeResourcesForTile(tile);
|
|
|
| // This tile was already on screen and now its resources have been
|
| // released. In order to prevent checkerboarding, set this tile as
|
| // rasterize on demand immediately.
|
| - if (mts.visible_and_ready_to_draw && use_rasterize_on_demand_)
|
| + if (mts.visible_and_ready_to_draw)
|
| tile_version.set_rasterize_on_demand();
|
|
|
| + if (was_ready_to_draw)
|
| + client_->NotifyTileStateChanged(tile);
|
| +
|
| oomed_soft = true;
|
| if (tile_uses_hard_limit) {
|
| oomed_hard = true;
|
| @@ -1004,6 +1013,14 @@ void TileManager::FreeUnusedResourcesForTile(Tile* tile) {
|
| }
|
| }
|
|
|
| +void TileManager::FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(
|
| + Tile* tile) {
|
| + bool was_ready_to_draw = tile->IsReadyToDraw();
|
| + FreeResourcesForTile(tile);
|
| + if (was_ready_to_draw)
|
| + client_->NotifyTileStateChanged(tile);
|
| +}
|
| +
|
| void TileManager::ScheduleTasks(
|
| const TileVector& tiles_that_need_to_be_rasterized) {
|
| TRACE_EVENT1("cc",
|
| @@ -1200,11 +1217,11 @@ void TileManager::OnRasterTaskCompleted(
|
| ++resources_releasable_;
|
| }
|
|
|
| - client_->NotifyTileInitialized(tile);
|
| -
|
| FreeUnusedResourcesForTile(tile);
|
| if (tile->priority(ACTIVE_TREE).distance_to_visible == 0.f)
|
| did_initialize_visible_tile_ = true;
|
| +
|
| + client_->NotifyTileStateChanged(tile);
|
| }
|
|
|
| scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile,
|
| @@ -1640,4 +1657,38 @@ void TileManager::SetRasterizersForTesting(Rasterizer* rasterizer,
|
| RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers));
|
| }
|
|
|
| +bool TileManager::IsReadyToActivate() const {
|
| + for (std::vector<PictureLayerImpl*>::const_iterator it = layers_.begin();
|
| + it != layers_.end();
|
| + ++it) {
|
| + if (!(*it)->AllTilesRequiredForActivationAreReadyToDraw())
|
| + return false;
|
| + }
|
| +
|
| + return true;
|
| +}
|
| +
|
| +void TileManager::ScheduleCheckIfReadyToActivate() {
|
| + if (check_if_ready_to_activate_pending_)
|
| + return;
|
| +
|
| + task_runner_->PostTask(FROM_HERE,
|
| + base::Bind(&TileManager::CheckIfReadyToActivate,
|
| + weak_ptr_factory_.GetWeakPtr()));
|
| + check_if_ready_to_activate_pending_ = true;
|
| +}
|
| +
|
| +void TileManager::CheckIfReadyToActivate() {
|
| + TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate");
|
| +
|
| + DCHECK(check_if_ready_to_activate_pending_);
|
| + check_if_ready_to_activate_pending_ = false;
|
| +
|
| + rasterizer_delegate_->CheckForCompletedTasks();
|
| + did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
| +
|
| + if (IsReadyToActivate())
|
| + client_->NotifyReadyToActivate();
|
| +}
|
| +
|
| } // namespace cc
|
|
|