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/tile_manager.h" | 5 #include "cc/tile_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/debug/trace_event.h" | 10 #include "base/debug/trace_event.h" |
(...skipping 477 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 // currently waiting for raster to idle state. | 488 // currently waiting for raster to idle state. |
489 // Call DidTileRasterStateChange() for each of these tiles to | 489 // Call DidTileRasterStateChange() for each of these tiles to |
490 // have this state change take effect. | 490 // have this state change take effect. |
491 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 491 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
492 Tile* tile = *it; | 492 Tile* tile = *it; |
493 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) | 493 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) |
494 DidTileRasterStateChange(tile, IDLE_STATE); | 494 DidTileRasterStateChange(tile, IDLE_STATE); |
495 } | 495 } |
496 | 496 |
497 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_
bytes; | 497 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_
bytes; |
498 size_t bytes_that_exceeded_memory_budget = 0; | 498 size_t bytes_that_exceeded_memory_budget_in_now_bin = 0; |
499 size_t bytes_left = bytes_allocatable; | 499 size_t bytes_left = bytes_allocatable; |
500 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 500 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
501 Tile* tile = *it; | 501 Tile* tile = *it; |
502 size_t tile_bytes = tile->bytes_consumed_if_allocated(); | 502 size_t tile_bytes = tile->bytes_consumed_if_allocated(); |
503 ManagedTileState& managed_tile_state = tile->managed_state(); | 503 ManagedTileState& managed_tile_state = tile->managed_state(); |
504 if (!managed_tile_state.can_be_freed) | 504 if (!managed_tile_state.can_be_freed) |
505 continue; | 505 continue; |
506 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && | 506 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && |
507 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { | 507 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { |
508 managed_tile_state.can_use_gpu_memory = false; | 508 managed_tile_state.can_use_gpu_memory = false; |
509 FreeResourcesForTile(tile); | 509 FreeResourcesForTile(tile); |
510 continue; | 510 continue; |
511 } | 511 } |
512 if (tile_bytes > bytes_left) { | 512 if (tile_bytes > bytes_left) { |
513 managed_tile_state.can_use_gpu_memory = false; | 513 managed_tile_state.can_use_gpu_memory = false; |
514 bytes_that_exceeded_memory_budget += tile_bytes; | 514 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NOW_BIN || |
| 515 managed_tile_state.bin[LOW_PRIORITY_BIN] == NOW_BIN) |
| 516 bytes_that_exceeded_memory_budget_in_now_bin += tile_bytes; |
515 FreeResourcesForTile(tile); | 517 FreeResourcesForTile(tile); |
516 continue; | 518 continue; |
517 } | 519 } |
518 bytes_left -= tile_bytes; | 520 bytes_left -= tile_bytes; |
519 managed_tile_state.can_use_gpu_memory = true; | 521 managed_tile_state.can_use_gpu_memory = true; |
520 if (!managed_tile_state.resource && | 522 if (!managed_tile_state.resource && |
521 !managed_tile_state.resource_is_being_initialized) { | 523 !managed_tile_state.resource_is_being_initialized) { |
522 tiles_that_need_to_be_rasterized_.push_back(tile); | 524 tiles_that_need_to_be_rasterized_.push_back(tile); |
523 DidTileRasterStateChange(tile, WAITING_FOR_RASTER_STATE); | 525 DidTileRasterStateChange(tile, WAITING_FOR_RASTER_STATE); |
524 } | 526 } |
525 } | 527 } |
526 | 528 |
527 ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget > 0; | 529 ever_exceeded_memory_budget_ |= |
| 530 bytes_that_exceeded_memory_budget_in_now_bin > 0; |
528 if (ever_exceeded_memory_budget_) { | 531 if (ever_exceeded_memory_budget_) { |
529 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, | 532 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |
530 "budget", global_state_.memory_limit_in_bytes, | 533 "budget", global_state_.memory_limit_in_bytes, |
531 "over", bytes_that_exceeded_memory_budget); | 534 "over", bytes_that_exceeded_memory_budget_in_now_bin); |
532 } | 535 } |
533 memory_stats_from_last_assign_.total_budget_in_bytes = | 536 memory_stats_from_last_assign_.total_budget_in_bytes = |
534 global_state_.memory_limit_in_bytes; | 537 global_state_.memory_limit_in_bytes; |
535 memory_stats_from_last_assign_.bytes_allocated = | 538 memory_stats_from_last_assign_.bytes_allocated = |
536 bytes_allocatable - bytes_left; | 539 bytes_allocatable - bytes_left; |
537 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes; | 540 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes; |
538 memory_stats_from_last_assign_.bytes_over = | 541 memory_stats_from_last_assign_.bytes_over = |
539 bytes_that_exceeded_memory_budget; | 542 bytes_that_exceeded_memory_budget_in_now_bin; |
540 | 543 |
541 // Reverse two tiles_that_need_* vectors such that pop_back gets | 544 // Reverse two tiles_that_need_* vectors such that pop_back gets |
542 // the highest priority tile. | 545 // the highest priority tile. |
543 std::reverse( | 546 std::reverse( |
544 tiles_that_need_to_be_rasterized_.begin(), | 547 tiles_that_need_to_be_rasterized_.begin(), |
545 tiles_that_need_to_be_rasterized_.end()); | 548 tiles_that_need_to_be_rasterized_.end()); |
546 } | 549 } |
547 | 550 |
548 void TileManager::FreeResourcesForTile(Tile* tile) { | 551 void TileManager::FreeResourcesForTile(Tile* tile) { |
549 ManagedTileState& managed_tile_state = tile->managed_state(); | 552 ManagedTileState& managed_tile_state = tile->managed_state(); |
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 decode_begin_time = base::TimeTicks::Now(); | 888 decode_begin_time = base::TimeTicks::Now(); |
886 pixel_ref->Decode(); | 889 pixel_ref->Decode(); |
887 if (stats) { | 890 if (stats) { |
888 stats->totalDeferredImageDecodeCount++; | 891 stats->totalDeferredImageDecodeCount++; |
889 stats->totalDeferredImageDecodeTime += | 892 stats->totalDeferredImageDecodeTime += |
890 base::TimeTicks::Now() - decode_begin_time; | 893 base::TimeTicks::Now() - decode_begin_time; |
891 } | 894 } |
892 } | 895 } |
893 | 896 |
894 } // namespace cc | 897 } // namespace cc |
OLD | NEW |