Chromium Code Reviews| Index: cc/resources/tile_manager.cc |
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc |
| index 9868a4e180553b16e62b9fd35b9d24420532580a..c207ddddd80d4f4236ed2fe1882bd9677c50861e 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) { |
| @@ -668,7 +672,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); |
|
vmpstr
2014/05/16 17:09:06
yay 56 character function names :P
|
| continue; |
| } |
| @@ -842,7 +846,7 @@ void TileManager::AssignGpuMemoryToTiles( |
| // If the tile is not needed, free it up. |
| if (mts.bin == NEVER_BIN) { |
| - FreeResourcesForTile(tile); |
| + FreeResourcesForTileAndNotifyClientIfTileWasReadyToDraw(tile); |
| continue; |
| } |
| @@ -884,14 +888,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; |
| @@ -986,6 +995,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", |
| @@ -1182,11 +1199,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, |
| @@ -1622,4 +1639,36 @@ 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() { |
| + 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 |