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 |
11 #include "base/bind.h" | 11 #include "base/bind.h" |
12 #include "base/debug/trace_event_argument.h" | 12 #include "base/debug/trace_event_argument.h" |
| 13 #include "base/debug/trace_event_synthetic_delay.h" |
13 #include "base/json/json_writer.h" | 14 #include "base/json/json_writer.h" |
| 15 #include "base/lazy_instance.h" |
14 #include "base/logging.h" | 16 #include "base/logging.h" |
15 #include "base/metrics/histogram.h" | 17 #include "base/metrics/histogram.h" |
16 #include "cc/debug/devtools_instrumentation.h" | 18 #include "cc/debug/devtools_instrumentation.h" |
17 #include "cc/debug/frame_viewer_instrumentation.h" | 19 #include "cc/debug/frame_viewer_instrumentation.h" |
18 #include "cc/debug/traced_value.h" | 20 #include "cc/debug/traced_value.h" |
19 #include "cc/layers/picture_layer_impl.h" | 21 #include "cc/layers/picture_layer_impl.h" |
20 #include "cc/resources/rasterizer.h" | 22 #include "cc/resources/rasterizer.h" |
21 #include "cc/resources/tile.h" | 23 #include "cc/resources/tile.h" |
22 #include "skia/ext/paint_simplifier.h" | 24 #include "skia/ext/paint_simplifier.h" |
23 #include "third_party/skia/include/core/SkBitmap.h" | 25 #include "third_party/skia/include/core/SkBitmap.h" |
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
375 all_tiles_required_for_activation_have_memory_(true), | 377 all_tiles_required_for_activation_have_memory_(true), |
376 bytes_releasable_(0), | 378 bytes_releasable_(0), |
377 resources_releasable_(0), | 379 resources_releasable_(0), |
378 ever_exceeded_memory_budget_(false), | 380 ever_exceeded_memory_budget_(false), |
379 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 381 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
380 did_initialize_visible_tile_(false), | 382 did_initialize_visible_tile_(false), |
381 did_check_for_completed_tasks_since_last_schedule_tasks_(true), | 383 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
382 ready_to_activate_check_notifier_( | 384 ready_to_activate_check_notifier_( |
383 task_runner_.get(), | 385 task_runner_.get(), |
384 base::Bind(&TileManager::CheckIfReadyToActivate, | 386 base::Bind(&TileManager::CheckIfReadyToActivate, |
385 base::Unretained(this))) { | 387 base::Unretained(this))), |
| 388 raster_required_for_activation_synthetic_delay_( |
| 389 base::debug::TraceEventSyntheticDelay::Lookup( |
| 390 "cc.RasterRequiredForActivation")) { |
386 rasterizer_->SetClient(this); | 391 rasterizer_->SetClient(this); |
387 } | 392 } |
388 | 393 |
389 TileManager::~TileManager() { | 394 TileManager::~TileManager() { |
390 // Reset global state and manage. This should cause | 395 // Reset global state and manage. This should cause |
391 // our memory usage to drop to zero. | 396 // our memory usage to drop to zero. |
392 global_state_ = GlobalStateThatImpactsTilePriority(); | 397 global_state_ = GlobalStateThatImpactsTilePriority(); |
393 | 398 |
394 RasterTaskQueue empty; | 399 RasterTaskQueue empty; |
395 rasterizer_->ScheduleTasks(&empty); | 400 rasterizer_->ScheduleTasks(&empty); |
(...skipping 17 matching lines...) Expand all Loading... |
413 DCHECK(TilePriority() == tile->combined_priority()); | 418 DCHECK(TilePriority() == tile->combined_priority()); |
414 | 419 |
415 prioritized_tiles_dirty_ = true; | 420 prioritized_tiles_dirty_ = true; |
416 released_tiles_.push_back(tile); | 421 released_tiles_.push_back(tile); |
417 } | 422 } |
418 | 423 |
419 void TileManager::DidChangeTilePriority(Tile* tile) { | 424 void TileManager::DidChangeTilePriority(Tile* tile) { |
420 prioritized_tiles_dirty_ = true; | 425 prioritized_tiles_dirty_ = true; |
421 } | 426 } |
422 | 427 |
423 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { | 428 bool TileManager::ShouldForceTaskSetToComplete(TaskSet task_set) const { |
424 return global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY; | 429 return task_set == REQUIRED_FOR_ACTIVATION && |
| 430 global_state_.tree_priority != SMOOTHNESS_TAKES_PRIORITY; |
425 } | 431 } |
426 | 432 |
427 void TileManager::FreeResourcesForReleasedTiles() { | 433 void TileManager::FreeResourcesForReleasedTiles() { |
428 for (std::vector<Tile*>::iterator it = released_tiles_.begin(); | 434 for (std::vector<Tile*>::iterator it = released_tiles_.begin(); |
429 it != released_tiles_.end(); | 435 it != released_tiles_.end(); |
430 ++it) { | 436 ++it) { |
431 Tile* tile = *it; | 437 Tile* tile = *it; |
432 FreeResourcesForTile(tile); | 438 FreeResourcesForTile(tile); |
433 } | 439 } |
434 } | 440 } |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 | 535 |
530 tile_version.set_rasterize_on_demand(); | 536 tile_version.set_rasterize_on_demand(); |
531 client_->NotifyTileStateChanged(tile); | 537 client_->NotifyTileStateChanged(tile); |
532 } | 538 } |
533 } | 539 } |
534 | 540 |
535 DCHECK(IsReadyToActivate()); | 541 DCHECK(IsReadyToActivate()); |
536 ready_to_activate_check_notifier_.Schedule(); | 542 ready_to_activate_check_notifier_.Schedule(); |
537 } | 543 } |
538 | 544 |
539 void TileManager::DidFinishRunningTasksRequiredForActivation() { | 545 void TileManager::DidFinishRunningTaskSet(TaskSet task_set) { |
540 // This is only a true indication that all tiles required for | 546 if (task_set == REQUIRED_FOR_ACTIVATION) { |
541 // activation are initialized when no tiles are OOM. We need to | 547 // This is only a true indication that all tiles required for |
542 // wait for DidFinishRunningTasks() to be called, try to re-assign | 548 // activation are initialized when no tiles are OOM. We need to |
543 // memory and in worst case use on-demand raster when tiles | 549 // wait for DidFinishRunningTasks() to be called, try to re-assign |
544 // required for activation are OOM. | 550 // memory and in worst case use on-demand raster when tiles |
545 if (!all_tiles_required_for_activation_have_memory_) | 551 // required for activation are OOM. |
546 return; | 552 if (!all_tiles_required_for_activation_have_memory_) |
| 553 return; |
547 | 554 |
548 ready_to_activate_check_notifier_.Schedule(); | 555 ready_to_activate_check_notifier_.Schedule(); |
| 556 } |
| 557 } |
| 558 |
| 559 base::debug::TraceEventSyntheticDelay* TileManager::SyntheticDelayForTaskSet( |
| 560 TaskSet task_set) const { |
| 561 if (task_set == REQUIRED_FOR_ACTIVATION) |
| 562 return raster_required_for_activation_synthetic_delay_; |
| 563 else |
| 564 return NULL; |
549 } | 565 } |
550 | 566 |
551 void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) { | 567 void TileManager::GetTilesWithAssignedBins(PrioritizedTileSet* tiles) { |
552 TRACE_EVENT0("cc", "TileManager::GetTilesWithAssignedBins"); | 568 TRACE_EVENT0("cc", "TileManager::GetTilesWithAssignedBins"); |
553 | 569 |
554 const TileMemoryLimitPolicy memory_policy = global_state_.memory_limit_policy; | 570 const TileMemoryLimitPolicy memory_policy = global_state_.memory_limit_policy; |
555 const TreePriority tree_priority = global_state_.tree_priority; | 571 const TreePriority tree_priority = global_state_.tree_priority; |
556 | 572 |
557 // For each tree, bin into different categories of tiles. | 573 // For each tree, bin into different categories of tiles. |
558 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 574 for (TileMap::const_iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
(...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
966 ManagedTileState& mts = tile->managed_state(); | 982 ManagedTileState& mts = tile->managed_state(); |
967 ManagedTileState::TileVersion& tile_version = | 983 ManagedTileState::TileVersion& tile_version = |
968 mts.tile_versions[mts.raster_mode]; | 984 mts.tile_versions[mts.raster_mode]; |
969 | 985 |
970 DCHECK(tile_version.requires_resource()); | 986 DCHECK(tile_version.requires_resource()); |
971 DCHECK(!tile_version.resource_); | 987 DCHECK(!tile_version.resource_); |
972 | 988 |
973 if (!tile_version.raster_task_.get()) | 989 if (!tile_version.raster_task_.get()) |
974 tile_version.raster_task_ = CreateRasterTask(tile); | 990 tile_version.raster_task_ = CreateRasterTask(tile); |
975 | 991 |
976 raster_queue_.items.push_back(RasterTaskQueue::Item( | 992 RasterTaskQueue::Item::TaskSetCollection task_sets; |
977 tile_version.raster_task_.get(), tile->required_for_activation())); | 993 if (tile->required_for_activation()) |
978 raster_queue_.required_for_activation_count += | 994 task_sets.set(REQUIRED_FOR_ACTIVATION); |
979 tile->required_for_activation(); | 995 raster_queue_.items.push_back( |
| 996 RasterTaskQueue::Item(tile_version.raster_task_.get(), task_sets)); |
| 997 raster_queue_.task_set_sizes += task_sets; |
980 } | 998 } |
981 | 999 |
982 // We must reduce the amount of unused resoruces before calling | 1000 // We must reduce the amount of unused resoruces before calling |
983 // ScheduleTasks to prevent usage from rising above limits. | 1001 // ScheduleTasks to prevent usage from rising above limits. |
984 resource_pool_->ReduceResourceUsage(); | 1002 resource_pool_->ReduceResourceUsage(); |
985 | 1003 |
986 // Schedule running of |raster_tasks_|. This replaces any previously | 1004 // Schedule running of |raster_tasks_|. This replaces any previously |
987 // scheduled tasks and effectively cancels all tasks not present | 1005 // scheduled tasks and effectively cancels all tasks not present |
988 // in |raster_tasks_|. | 1006 // in |raster_tasks_|. |
989 rasterizer_->ScheduleTasks(&raster_queue_); | 1007 rasterizer_->ScheduleTasks(&raster_queue_); |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); | 1186 TRACE_EVENT0("cc", "TileManager::CheckIfReadyToActivate"); |
1169 | 1187 |
1170 rasterizer_->CheckForCompletedTasks(); | 1188 rasterizer_->CheckForCompletedTasks(); |
1171 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 1189 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
1172 | 1190 |
1173 if (IsReadyToActivate()) | 1191 if (IsReadyToActivate()) |
1174 client_->NotifyReadyToActivate(); | 1192 client_->NotifyReadyToActivate(); |
1175 } | 1193 } |
1176 | 1194 |
1177 } // namespace cc | 1195 } // namespace cc |
OLD | NEW |