| Index: cc/resources/tile_manager.cc
|
| diff --git a/cc/resources/tile_manager.cc b/cc/resources/tile_manager.cc
|
| index b845eaf20e778d669c1c04f4525d7bb387ec98f7..c30e87be8392a96500c368040864f07081f0087b 100644
|
| --- a/cc/resources/tile_manager.cc
|
| +++ b/cc/resources/tile_manager.cc
|
| @@ -158,7 +158,8 @@ TileManager::TileManager(
|
| resources_releasable_(0),
|
| ever_exceeded_memory_budget_(false),
|
| rendering_stats_instrumentation_(rendering_stats_instrumentation),
|
| - did_initialize_visible_tile_(false) {
|
| + did_initialize_visible_tile_(false),
|
| + did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
|
| raster_worker_pool_->SetClient(this);
|
| }
|
|
|
| @@ -169,8 +170,8 @@ TileManager::~TileManager() {
|
|
|
| DCHECK_EQ(0u, tiles_.size());
|
|
|
| - TileVector empty;
|
| - ScheduleTasks(empty);
|
| + RasterWorkerPool::RasterTask::Queue empty;
|
| + raster_worker_pool_->ScheduleTasks(&empty);
|
|
|
| // This should finish all pending tasks and release any uninitialized
|
| // resources.
|
| @@ -242,6 +243,7 @@ void TileManager::DidFinishRunningTasks() {
|
| return;
|
|
|
| raster_worker_pool_->CheckForCompletedTasks();
|
| + did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
|
|
| TileVector tiles_that_need_to_be_rasterized;
|
| AssignGpuMemoryToTiles(GetPrioritizedTileSet(),
|
| @@ -397,6 +399,13 @@ void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) {
|
| void TileManager::ManageTiles() {
|
| TRACE_EVENT0("cc", "TileManager::ManageTiles");
|
|
|
| + // We need to call CheckForCompletedTasks() once in-between each call
|
| + // to ScheduleTasks() to prevent canceled tasks from being scheduled.
|
| + if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
|
| + raster_worker_pool_->CheckForCompletedTasks();
|
| + did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
| + }
|
| +
|
| TileVector tiles_that_need_to_be_rasterized;
|
| AssignGpuMemoryToTiles(GetPrioritizedTileSet(),
|
| &tiles_that_need_to_be_rasterized);
|
| @@ -417,6 +426,7 @@ bool TileManager::UpdateVisibleTiles() {
|
| TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
|
|
|
| raster_worker_pool_->CheckForCompletedTasks();
|
| + did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
|
|
|
| TRACE_EVENT_INSTANT1(
|
| "cc", "DidUpdateVisibleTiles", TRACE_EVENT_SCOPE_THREAD,
|
| @@ -674,6 +684,8 @@ void TileManager::ScheduleTasks(
|
| "count", tiles_that_need_to_be_rasterized.size());
|
| RasterWorkerPool::RasterTask::Queue tasks;
|
|
|
| + DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
|
| +
|
| // Build a new task queue containing all task currently needed. Tasks
|
| // are added in order of priority, highest priority task first.
|
| for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin();
|
| @@ -701,6 +713,8 @@ void TileManager::ScheduleTasks(
|
| // scheduled tasks and effectively cancels all tasks not present
|
| // in |tasks|.
|
| raster_worker_pool_->ScheduleTasks(&tasks);
|
| +
|
| + did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
|
| }
|
|
|
| RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
|
|
|