| 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 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 360 state->SetInteger("completed_count", stats.completed_count); | 360 state->SetInteger("completed_count", stats.completed_count); |
| 361 state->SetInteger("canceled_count", stats.canceled_count); | 361 state->SetInteger("canceled_count", stats.canceled_count); |
| 362 return state.PassAs<base::Value>(); | 362 return state.PassAs<base::Value>(); |
| 363 } | 363 } |
| 364 | 364 |
| 365 // static | 365 // static |
| 366 scoped_ptr<TileManager> TileManager::Create( | 366 scoped_ptr<TileManager> TileManager::Create( |
| 367 TileManagerClient* client, | 367 TileManagerClient* client, |
| 368 ResourcePool* resource_pool, | 368 ResourcePool* resource_pool, |
| 369 Rasterizer* rasterizer, | 369 Rasterizer* rasterizer, |
| 370 Rasterizer* gpu_rasterizer, | |
| 371 bool use_rasterize_on_demand, | 370 bool use_rasterize_on_demand, |
| 372 RenderingStatsInstrumentation* rendering_stats_instrumentation) { | 371 RenderingStatsInstrumentation* rendering_stats_instrumentation) { |
| 373 return make_scoped_ptr(new TileManager(client, | 372 return make_scoped_ptr(new TileManager(client, |
| 374 resource_pool, | 373 resource_pool, |
| 375 rasterizer, | 374 rasterizer, |
| 376 gpu_rasterizer, | |
| 377 use_rasterize_on_demand, | 375 use_rasterize_on_demand, |
| 378 rendering_stats_instrumentation)); | 376 rendering_stats_instrumentation)); |
| 379 } | 377 } |
| 380 | 378 |
| 381 TileManager::TileManager( | 379 TileManager::TileManager( |
| 382 TileManagerClient* client, | 380 TileManagerClient* client, |
| 383 ResourcePool* resource_pool, | 381 ResourcePool* resource_pool, |
| 384 Rasterizer* rasterizer, | 382 Rasterizer* rasterizer, |
| 385 Rasterizer* gpu_rasterizer, | |
| 386 bool use_rasterize_on_demand, | 383 bool use_rasterize_on_demand, |
| 387 RenderingStatsInstrumentation* rendering_stats_instrumentation) | 384 RenderingStatsInstrumentation* rendering_stats_instrumentation) |
| 388 : client_(client), | 385 : client_(client), |
| 389 resource_pool_(resource_pool), | 386 resource_pool_(resource_pool), |
| 387 rasterizer_(rasterizer), |
| 390 prioritized_tiles_dirty_(false), | 388 prioritized_tiles_dirty_(false), |
| 391 all_tiles_that_need_to_be_rasterized_have_memory_(true), | 389 all_tiles_that_need_to_be_rasterized_have_memory_(true), |
| 392 all_tiles_required_for_activation_have_memory_(true), | 390 all_tiles_required_for_activation_have_memory_(true), |
| 393 memory_required_bytes_(0), | 391 memory_required_bytes_(0), |
| 394 memory_nice_to_have_bytes_(0), | 392 memory_nice_to_have_bytes_(0), |
| 395 bytes_releasable_(0), | 393 bytes_releasable_(0), |
| 396 resources_releasable_(0), | 394 resources_releasable_(0), |
| 397 ever_exceeded_memory_budget_(false), | 395 ever_exceeded_memory_budget_(false), |
| 398 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 396 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 399 did_initialize_visible_tile_(false), | 397 did_initialize_visible_tile_(false), |
| 400 did_check_for_completed_tasks_since_last_schedule_tasks_(true), | 398 did_check_for_completed_tasks_since_last_schedule_tasks_(true), |
| 401 use_rasterize_on_demand_(use_rasterize_on_demand) { | 399 use_rasterize_on_demand_(use_rasterize_on_demand) { |
| 402 Rasterizer* rasterizers[NUM_RASTERIZER_TYPES] = { | 400 rasterizer_->SetClient(this); |
| 403 rasterizer, // RASTERIZER_TYPE_DEFAULT | |
| 404 gpu_rasterizer, // RASTERIZER_TYPE_GPU | |
| 405 }; | |
| 406 rasterizer_delegate_ = | |
| 407 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers)); | |
| 408 } | 401 } |
| 409 | 402 |
| 410 TileManager::~TileManager() { | 403 TileManager::~TileManager() { |
| 411 // Reset global state and manage. This should cause | 404 // Reset global state and manage. This should cause |
| 412 // our memory usage to drop to zero. | 405 // our memory usage to drop to zero. |
| 413 global_state_ = GlobalStateThatImpactsTilePriority(); | 406 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 414 | 407 |
| 415 CleanUpReleasedTiles(); | 408 CleanUpReleasedTiles(); |
| 416 DCHECK_EQ(0u, tiles_.size()); | 409 DCHECK_EQ(0u, tiles_.size()); |
| 417 | 410 |
| 418 RasterTaskQueue empty[NUM_RASTERIZER_TYPES]; | 411 RasterTaskQueue empty; |
| 419 rasterizer_delegate_->ScheduleTasks(empty); | 412 rasterizer_->ScheduleTasks(&empty); |
| 420 orphan_raster_tasks_.clear(); | 413 orphan_raster_tasks_.clear(); |
| 421 | 414 |
| 422 // This should finish all pending tasks and release any uninitialized | 415 // This should finish all pending tasks and release any uninitialized |
| 423 // resources. | 416 // resources. |
| 424 rasterizer_delegate_->Shutdown(); | 417 rasterizer_->Shutdown(); |
| 425 rasterizer_delegate_->CheckForCompletedTasks(); | 418 rasterizer_->CheckForCompletedTasks(); |
| 426 | 419 |
| 427 DCHECK_EQ(0u, bytes_releasable_); | 420 DCHECK_EQ(0u, bytes_releasable_); |
| 428 DCHECK_EQ(0u, resources_releasable_); | 421 DCHECK_EQ(0u, resources_releasable_); |
| 429 | 422 |
| 430 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin(); | 423 for (std::vector<PictureLayerImpl*>::iterator it = layers_.begin(); |
| 431 it != layers_.end(); | 424 it != layers_.end(); |
| 432 ++it) { | 425 ++it) { |
| 433 (*it)->DidUnregisterLayer(); | 426 (*it)->DidUnregisterLayer(); |
| 434 } | 427 } |
| 435 layers_.clear(); | 428 layers_.clear(); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 493 | 486 |
| 494 bool memory_usage_above_limit = resource_pool_->total_memory_usage_bytes() > | 487 bool memory_usage_above_limit = resource_pool_->total_memory_usage_bytes() > |
| 495 global_state_.soft_memory_limit_in_bytes; | 488 global_state_.soft_memory_limit_in_bytes; |
| 496 | 489 |
| 497 // When OOM, keep re-assigning memory until we reach a steady state | 490 // When OOM, keep re-assigning memory until we reach a steady state |
| 498 // where top-priority tiles are initialized. | 491 // where top-priority tiles are initialized. |
| 499 if (all_tiles_that_need_to_be_rasterized_have_memory_ && | 492 if (all_tiles_that_need_to_be_rasterized_have_memory_ && |
| 500 !memory_usage_above_limit) | 493 !memory_usage_above_limit) |
| 501 return; | 494 return; |
| 502 | 495 |
| 503 rasterizer_delegate_->CheckForCompletedTasks(); | 496 rasterizer_->CheckForCompletedTasks(); |
| 504 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 497 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 505 | 498 |
| 506 TileVector tiles_that_need_to_be_rasterized; | 499 TileVector tiles_that_need_to_be_rasterized; |
| 507 AssignGpuMemoryToTiles(&prioritized_tiles_, | 500 AssignGpuMemoryToTiles(&prioritized_tiles_, |
| 508 &tiles_that_need_to_be_rasterized); | 501 &tiles_that_need_to_be_rasterized); |
| 509 | 502 |
| 510 // |tiles_that_need_to_be_rasterized| will be empty when we reach a | 503 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
| 511 // steady memory state. Keep scheduling tasks until we reach this state. | 504 // steady memory state. Keep scheduling tasks until we reach this state. |
| 512 if (!tiles_that_need_to_be_rasterized.empty()) { | 505 if (!tiles_that_need_to_be_rasterized.empty()) { |
| 513 ScheduleTasks(tiles_that_need_to_be_rasterized); | 506 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 700 if (state != global_state_) { | 693 if (state != global_state_) { |
| 701 global_state_ = state; | 694 global_state_ = state; |
| 702 prioritized_tiles_dirty_ = true; | 695 prioritized_tiles_dirty_ = true; |
| 703 } | 696 } |
| 704 | 697 |
| 705 CleanUpLayers(); | 698 CleanUpLayers(); |
| 706 | 699 |
| 707 // We need to call CheckForCompletedTasks() once in-between each call | 700 // We need to call CheckForCompletedTasks() once in-between each call |
| 708 // to ScheduleTasks() to prevent canceled tasks from being scheduled. | 701 // to ScheduleTasks() to prevent canceled tasks from being scheduled. |
| 709 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { | 702 if (!did_check_for_completed_tasks_since_last_schedule_tasks_) { |
| 710 rasterizer_delegate_->CheckForCompletedTasks(); | 703 rasterizer_->CheckForCompletedTasks(); |
| 711 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 704 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 712 } | 705 } |
| 713 | 706 |
| 714 UpdatePrioritizedTileSetIfNeeded(); | 707 UpdatePrioritizedTileSetIfNeeded(); |
| 715 | 708 |
| 716 TileVector tiles_that_need_to_be_rasterized; | 709 TileVector tiles_that_need_to_be_rasterized; |
| 717 AssignGpuMemoryToTiles(&prioritized_tiles_, | 710 AssignGpuMemoryToTiles(&prioritized_tiles_, |
| 718 &tiles_that_need_to_be_rasterized); | 711 &tiles_that_need_to_be_rasterized); |
| 719 | 712 |
| 720 // Finally, schedule rasterizer tasks. | 713 // Finally, schedule rasterizer tasks. |
| 721 ScheduleTasks(tiles_that_need_to_be_rasterized); | 714 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 722 | 715 |
| 723 TRACE_EVENT_INSTANT1("cc", | 716 TRACE_EVENT_INSTANT1("cc", |
| 724 "DidManage", | 717 "DidManage", |
| 725 TRACE_EVENT_SCOPE_THREAD, | 718 TRACE_EVENT_SCOPE_THREAD, |
| 726 "state", | 719 "state", |
| 727 TracedValue::FromValue(BasicStateAsValue().release())); | 720 TracedValue::FromValue(BasicStateAsValue().release())); |
| 728 | 721 |
| 729 TRACE_COUNTER_ID1("cc", | 722 TRACE_COUNTER_ID1("cc", |
| 730 "unused_memory_bytes", | 723 "unused_memory_bytes", |
| 731 this, | 724 this, |
| 732 resource_pool_->total_memory_usage_bytes() - | 725 resource_pool_->total_memory_usage_bytes() - |
| 733 resource_pool_->acquired_memory_usage_bytes()); | 726 resource_pool_->acquired_memory_usage_bytes()); |
| 734 } | 727 } |
| 735 | 728 |
| 736 bool TileManager::UpdateVisibleTiles() { | 729 bool TileManager::UpdateVisibleTiles() { |
| 737 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); | 730 TRACE_EVENT0("cc", "TileManager::UpdateVisibleTiles"); |
| 738 | 731 |
| 739 rasterizer_delegate_->CheckForCompletedTasks(); | 732 rasterizer_->CheckForCompletedTasks(); |
| 740 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; | 733 did_check_for_completed_tasks_since_last_schedule_tasks_ = true; |
| 741 | 734 |
| 742 TRACE_EVENT_INSTANT1( | 735 TRACE_EVENT_INSTANT1( |
| 743 "cc", | 736 "cc", |
| 744 "DidUpdateVisibleTiles", | 737 "DidUpdateVisibleTiles", |
| 745 TRACE_EVENT_SCOPE_THREAD, | 738 TRACE_EVENT_SCOPE_THREAD, |
| 746 "stats", | 739 "stats", |
| 747 TracedValue::FromValue(RasterTaskCompletionStatsAsValue( | 740 TracedValue::FromValue(RasterTaskCompletionStatsAsValue( |
| 748 update_visible_tiles_stats_).release())); | 741 update_visible_tiles_stats_).release())); |
| 749 update_visible_tiles_stats_ = RasterTaskCompletionStats(); | 742 update_visible_tiles_stats_ = RasterTaskCompletionStats(); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1006 | 999 |
| 1007 void TileManager::ScheduleTasks( | 1000 void TileManager::ScheduleTasks( |
| 1008 const TileVector& tiles_that_need_to_be_rasterized) { | 1001 const TileVector& tiles_that_need_to_be_rasterized) { |
| 1009 TRACE_EVENT1("cc", | 1002 TRACE_EVENT1("cc", |
| 1010 "TileManager::ScheduleTasks", | 1003 "TileManager::ScheduleTasks", |
| 1011 "count", | 1004 "count", |
| 1012 tiles_that_need_to_be_rasterized.size()); | 1005 tiles_that_need_to_be_rasterized.size()); |
| 1013 | 1006 |
| 1014 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); | 1007 DCHECK(did_check_for_completed_tasks_since_last_schedule_tasks_); |
| 1015 | 1008 |
| 1016 for (size_t i = 0; i < NUM_RASTERIZER_TYPES; ++i) | 1009 raster_queue_.Reset(); |
| 1017 raster_queue_[i].Reset(); | |
| 1018 | 1010 |
| 1019 // Build a new task queue containing all task currently needed. Tasks | 1011 // Build a new task queue containing all task currently needed. Tasks |
| 1020 // are added in order of priority, highest priority task first. | 1012 // are added in order of priority, highest priority task first. |
| 1021 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); | 1013 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
| 1022 it != tiles_that_need_to_be_rasterized.end(); | 1014 it != tiles_that_need_to_be_rasterized.end(); |
| 1023 ++it) { | 1015 ++it) { |
| 1024 Tile* tile = *it; | 1016 Tile* tile = *it; |
| 1025 ManagedTileState& mts = tile->managed_state(); | 1017 ManagedTileState& mts = tile->managed_state(); |
| 1026 ManagedTileState::TileVersion& tile_version = | 1018 ManagedTileState::TileVersion& tile_version = |
| 1027 mts.tile_versions[mts.raster_mode]; | 1019 mts.tile_versions[mts.raster_mode]; |
| 1028 | 1020 |
| 1029 DCHECK(tile_version.requires_resource()); | 1021 DCHECK(tile_version.requires_resource()); |
| 1030 DCHECK(!tile_version.resource_); | 1022 DCHECK(!tile_version.resource_); |
| 1031 | 1023 |
| 1032 if (!tile_version.raster_task_) | 1024 if (!tile_version.raster_task_) |
| 1033 tile_version.raster_task_ = CreateRasterTask(tile); | 1025 tile_version.raster_task_ = CreateRasterTask(tile); |
| 1034 | 1026 |
| 1035 size_t pool_type = tile->use_gpu_rasterization() ? RASTERIZER_TYPE_GPU | 1027 raster_queue_.items.push_back(RasterTaskQueue::Item( |
| 1036 : RASTERIZER_TYPE_DEFAULT; | |
| 1037 | |
| 1038 raster_queue_[pool_type].items.push_back(RasterTaskQueue::Item( | |
| 1039 tile_version.raster_task_.get(), tile->required_for_activation())); | 1028 tile_version.raster_task_.get(), tile->required_for_activation())); |
| 1040 raster_queue_[pool_type].required_for_activation_count += | 1029 raster_queue_.required_for_activation_count += |
| 1041 tile->required_for_activation(); | 1030 tile->required_for_activation(); |
| 1042 } | 1031 } |
| 1043 | 1032 |
| 1044 // We must reduce the amount of unused resoruces before calling | 1033 // We must reduce the amount of unused resoruces before calling |
| 1045 // ScheduleTasks to prevent usage from rising above limits. | 1034 // ScheduleTasks to prevent usage from rising above limits. |
| 1046 resource_pool_->ReduceResourceUsage(); | 1035 resource_pool_->ReduceResourceUsage(); |
| 1047 | 1036 |
| 1048 // Schedule running of |raster_tasks_|. This replaces any previously | 1037 // Schedule running of |raster_tasks_|. This replaces any previously |
| 1049 // scheduled tasks and effectively cancels all tasks not present | 1038 // scheduled tasks and effectively cancels all tasks not present |
| 1050 // in |raster_tasks_|. | 1039 // in |raster_tasks_|. |
| 1051 rasterizer_delegate_->ScheduleTasks(raster_queue_); | 1040 rasterizer_->ScheduleTasks(&raster_queue_); |
| 1052 | 1041 |
| 1053 // It's now safe to clean up orphan tasks as raster worker pool is not | 1042 // It's now safe to clean up orphan tasks as raster worker pool is not |
| 1054 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has | 1043 // allowed to keep around unreferenced raster tasks after ScheduleTasks() has |
| 1055 // been called. | 1044 // been called. |
| 1056 orphan_raster_tasks_.clear(); | 1045 orphan_raster_tasks_.clear(); |
| 1057 | 1046 |
| 1058 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; | 1047 did_check_for_completed_tasks_since_last_schedule_tasks_ = false; |
| 1059 } | 1048 } |
| 1060 | 1049 |
| 1061 scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( | 1050 scoped_refptr<ImageDecodeTask> TileManager::CreateImageDecodeTask( |
| (...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1626 bool prioritize_low_res = tree_priority_ != SMOOTHNESS_TAKES_PRIORITY; | 1615 bool prioritize_low_res = tree_priority_ != SMOOTHNESS_TAKES_PRIORITY; |
| 1627 | 1616 |
| 1628 if (b_priority.resolution != a_priority.resolution) { | 1617 if (b_priority.resolution != a_priority.resolution) { |
| 1629 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || | 1618 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || |
| 1630 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || | 1619 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || |
| 1631 (a_priority.resolution == NON_IDEAL_RESOLUTION); | 1620 (a_priority.resolution == NON_IDEAL_RESOLUTION); |
| 1632 } | 1621 } |
| 1633 return a_priority.IsHigherPriorityThan(b_priority); | 1622 return a_priority.IsHigherPriorityThan(b_priority); |
| 1634 } | 1623 } |
| 1635 | 1624 |
| 1636 void TileManager::SetRasterizersForTesting(Rasterizer* rasterizer, | 1625 void TileManager::SetRasterizerForTesting(Rasterizer* rasterizer) { |
| 1637 Rasterizer* gpu_rasterizer) { | 1626 rasterizer_ = rasterizer; |
| 1638 Rasterizer* rasterizers[2] = {rasterizer, gpu_rasterizer}; | 1627 rasterizer_->SetClient(this); |
| 1639 rasterizer_delegate_ = | |
| 1640 RasterizerDelegate::Create(this, rasterizers, arraysize(rasterizers)); | |
| 1641 } | 1628 } |
| 1642 | 1629 |
| 1643 } // namespace cc | 1630 } // namespace cc |
| OLD | NEW |