Chromium Code Reviews| 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 127 rendering_stats_instrumentation_(rendering_stats_instrumentation), | 127 rendering_stats_instrumentation_(rendering_stats_instrumentation), |
| 128 did_initialize_visible_tile_(false), | 128 did_initialize_visible_tile_(false), |
| 129 texture_format_(texture_format) { | 129 texture_format_(texture_format) { |
| 130 raster_worker_pool_->SetClient(this); | 130 raster_worker_pool_->SetClient(this); |
| 131 } | 131 } |
| 132 | 132 |
| 133 TileManager::~TileManager() { | 133 TileManager::~TileManager() { |
| 134 // Reset global state and manage. This should cause | 134 // Reset global state and manage. This should cause |
| 135 // our memory usage to drop to zero. | 135 // our memory usage to drop to zero. |
| 136 global_state_ = GlobalStateThatImpactsTilePriority(); | 136 global_state_ = GlobalStateThatImpactsTilePriority(); |
| 137 AssignGpuMemoryToTiles(); | 137 TileVector tiles_that_need_to_be_rasterized; |
| 138 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | |
| 138 CleanUpUnusedImageDecodeTasks(); | 139 CleanUpUnusedImageDecodeTasks(); |
| 139 // This should finish all pending tasks and release any uninitialized | 140 // This should finish all pending tasks and release any uninitialized |
| 140 // resources. | 141 // resources. |
| 141 raster_worker_pool_->Shutdown(); | 142 raster_worker_pool_->Shutdown(); |
| 142 raster_worker_pool_->CheckForCompletedTasks(); | 143 raster_worker_pool_->CheckForCompletedTasks(); |
| 143 DCHECK_EQ(0u, tiles_.size()); | 144 DCHECK_EQ(0u, tiles_.size()); |
| 144 } | 145 } |
| 145 | 146 |
| 146 void TileManager::SetGlobalState( | 147 void TileManager::SetGlobalState( |
| 147 const GlobalStateThatImpactsTilePriority& global_state) { | 148 const GlobalStateThatImpactsTilePriority& global_state) { |
| 148 global_state_ = global_state; | 149 global_state_ = global_state; |
| 149 resource_pool_->SetMaxMemoryUsageBytes( | 150 resource_pool_->SetMaxMemoryUsageBytes( |
| 150 global_state_.memory_limit_in_bytes, | 151 global_state_.memory_limit_in_bytes, |
| 151 global_state_.unused_memory_limit_in_bytes); | 152 global_state_.unused_memory_limit_in_bytes); |
| 152 } | 153 } |
| 153 | 154 |
| 154 void TileManager::RegisterTile(Tile* tile) { | 155 void TileManager::RegisterTile(Tile* tile) { |
| 155 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) == tiles_.end()); | 156 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) == tiles_.end()); |
| 156 DCHECK(!tile->required_for_activation()); | 157 DCHECK(!tile->required_for_activation()); |
| 158 DCHECK(managed_tiles_.find(tile->id()) == managed_tiles_.end()); | |
| 159 | |
| 157 tiles_.push_back(tile); | 160 tiles_.push_back(tile); |
|
reveman
2013/07/03 20:20:06
I prefer if this becomes |sorted_tiles_| as that b
vmpstr
2013/07/03 23:47:51
Done.
| |
| 161 managed_tiles_[tile->id()] = tile; | |
| 158 } | 162 } |
| 159 | 163 |
| 160 void TileManager::UnregisterTile(Tile* tile) { | 164 void TileManager::UnregisterTile(Tile* tile) { |
| 161 TileVector::iterator raster_iter = | |
| 162 std::find(tiles_that_need_to_be_rasterized_.begin(), | |
| 163 tiles_that_need_to_be_rasterized_.end(), | |
| 164 tile); | |
| 165 if (raster_iter != tiles_that_need_to_be_rasterized_.end()) | |
| 166 tiles_that_need_to_be_rasterized_.erase(raster_iter); | |
| 167 | |
| 168 tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 165 tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| 169 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 166 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| 170 | 167 |
| 171 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) != tiles_.end()); | 168 DCHECK(std::find(tiles_.begin(), tiles_.end(), tile) != tiles_.end()); |
| 172 FreeResourcesForTile(tile); | 169 FreeResourcesForTile(tile); |
| 173 tiles_.erase(std::remove(tiles_.begin(), tiles_.end(), tile)); | 170 tiles_.erase(std::remove(tiles_.begin(), tiles_.end(), tile)); |
|
reveman
2013/07/03 20:20:06
"sorted_tiles_need_update_ = true" or whatever we
vmpstr
2013/07/03 23:47:51
Done.
| |
| 171 | |
| 172 TileMap::iterator managed_iter = managed_tiles_.find(tile->id()); | |
| 173 DCHECK(managed_iter != managed_tiles_.end()); | |
| 174 managed_tiles_.erase(managed_iter); | |
|
reveman
2013/07/03 20:20:06
I prefer:
DCHECK(tiles_.find(tile->id()) != tiles_
vmpstr
2013/07/03 23:47:51
Done.
| |
| 174 } | 175 } |
| 175 | 176 |
| 176 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { | 177 bool TileManager::ShouldForceTasksRequiredForActivationToComplete() const { |
| 177 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; | 178 return GlobalState().tree_priority != SMOOTHNESS_TAKES_PRIORITY; |
| 178 } | 179 } |
| 179 | 180 |
| 180 void TileManager::DidFinishedRunningTasks() { | 181 void TileManager::DidFinishedRunningTasks() { |
| 181 // When OOM, keep re-assigning memory until we reach a steady state | 182 // When OOM, keep re-assigning memory until we reach a steady state |
| 182 // where top-priority tiles are initialized. | 183 // where top-priority tiles are initialized. |
| 183 if (!memory_stats_from_last_assign_.bytes_over) | 184 if (!memory_stats_from_last_assign_.bytes_over) |
| 184 return; | 185 return; |
| 185 | 186 |
| 186 raster_worker_pool_->CheckForCompletedTasks(); | 187 raster_worker_pool_->CheckForCompletedTasks(); |
| 187 | 188 |
| 188 AssignGpuMemoryToTiles(); | 189 TileVector tiles_that_need_to_be_rasterized; |
| 190 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | |
| 189 | 191 |
| 190 if (!oom_tiles_that_need_to_be_initialized_for_activation_.empty()) | 192 if (!oom_tiles_that_need_to_be_initialized_for_activation_.empty()) { |
| 191 ReassignGpuMemoryToOOMTilesRequiredForActivation(); | 193 ReassignGpuMemoryToOOMTilesRequiredForActivation( |
| 194 &tiles_that_need_to_be_rasterized); | |
| 195 } | |
| 192 | 196 |
| 193 // |tiles_that_need_to_be_rasterized_| will be empty when we reach a | 197 // |tiles_that_need_to_be_rasterized| will be empty when we reach a |
| 194 // steady memory state. Keep scheduling tasks until we reach this state. | 198 // steady memory state. Keep scheduling tasks until we reach this state. |
| 195 if (!tiles_that_need_to_be_rasterized_.empty()) { | 199 if (!tiles_that_need_to_be_rasterized.empty()) { |
| 196 ScheduleTasks(); | 200 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 197 return; | 201 return; |
| 198 } | 202 } |
| 199 | 203 |
| 200 // Use on-demand raster for any tiles that have not been been assigned | 204 // Use on-demand raster for any tiles that have not been been assigned |
| 201 // memory after reaching a steady memory state. | 205 // memory after reaching a steady memory state. |
| 202 for (TileSet::iterator it = | 206 for (TileSet::iterator it = |
| 203 oom_tiles_that_need_to_be_initialized_for_activation_.begin(); | 207 oom_tiles_that_need_to_be_initialized_for_activation_.begin(); |
| 204 it != oom_tiles_that_need_to_be_initialized_for_activation_.end(); | 208 it != oom_tiles_that_need_to_be_initialized_for_activation_.end(); |
| 205 ++it) { | 209 ++it) { |
| 206 Tile* tile = *it; | 210 Tile* tile = *it; |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 341 TRACE_EVENT0("cc", "TileManager::SortTiles"); | 345 TRACE_EVENT0("cc", "TileManager::SortTiles"); |
| 342 | 346 |
| 343 // Sort by bin, resolution and time until needed. | 347 // Sort by bin, resolution and time until needed. |
| 344 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); | 348 std::sort(tiles_.begin(), tiles_.end(), BinComparator()); |
| 345 } | 349 } |
| 346 | 350 |
| 347 void TileManager::ManageTiles() { | 351 void TileManager::ManageTiles() { |
| 348 TRACE_EVENT0("cc", "TileManager::ManageTiles"); | 352 TRACE_EVENT0("cc", "TileManager::ManageTiles"); |
| 349 AssignBinsToTiles(); | 353 AssignBinsToTiles(); |
| 350 SortTiles(); | 354 SortTiles(); |
| 351 AssignGpuMemoryToTiles(); | 355 |
| 356 TileVector tiles_that_need_to_be_rasterized; | |
| 357 AssignGpuMemoryToTiles(&tiles_that_need_to_be_rasterized); | |
| 352 CleanUpUnusedImageDecodeTasks(); | 358 CleanUpUnusedImageDecodeTasks(); |
| 353 | 359 |
| 354 TRACE_EVENT_INSTANT1( | 360 TRACE_EVENT_INSTANT1( |
| 355 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, | 361 "cc", "DidManage", TRACE_EVENT_SCOPE_THREAD, |
| 356 "state", TracedValue::FromValue(BasicStateAsValue().release())); | 362 "state", TracedValue::FromValue(BasicStateAsValue().release())); |
| 357 | 363 |
| 358 // Finally, schedule rasterizer tasks. | 364 // Finally, schedule rasterizer tasks. |
| 359 ScheduleTasks(); | 365 ScheduleTasks(tiles_that_need_to_be_rasterized); |
| 360 } | 366 } |
| 361 | 367 |
| 362 void TileManager::CheckForCompletedTileUploads() { | 368 void TileManager::CheckForCompletedTileUploads() { |
| 363 raster_worker_pool_->CheckForCompletedTasks(); | 369 raster_worker_pool_->CheckForCompletedTasks(); |
| 364 | 370 |
| 365 if (did_initialize_visible_tile_) { | 371 if (did_initialize_visible_tile_) { |
| 366 client_->DidInitializeVisibleTile(); | 372 client_->DidInitializeVisibleTile(); |
| 367 did_initialize_visible_tile_ = false; | 373 did_initialize_visible_tile_ = false; |
| 368 } | 374 } |
| 369 } | 375 } |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 449 raster_mode = LOW_QUALITY_RASTER_MODE; | 455 raster_mode = LOW_QUALITY_RASTER_MODE; |
| 450 else if (tile->can_use_lcd_text()) | 456 else if (tile->can_use_lcd_text()) |
| 451 raster_mode = HIGH_QUALITY_RASTER_MODE; | 457 raster_mode = HIGH_QUALITY_RASTER_MODE; |
| 452 else if (mts.tile_versions[current_mode].has_text_ || | 458 else if (mts.tile_versions[current_mode].has_text_ || |
| 453 !mts.tile_versions[current_mode].IsReadyToDraw()) | 459 !mts.tile_versions[current_mode].IsReadyToDraw()) |
| 454 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; | 460 raster_mode = HIGH_QUALITY_NO_LCD_RASTER_MODE; |
| 455 | 461 |
| 456 return std::min(raster_mode, current_mode); | 462 return std::min(raster_mode, current_mode); |
| 457 } | 463 } |
| 458 | 464 |
| 459 void TileManager::AssignGpuMemoryToTiles() { | 465 void TileManager::AssignGpuMemoryToTiles( |
| 466 TileVector* tiles_that_need_to_be_rasterized) { | |
| 460 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); | 467 TRACE_EVENT0("cc", "TileManager::AssignGpuMemoryToTiles"); |
| 461 | 468 |
| 462 // Now give memory out to the tiles until we're out, and build | 469 // Now give memory out to the tiles until we're out, and build |
| 463 // the needs-to-be-rasterized queue. | 470 // the needs-to-be-rasterized queue. |
| 464 tiles_that_need_to_be_rasterized_.clear(); | |
| 465 tiles_that_need_to_be_initialized_for_activation_.clear(); | 471 tiles_that_need_to_be_initialized_for_activation_.clear(); |
| 466 oom_tiles_that_need_to_be_initialized_for_activation_.clear(); | 472 oom_tiles_that_need_to_be_initialized_for_activation_.clear(); |
| 467 | 473 |
| 468 size_t bytes_releasable = 0; | 474 size_t bytes_releasable = 0; |
| 469 for (TileVector::const_iterator it = tiles_.begin(); | 475 for (TileVector::const_iterator it = tiles_.begin(); |
| 470 it != tiles_.end(); | 476 it != tiles_.end(); |
| 471 ++it) { | 477 ++it) { |
| 472 const Tile* tile = *it; | 478 const Tile* tile = *it; |
| 473 const ManagedTileState& mts = tile->managed_state(); | 479 const ManagedTileState& mts = tile->managed_state(); |
| 474 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { | 480 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 551 // Tile shouldn't be rasterized if we've failed to assign | 557 // Tile shouldn't be rasterized if we've failed to assign |
| 552 // gpu memory to a higher priority tile. This is important for | 558 // gpu memory to a higher priority tile. This is important for |
| 553 // two reasons: | 559 // two reasons: |
| 554 // 1. Tile size should not impact raster priority. | 560 // 1. Tile size should not impact raster priority. |
| 555 // 2. Tile with unreleasable memory could otherwise incorrectly | 561 // 2. Tile with unreleasable memory could otherwise incorrectly |
| 556 // be added as it's not affected by |bytes_allocatable|. | 562 // be added as it's not affected by |bytes_allocatable|. |
| 557 if (higher_priority_tile_oomed) | 563 if (higher_priority_tile_oomed) |
| 558 continue; | 564 continue; |
| 559 | 565 |
| 560 if (!tile_version.resource_) | 566 if (!tile_version.resource_) |
| 561 tiles_that_need_to_be_rasterized_.push_back(tile); | 567 tiles_that_need_to_be_rasterized->push_back(tile); |
| 562 | 568 |
| 563 if (!tile->IsReadyToDraw(NULL) && | 569 if (!tile->IsReadyToDraw(NULL) && |
| 564 tile->required_for_activation()) { | 570 tile->required_for_activation()) { |
| 565 AddRequiredTileForActivation(tile); | 571 AddRequiredTileForActivation(tile); |
| 566 } | 572 } |
| 567 } | 573 } |
| 568 | 574 |
| 569 ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0; | 575 ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0; |
| 570 if (ever_exceeded_memory_budget_) { | 576 if (ever_exceeded_memory_budget_) { |
| 571 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, | 577 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |
| 572 "budget", global_state_.memory_limit_in_bytes, | 578 "budget", global_state_.memory_limit_in_bytes, |
| 573 "over", bytes_that_exceeded_memory_budget); | 579 "over", bytes_that_exceeded_memory_budget); |
| 574 } | 580 } |
| 575 memory_stats_from_last_assign_.total_budget_in_bytes = | 581 memory_stats_from_last_assign_.total_budget_in_bytes = |
| 576 global_state_.memory_limit_in_bytes; | 582 global_state_.memory_limit_in_bytes; |
| 577 memory_stats_from_last_assign_.bytes_allocated = | 583 memory_stats_from_last_assign_.bytes_allocated = |
| 578 bytes_allocatable - bytes_left; | 584 bytes_allocatable - bytes_left; |
| 579 memory_stats_from_last_assign_.bytes_unreleasable = | 585 memory_stats_from_last_assign_.bytes_unreleasable = |
| 580 bytes_allocatable - bytes_releasable; | 586 bytes_allocatable - bytes_releasable; |
| 581 memory_stats_from_last_assign_.bytes_over = | 587 memory_stats_from_last_assign_.bytes_over = |
| 582 bytes_that_exceeded_memory_budget; | 588 bytes_that_exceeded_memory_budget; |
| 583 } | 589 } |
| 584 | 590 |
| 585 void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation() { | 591 void TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation( |
| 592 TileVector* tiles_that_need_to_be_rasterized) { | |
| 586 TRACE_EVENT0( | 593 TRACE_EVENT0( |
| 587 "cc", "TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation"); | 594 "cc", "TileManager::ReassignGpuMemoryToOOMTilesRequiredForActivation"); |
| 588 | 595 |
| 589 size_t bytes_oom_for_required_tiles = 0; | 596 size_t bytes_oom_for_required_tiles = 0; |
| 590 TileVector tiles_requiring_memory_but_oomed; | 597 TileVector tiles_requiring_memory_but_oomed; |
| 591 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 598 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| 592 Tile* tile = *it; | 599 Tile* tile = *it; |
| 593 if (oom_tiles_that_need_to_be_initialized_for_activation_.find(tile) == | 600 if (oom_tiles_that_need_to_be_initialized_for_activation_.find(tile) == |
| 594 oom_tiles_that_need_to_be_initialized_for_activation_.end()) | 601 oom_tiles_that_need_to_be_initialized_for_activation_.end()) |
| 595 continue; | 602 continue; |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 609 Tile* tile = *it; | 616 Tile* tile = *it; |
| 610 ManagedTileState& mts = tile->managed_state(); | 617 ManagedTileState& mts = tile->managed_state(); |
| 611 if (mts.tree_bin[PENDING_TREE] == NEVER_BIN && | 618 if (mts.tree_bin[PENDING_TREE] == NEVER_BIN && |
| 612 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) { | 619 mts.tree_bin[ACTIVE_TREE] != NOW_BIN) { |
| 613 ManagedTileState::TileVersion& tile_version = | 620 ManagedTileState::TileVersion& tile_version = |
| 614 mts.tile_versions[mts.raster_mode]; | 621 mts.tile_versions[mts.raster_mode]; |
| 615 | 622 |
| 616 // If the tile is in the to-rasterize list, but it has no task, | 623 // If the tile is in the to-rasterize list, but it has no task, |
| 617 // then it means that we have assigned memory for it. | 624 // then it means that we have assigned memory for it. |
| 618 TileVector::iterator raster_it = | 625 TileVector::iterator raster_it = |
| 619 std::find(tiles_that_need_to_be_rasterized_.begin(), | 626 std::find(tiles_that_need_to_be_rasterized->begin(), |
| 620 tiles_that_need_to_be_rasterized_.end(), | 627 tiles_that_need_to_be_rasterized->end(), |
| 621 tile); | 628 tile); |
| 622 if (raster_it != tiles_that_need_to_be_rasterized_.end() && | 629 if (raster_it != tiles_that_need_to_be_rasterized->end() && |
| 623 tile_version.raster_task_.is_null()) { | 630 tile_version.raster_task_.is_null()) { |
| 624 bytes_freed += tile->bytes_consumed_if_allocated(); | 631 bytes_freed += tile->bytes_consumed_if_allocated(); |
| 625 tiles_that_need_to_be_rasterized_.erase(raster_it); | 632 tiles_that_need_to_be_rasterized->erase(raster_it); |
| 626 } | 633 } |
| 627 | 634 |
| 628 // Also consider all of the completed resources for freeing. | 635 // Also consider all of the completed resources for freeing. |
| 629 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { | 636 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
| 630 if (mts.tile_versions[mode].resource_) { | 637 if (mts.tile_versions[mode].resource_) { |
| 631 DCHECK(!tile->required_for_activation()); | 638 DCHECK(!tile->required_for_activation()); |
| 632 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); | 639 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); |
| 633 bytes_freed += tile->bytes_consumed_if_allocated(); | 640 bytes_freed += tile->bytes_consumed_if_allocated(); |
| 634 } | 641 } |
| 635 } | 642 } |
| 636 } | 643 } |
| 637 | 644 |
| 638 if (bytes_oom_for_required_tiles <= bytes_freed) | 645 if (bytes_oom_for_required_tiles <= bytes_freed) |
| 639 break; | 646 break; |
| 640 } | 647 } |
| 641 | 648 |
| 642 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin(); | 649 for (TileVector::iterator it = tiles_requiring_memory_but_oomed.begin(); |
| 643 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0; | 650 it != tiles_requiring_memory_but_oomed.end() && bytes_freed > 0; |
| 644 ++it) { | 651 ++it) { |
| 645 Tile* tile = *it; | 652 Tile* tile = *it; |
| 646 ManagedTileState& mts = tile->managed_state(); | 653 ManagedTileState& mts = tile->managed_state(); |
| 647 size_t bytes_needed = tile->bytes_consumed_if_allocated(); | 654 size_t bytes_needed = tile->bytes_consumed_if_allocated(); |
| 648 if (bytes_needed > bytes_freed) | 655 if (bytes_needed > bytes_freed) |
| 649 continue; | 656 continue; |
| 650 mts.tile_versions[mts.raster_mode].set_use_resource(); | 657 mts.tile_versions[mts.raster_mode].set_use_resource(); |
| 651 bytes_freed -= bytes_needed; | 658 bytes_freed -= bytes_needed; |
| 652 tiles_that_need_to_be_rasterized_.push_back(tile); | 659 tiles_that_need_to_be_rasterized->push_back(tile); |
| 653 DCHECK(tile->required_for_activation()); | 660 DCHECK(tile->required_for_activation()); |
| 654 AddRequiredTileForActivation(tile); | 661 AddRequiredTileForActivation(tile); |
| 655 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 662 oom_tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| 656 } | 663 } |
| 657 } | 664 } |
| 658 | 665 |
| 659 void TileManager::CleanUpUnusedImageDecodeTasks() { | 666 void TileManager::CleanUpUnusedImageDecodeTasks() { |
| 660 // Calculate a set of layers that are used by at least one tile. | 667 // Calculate a set of layers that are used by at least one tile. |
| 661 base::hash_set<int> used_layers; | 668 base::hash_set<int> used_layers; |
| 662 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) | 669 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 696 | 703 |
| 697 void TileManager::FreeUnusedResourcesForTile(Tile* tile) { | 704 void TileManager::FreeUnusedResourcesForTile(Tile* tile) { |
| 698 RasterMode used_mode = HIGH_QUALITY_RASTER_MODE; | 705 RasterMode used_mode = HIGH_QUALITY_RASTER_MODE; |
| 699 bool version_is_used = tile->IsReadyToDraw(&used_mode); | 706 bool version_is_used = tile->IsReadyToDraw(&used_mode); |
| 700 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { | 707 for (int mode = 0; mode < NUM_RASTER_MODES; ++mode) { |
| 701 if (!version_is_used || mode != used_mode) | 708 if (!version_is_used || mode != used_mode) |
| 702 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); | 709 FreeResourceForTile(tile, static_cast<RasterMode>(mode)); |
| 703 } | 710 } |
| 704 } | 711 } |
| 705 | 712 |
| 706 void TileManager::ScheduleTasks() { | 713 void TileManager::ScheduleTasks( |
| 714 const TileVector& tiles_that_need_to_be_rasterized) { | |
| 707 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", | 715 TRACE_EVENT1("cc", "TileManager::ScheduleTasks", |
| 708 "count", tiles_that_need_to_be_rasterized_.size()); | 716 "count", tiles_that_need_to_be_rasterized.size()); |
| 709 RasterWorkerPool::RasterTask::Queue tasks; | 717 RasterWorkerPool::RasterTask::Queue tasks; |
| 710 | 718 |
| 711 // Build a new task queue containing all task currently needed. Tasks | 719 // Build a new task queue containing all task currently needed. Tasks |
| 712 // are added in order of priority, highest priority task first. | 720 // are added in order of priority, highest priority task first. |
| 713 for (TileVector::iterator it = tiles_that_need_to_be_rasterized_.begin(); | 721 for (TileVector::const_iterator it = tiles_that_need_to_be_rasterized.begin(); |
| 714 it != tiles_that_need_to_be_rasterized_.end(); | 722 it != tiles_that_need_to_be_rasterized.end(); |
| 715 ++it) { | 723 ++it) { |
| 716 Tile* tile = *it; | 724 Tile* tile = *it; |
| 717 ManagedTileState& mts = tile->managed_state(); | 725 ManagedTileState& mts = tile->managed_state(); |
| 718 ManagedTileState::TileVersion& tile_version = | 726 ManagedTileState::TileVersion& tile_version = |
| 719 mts.tile_versions[mts.raster_mode]; | 727 mts.tile_versions[mts.raster_mode]; |
| 720 | 728 |
| 721 DCHECK(tile_version.requires_resource()); | 729 DCHECK(tile_version.requires_resource()); |
| 722 DCHECK(!tile_version.resource_); | 730 DCHECK(!tile_version.resource_); |
| 723 | 731 |
| 724 if (tile_version.raster_task_.is_null()) | 732 if (tile_version.raster_task_.is_null()) |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 794 return RasterWorkerPool::CreateRasterTask( | 802 return RasterWorkerPool::CreateRasterTask( |
| 795 const_resource, | 803 const_resource, |
| 796 tile->picture_pile(), | 804 tile->picture_pile(), |
| 797 tile->content_rect(), | 805 tile->content_rect(), |
| 798 tile->contents_scale(), | 806 tile->contents_scale(), |
| 799 mts.raster_mode, | 807 mts.raster_mode, |
| 800 metadata, | 808 metadata, |
| 801 rendering_stats_instrumentation_, | 809 rendering_stats_instrumentation_, |
| 802 base::Bind(&TileManager::OnRasterTaskCompleted, | 810 base::Bind(&TileManager::OnRasterTaskCompleted, |
| 803 base::Unretained(this), | 811 base::Unretained(this), |
| 804 make_scoped_refptr(tile), | 812 tile->id(), |
| 805 base::Passed(&resource), | 813 base::Passed(&resource), |
| 806 mts.raster_mode), | 814 mts.raster_mode), |
| 807 &decode_tasks); | 815 &decode_tasks); |
| 808 } | 816 } |
| 809 | 817 |
| 810 void TileManager::OnImageDecodeTaskCompleted( | 818 void TileManager::OnImageDecodeTaskCompleted( |
| 811 int layer_id, | 819 int layer_id, |
| 812 skia::LazyPixelRef* pixel_ref, | 820 skia::LazyPixelRef* pixel_ref, |
| 813 bool was_canceled) { | 821 bool was_canceled) { |
| 814 // If the task was canceled, we need to clean it up | 822 // If the task was canceled, we need to clean it up |
| 815 // from |image_decode_tasks_|. | 823 // from |image_decode_tasks_|. |
| 816 if (!was_canceled) | 824 if (!was_canceled) |
| 817 return; | 825 return; |
| 818 | 826 |
| 819 LayerPixelRefTaskMap::iterator layer_it = | 827 LayerPixelRefTaskMap::iterator layer_it = |
| 820 image_decode_tasks_.find(layer_id); | 828 image_decode_tasks_.find(layer_id); |
| 821 | 829 |
| 822 if (layer_it == image_decode_tasks_.end()) | 830 if (layer_it == image_decode_tasks_.end()) |
| 823 return; | 831 return; |
| 824 | 832 |
| 825 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; | 833 PixelRefTaskMap& pixel_ref_tasks = layer_it->second; |
| 826 PixelRefTaskMap::iterator task_it = | 834 PixelRefTaskMap::iterator task_it = |
| 827 pixel_ref_tasks.find(pixel_ref->getGenerationID()); | 835 pixel_ref_tasks.find(pixel_ref->getGenerationID()); |
| 828 | 836 |
| 829 if (task_it != pixel_ref_tasks.end()) | 837 if (task_it != pixel_ref_tasks.end()) |
| 830 pixel_ref_tasks.erase(task_it); | 838 pixel_ref_tasks.erase(task_it); |
| 831 } | 839 } |
| 832 | 840 |
| 833 void TileManager::OnRasterTaskCompleted( | 841 void TileManager::OnRasterTaskCompleted( |
| 834 scoped_refptr<Tile> tile, | 842 ManagedTileId managed_id, |
| 835 scoped_ptr<ResourcePool::Resource> resource, | 843 scoped_ptr<ResourcePool::Resource> resource, |
| 836 RasterMode raster_mode, | 844 RasterMode raster_mode, |
| 837 const PicturePileImpl::Analysis& analysis, | 845 const PicturePileImpl::Analysis& analysis, |
| 838 bool was_canceled) { | 846 bool was_canceled) { |
| 839 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", | 847 TRACE_EVENT1("cc", "TileManager::OnRasterTaskCompleted", |
| 840 "was_canceled", was_canceled); | 848 "was_canceled", was_canceled); |
| 841 | 849 |
| 850 TileMap::iterator managed_iter = managed_tiles_.find(managed_id); | |
| 851 if (managed_iter == managed_tiles_.end()) { | |
| 852 resource_pool_->ReleaseResource(resource.Pass()); | |
| 853 return; | |
| 854 } | |
| 855 | |
| 856 Tile* tile = managed_iter->second; | |
| 842 ManagedTileState& mts = tile->managed_state(); | 857 ManagedTileState& mts = tile->managed_state(); |
| 843 ManagedTileState::TileVersion& tile_version = | 858 ManagedTileState::TileVersion& tile_version = |
| 844 mts.tile_versions[raster_mode]; | 859 mts.tile_versions[raster_mode]; |
| 845 DCHECK(!tile_version.raster_task_.is_null()); | 860 DCHECK(!tile_version.raster_task_.is_null()); |
| 846 tile_version.raster_task_.Reset(); | 861 tile_version.raster_task_.Reset(); |
| 847 | 862 |
| 848 if (was_canceled) { | 863 if (was_canceled) { |
| 849 resource_pool_->ReleaseResource(resource.Pass()); | 864 resource_pool_->ReleaseResource(resource.Pass()); |
| 850 return; | 865 return; |
| 851 } | 866 } |
| 852 | 867 |
| 853 tile_version.set_has_text(analysis.has_text); | 868 tile_version.set_has_text(analysis.has_text); |
| 854 if (analysis.is_solid_color) { | 869 if (analysis.is_solid_color) { |
| 855 tile_version.set_solid_color(analysis.solid_color); | 870 tile_version.set_solid_color(analysis.solid_color); |
| 856 resource_pool_->ReleaseResource(resource.Pass()); | 871 resource_pool_->ReleaseResource(resource.Pass()); |
| 857 } else { | 872 } else { |
| 858 tile_version.resource_ = resource.Pass(); | 873 tile_version.resource_ = resource.Pass(); |
| 859 } | 874 } |
| 860 | 875 |
| 861 FreeUnusedResourcesForTile(tile.get()); | 876 FreeUnusedResourcesForTile(tile); |
| 862 | 877 |
| 863 DidFinishTileInitialization(tile.get()); | 878 DidFinishTileInitialization(tile); |
| 864 } | 879 } |
| 865 | 880 |
| 866 void TileManager::DidFinishTileInitialization(Tile* tile) { | 881 void TileManager::DidFinishTileInitialization(Tile* tile) { |
| 867 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) | 882 if (tile->priority(ACTIVE_TREE).distance_to_visible_in_pixels == 0) |
| 868 did_initialize_visible_tile_ = true; | 883 did_initialize_visible_tile_ = true; |
| 869 if (tile->required_for_activation()) { | 884 if (tile->required_for_activation()) { |
| 870 // It's possible that a tile required for activation is not in this list | 885 // It's possible that a tile required for activation is not in this list |
| 871 // if it was marked as being required after being dispatched for | 886 // if it was marked as being required after being dispatched for |
| 872 // rasterization but before AssignGPUMemory was called again. | 887 // rasterization but before AssignGPUMemory was called again. |
| 873 tiles_that_need_to_be_initialized_for_activation_.erase(tile); | 888 tiles_that_need_to_be_initialized_for_activation_.erase(tile); |
| 874 } | 889 } |
| 875 } | 890 } |
| 876 | 891 |
| 877 void TileManager::DidTileTreeBinChange(Tile* tile, | 892 void TileManager::DidTileTreeBinChange(Tile* tile, |
| 878 TileManagerBin new_tree_bin, | 893 TileManagerBin new_tree_bin, |
| 879 WhichTree tree) { | 894 WhichTree tree) { |
| 880 ManagedTileState& mts = tile->managed_state(); | 895 ManagedTileState& mts = tile->managed_state(); |
| 881 mts.tree_bin[tree] = new_tree_bin; | 896 mts.tree_bin[tree] = new_tree_bin; |
| 882 } | 897 } |
| 883 | 898 |
| 884 } // namespace cc | 899 } // namespace cc |
| OLD | NEW |