Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(294)

Unified Diff: cc/resources/tile_manager.cc

Issue 24153017: cc: Always check for completed raster tasks before scheduling more tasks. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix unit tests Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/resources/tile_manager.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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(
« no previous file with comments | « cc/resources/tile_manager.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698