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

Side by Side 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « cc/resources/tile_manager.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/resources/tile_manager.h" 5 #include "cc/resources/tile_manager.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <string> 9 #include <string>
10 10
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 raster_worker_pool_(raster_worker_pool.Pass()), 151 raster_worker_pool_(raster_worker_pool.Pass()),
152 prioritized_tiles_dirty_(false), 152 prioritized_tiles_dirty_(false),
153 all_tiles_that_need_to_be_rasterized_have_memory_(true), 153 all_tiles_that_need_to_be_rasterized_have_memory_(true),
154 all_tiles_required_for_activation_have_memory_(true), 154 all_tiles_required_for_activation_have_memory_(true),
155 memory_required_bytes_(0), 155 memory_required_bytes_(0),
156 memory_nice_to_have_bytes_(0), 156 memory_nice_to_have_bytes_(0),
157 bytes_releasable_(0), 157 bytes_releasable_(0),
158 resources_releasable_(0), 158 resources_releasable_(0),
159 ever_exceeded_memory_budget_(false), 159 ever_exceeded_memory_budget_(false),
160 rendering_stats_instrumentation_(rendering_stats_instrumentation), 160 rendering_stats_instrumentation_(rendering_stats_instrumentation),
161 did_initialize_visible_tile_(false) { 161 did_initialize_visible_tile_(false),
162 did_check_for_completed_tasks_since_last_schedule_tasks_(true) {
162 raster_worker_pool_->SetClient(this); 163 raster_worker_pool_->SetClient(this);
163 } 164 }
164 165
165 TileManager::~TileManager() { 166 TileManager::~TileManager() {
166 // Reset global state and manage. This should cause 167 // Reset global state and manage. This should cause
167 // our memory usage to drop to zero. 168 // our memory usage to drop to zero.
168 global_state_ = GlobalStateThatImpactsTilePriority(); 169 global_state_ = GlobalStateThatImpactsTilePriority();
169 170
170 DCHECK_EQ(0u, tiles_.size()); 171 DCHECK_EQ(0u, tiles_.size());
171 172
172 TileVector empty; 173 RasterWorkerPool::RasterTask::Queue empty;
173 ScheduleTasks(empty); 174 raster_worker_pool_->ScheduleTasks(&empty);
174 175
175 // This should finish all pending tasks and release any uninitialized 176 // This should finish all pending tasks and release any uninitialized
176 // resources. 177 // resources.
177 raster_worker_pool_->Shutdown(); 178 raster_worker_pool_->Shutdown();
178 raster_worker_pool_->CheckForCompletedTasks(); 179 raster_worker_pool_->CheckForCompletedTasks();
179 180
180 DCHECK_EQ(0u, bytes_releasable_); 181 DCHECK_EQ(0u, bytes_releasable_);
181 DCHECK_EQ(0u, resources_releasable_); 182 DCHECK_EQ(0u, resources_releasable_);
182 } 183 }
183 184
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 236
236 void TileManager::DidFinishRunningTasks() { 237 void TileManager::DidFinishRunningTasks() {
237 TRACE_EVENT0("cc", "TileManager::DidFinishRunningTasks"); 238 TRACE_EVENT0("cc", "TileManager::DidFinishRunningTasks");
238 239
239 // When OOM, keep re-assigning memory until we reach a steady state 240 // When OOM, keep re-assigning memory until we reach a steady state
240 // where top-priority tiles are initialized. 241 // where top-priority tiles are initialized.
241 if (all_tiles_that_need_to_be_rasterized_have_memory_) 242 if (all_tiles_that_need_to_be_rasterized_have_memory_)
242 return; 243 return;
243 244
244 raster_worker_pool_->CheckForCompletedTasks(); 245 raster_worker_pool_->CheckForCompletedTasks();
246 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
245 247
246 TileVector tiles_that_need_to_be_rasterized; 248 TileVector tiles_that_need_to_be_rasterized;
247 AssignGpuMemoryToTiles(GetPrioritizedTileSet(), 249 AssignGpuMemoryToTiles(GetPrioritizedTileSet(),
248 &tiles_that_need_to_be_rasterized); 250 &tiles_that_need_to_be_rasterized);
249 251
250 // |tiles_that_need_to_be_rasterized| will be empty when we reach a 252 // |tiles_that_need_to_be_rasterized| will be empty when we reach a
251 // steady memory state. Keep scheduling tasks until we reach this state. 253 // steady memory state. Keep scheduling tasks until we reach this state.
252 if (!tiles_that_need_to_be_rasterized.empty()) { 254 if (!tiles_that_need_to_be_rasterized.empty()) {
253 ScheduleTasks(tiles_that_need_to_be_rasterized); 255 ScheduleTasks(tiles_that_need_to_be_rasterized);
254 return; 256 return;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 : mts.bin; 392 : mts.bin;
391 393
392 // Insert the tile into a priority set. 394 // Insert the tile into a priority set.
393 tiles->InsertTile(tile, priority_bin); 395 tiles->InsertTile(tile, priority_bin);
394 } 396 }
395 } 397 }
396 398
397 void TileManager::ManageTiles() { 399 void TileManager::ManageTiles() {
398 TRACE_EVENT0("cc", "TileManager::ManageTiles"); 400 TRACE_EVENT0("cc", "TileManager::ManageTiles");
399 401
402 // We need to call CheckForCompletedTasks() once in-between each call
403 // to ScheduleTasks() to prevent canceled tasks from being scheduled.
404 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) {
405 raster_worker_pool_->CheckForCompletedTasks();
406 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
407 }
408
400 TileVector tiles_that_need_to_be_rasterized; 409 TileVector tiles_that_need_to_be_rasterized;
401 AssignGpuMemoryToTiles(GetPrioritizedTileSet(), 410 AssignGpuMemoryToTiles(GetPrioritizedTileSet(),
402 &tiles_that_need_to_be_rasterized); 411 &tiles_that_need_to_be_rasterized);
403 412
404 // Finally, schedule rasterizer tasks. 413 // Finally, schedule rasterizer tasks.
405 ScheduleTasks(tiles_that_need_to_be_rasterized); 414 ScheduleTasks(tiles_that_need_to_be_rasterized);
406 415
407 TRACE_EVENT_INSTANT1( 416 TRACE_EVENT_INSTANT1(
408 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, 417 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD,
409 "state", TracedValue::FromValue(BasicStateAsValue().release())); 418 "state", TracedValue::FromValue(BasicStateAsValue().release()));
410 419
411 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this, 420 TRACE_COUNTER_ID1("cc", "unused_memory_bytes", this,
412 resource_pool_->total_memory_usage_bytes() - 421 resource_pool_->total_memory_usage_bytes() -
413 resource_pool_->acquired_memory_usage_bytes()); 422 resource_pool_->acquired_memory_usage_bytes());
414 } 423 }
415 424
416 bool TileManager::UpdateVisibleTiles() { 425 bool TileManager::UpdateVisibleTiles() {
417 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); 426 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles");
418 427
419 raster_worker_pool_->CheckForCompletedTasks(); 428 raster_worker_pool_->CheckForCompletedTasks();
429 did_check_for_completed_tasks_since_last_schedule_tasks_ = true;
420 430
421 TRACE_EVENT_INSTANT1( 431 TRACE_EVENT_INSTANT1(
422 "cc", "DidUpdateVisibleTiles", TRACE_EVENT_SCOPE_THREAD, 432 "cc", "DidUpdateVisibleTiles", TRACE_EVENT_SCOPE_THREAD,
423 "stats", TracedValue::FromValue( 433 "stats", TracedValue::FromValue(
424 RasterTaskCompletionStatsAsValue( 434 RasterTaskCompletionStatsAsValue(
425 update_visible_tiles_stats_).release())); 435 update_visible_tiles_stats_).release()));
426 update_visible_tiles_stats_ = RasterTaskCompletionStats(); 436 update_visible_tiles_stats_ = RasterTaskCompletionStats();
427 437
428 bool did_initialize_visible_tile = did_initialize_visible_tile_; 438 bool did_initialize_visible_tile = did_initialize_visible_tile_;
429 did_initialize_visible_tile_ = false; 439 did_initialize_visible_tile_ = false;
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after
667 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); 677 FreeResourceForTile(tile, static_cast<RasterMode>(mode));
668 } 678 }
669 } 679 }
670 680
671 void TileManager::ScheduleTasks( 681 void TileManager::ScheduleTasks(
672 const TileVector& tiles_that_need_to_be_rasterized) { 682 const TileVector& tiles_that_need_to_be_rasterized) {
673 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", 683 TRACE_EVENT1("cc", "TileManager::ScheduleTasks",
674 "count", tiles_that_need_to_be_rasterized.size()); 684 "count", tiles_that_need_to_be_rasterized.size());
675 RasterWorkerPool::RasterTask::Queue tasks; 685 RasterWorkerPool::RasterTask::Queue tasks;
676 686
687 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_);
688
677 // Build a new task queue containing all task currently needed. Tasks 689 // Build a new task queue containing all task currently needed. Tasks
678 // are added in order of priority, highest priority task first. 690 // are added in order of priority, highest priority task first.
679 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); 691 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin();
680 it != tiles_that_need_to_be_rasterized.end(); 692 it != tiles_that_need_to_be_rasterized.end();
681 ++it) { 693 ++it) {
682 Tile* tile = *it; 694 Tile* tile = *it;
683 ManagedTileState& mts = tile->managed_state(); 695 ManagedTileState& mts = tile->managed_state();
684 ManagedTileState::TileVersion& tile_version = 696 ManagedTileState::TileVersion& tile_version =
685 mts.tile_versions[mts.raster_mode]; 697 mts.tile_versions[mts.raster_mode];
686 698
687 DCHECK(tile_version.requires_resource()); 699 DCHECK(tile_version.requires_resource());
688 DCHECK(!tile_version.resource_); 700 DCHECK(!tile_version.resource_);
689 701
690 if (tile_version.raster_task_.is_null()) 702 if (tile_version.raster_task_.is_null())
691 tile_version.raster_task_ = CreateRasterTask(tile); 703 tile_version.raster_task_ = CreateRasterTask(tile);
692 704
693 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); 705 tasks.Append(tile_version.raster_task_, tile->required_for_activation());
694 } 706 }
695 707
696 // We must reduce the amount of unused resoruces before calling 708 // We must reduce the amount of unused resoruces before calling
697 // ScheduleTasks to prevent usage from rising above limits. 709 // ScheduleTasks to prevent usage from rising above limits.
698 resource_pool_->ReduceResourceUsage(); 710 resource_pool_->ReduceResourceUsage();
699 711
700 // Schedule running of |tasks|. This replaces any previously 712 // Schedule running of |tasks|. This replaces any previously
701 // scheduled tasks and effectively cancels all tasks not present 713 // scheduled tasks and effectively cancels all tasks not present
702 // in |tasks|. 714 // in |tasks|.
703 raster_worker_pool_->ScheduleTasks(&tasks); 715 raster_worker_pool_->ScheduleTasks(&tasks);
716
717 did_check_for_completed_tasks_since_last_schedule_tasks_ = false;
704 } 718 }
705 719
706 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( 720 RasterWorkerPool::Task TileManager::CreateImageDecodeTask(
707 Tile* tile, skia::LazyPixelRef* pixel_ref) { 721 Tile* tile, skia::LazyPixelRef* pixel_ref) {
708 return RasterWorkerPool::CreateImageDecodeTask( 722 return RasterWorkerPool::CreateImageDecodeTask(
709 pixel_ref, 723 pixel_ref,
710 tile->layer_id(), 724 tile->layer_id(),
711 rendering_stats_instrumentation_, 725 rendering_stats_instrumentation_,
712 base::Bind(&TileManager::OnImageDecodeTaskCompleted, 726 base::Bind(&TileManager::OnImageDecodeTaskCompleted,
713 base::Unretained(this), 727 base::Unretained(this),
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
830 bytes_releasable_ += tile->bytes_consumed_if_allocated(); 844 bytes_releasable_ += tile->bytes_consumed_if_allocated();
831 ++resources_releasable_; 845 ++resources_releasable_;
832 } 846 }
833 847
834 FreeUnusedResourcesForTile(tile); 848 FreeUnusedResourcesForTile(tile);
835 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) 849 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0)
836 did_initialize_visible_tile_ = true; 850 did_initialize_visible_tile_ = true;
837 } 851 }
838 852
839 } // namespace cc 853 } // namespace cc
OLDNEW
« 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