OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |