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 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 raster_worker_pool_->Shutdown(); | 173 raster_worker_pool_->Shutdown(); |
174 raster_worker_pool_->CheckForCompletedTasks(); | 174 raster_worker_pool_->CheckForCompletedTasks(); |
175 | 175 |
176 DCHECK_EQ(0u, bytes_releasable_); | 176 DCHECK_EQ(0u, bytes_releasable_); |
177 DCHECK_EQ(0u, resources_releasable_); | 177 DCHECK_EQ(0u, resources_releasable_); |
178 } | 178 } |
179 | 179 |
180 void TileManager::SetGlobalState( | 180 void TileManager::SetGlobalState( |
181 const GlobalStateThatImpactsTilePriority& global_state) { | 181 const GlobalStateThatImpactsTilePriority& global_state) { |
182 global_state_ = global_state; | 182 global_state_ = global_state; |
183 resource_pool_->SetMemoryUsageLimits( | 183 resource_pool_->SetResourceUsageLimits( |
184 global_state_.memory_limit_in_bytes, | 184 global_state_.memory_limit_in_bytes, |
185 global_state_.unused_memory_limit_in_bytes, | 185 global_state_.unused_memory_limit_in_bytes, |
186 global_state_.num_resources_limit); | 186 global_state_.num_resources_limit); |
187 } | 187 } |
188 | 188 |
189 void TileManager::RegisterTile(Tile* tile) { | 189 void TileManager::RegisterTile(Tile* tile) { |
190 DCHECK(!tile->required_for_activation()); | 190 DCHECK(!tile->required_for_activation()); |
191 DCHECK(tiles_.find(tile->id()) == tiles_.end()); | 191 DCHECK(tiles_.find(tile->id()) == tiles_.end()); |
192 | 192 |
193 tiles_[tile->id()] = tile; | 193 tiles_[tile->id()] = tile; |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 // the needs-to-be-rasterized queue. | 492 // the needs-to-be-rasterized queue. |
493 all_tiles_that_need_to_be_rasterized_have_memory_ = true; | 493 all_tiles_that_need_to_be_rasterized_have_memory_ = true; |
494 all_tiles_required_for_activation_have_memory_ = true; | 494 all_tiles_required_for_activation_have_memory_ = true; |
495 all_tiles_required_for_activation_have_been_initialized_ = true; | 495 all_tiles_required_for_activation_have_been_initialized_ = true; |
496 | 496 |
497 // Cast to prevent overflow. | 497 // Cast to prevent overflow. |
498 int64 bytes_available = | 498 int64 bytes_available = |
499 static_cast<int64>(bytes_releasable_) + | 499 static_cast<int64>(bytes_releasable_) + |
500 static_cast<int64>(global_state_.memory_limit_in_bytes) - | 500 static_cast<int64>(global_state_.memory_limit_in_bytes) - |
501 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); | 501 static_cast<int64>(resource_pool_->acquired_memory_usage_bytes()); |
502 int resources_available = resources_releasable_ + | 502 int resources_available = |
503 global_state_.num_resources_limit - | 503 resources_releasable_ + |
504 resource_pool_->NumResources(); | 504 global_state_.num_resources_limit - |
| 505 resource_pool_->acquired_resource_count(); |
505 | 506 |
506 size_t bytes_allocatable = | 507 size_t bytes_allocatable = |
507 std::max(static_cast<int64>(0), bytes_available); | 508 std::max(static_cast<int64>(0), bytes_available); |
508 size_t resources_allocatable = std::max(0, resources_available); | 509 size_t resources_allocatable = std::max(0, resources_available); |
509 | 510 |
510 size_t bytes_that_exceeded_memory_budget = 0; | 511 size_t bytes_that_exceeded_memory_budget = 0; |
511 size_t bytes_left = bytes_allocatable; | 512 size_t bytes_left = bytes_allocatable; |
512 size_t resources_left = resources_allocatable; | 513 size_t resources_left = resources_allocatable; |
513 bool oomed = false; | 514 bool oomed = false; |
514 | 515 |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 | 699 |
699 DCHECK(tile_version.requires_resource()); | 700 DCHECK(tile_version.requires_resource()); |
700 DCHECK(!tile_version.resource_); | 701 DCHECK(!tile_version.resource_); |
701 | 702 |
702 if (tile_version.raster_task_.is_null()) | 703 if (tile_version.raster_task_.is_null()) |
703 tile_version.raster_task_ = CreateRasterTask(tile); | 704 tile_version.raster_task_ = CreateRasterTask(tile); |
704 | 705 |
705 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); | 706 tasks.Append(tile_version.raster_task_, tile->required_for_activation()); |
706 } | 707 } |
707 | 708 |
| 709 // We must reduce the amount of unused resoruces before calling |
| 710 // ScheduleTasks to prevent usage from rising above limits. |
| 711 resource_pool_->ReduceResourceUsage(); |
| 712 |
708 // Schedule running of |tasks|. This replaces any previously | 713 // Schedule running of |tasks|. This replaces any previously |
709 // scheduled tasks and effectively cancels all tasks not present | 714 // scheduled tasks and effectively cancels all tasks not present |
710 // in |tasks|. | 715 // in |tasks|. |
711 raster_worker_pool_->ScheduleTasks(&tasks); | 716 raster_worker_pool_->ScheduleTasks(&tasks); |
712 } | 717 } |
713 | 718 |
714 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( | 719 RasterWorkerPool::Task TileManager::CreateImageDecodeTask( |
715 Tile* tile, skia::LazyPixelRef* pixel_ref) { | 720 Tile* tile, skia::LazyPixelRef* pixel_ref) { |
716 return RasterWorkerPool::CreateImageDecodeTask( | 721 return RasterWorkerPool::CreateImageDecodeTask( |
717 pixel_ref, | 722 pixel_ref, |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
837 bytes_releasable_ += tile->bytes_consumed_if_allocated(); | 842 bytes_releasable_ += tile->bytes_consumed_if_allocated(); |
838 ++resources_releasable_; | 843 ++resources_releasable_; |
839 } | 844 } |
840 | 845 |
841 FreeUnusedResourcesForTile(tile); | 846 FreeUnusedResourcesForTile(tile); |
842 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 847 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
843 did_initialize_visible_tile_ = true; | 848 did_initialize_visible_tile_ = true; |
844 } | 849 } |
845 | 850 |
846 } // namespace cc | 851 } // namespace cc |
OLD | NEW |