| 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 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 456 // tiles_with_image_decoding_tasks_ list above we move all tiles | 456 // tiles_with_image_decoding_tasks_ list above we move all tiles |
| 457 // currently waiting for raster to idle state. | 457 // currently waiting for raster to idle state. |
| 458 // Call DidTileRasterStateChange() for each of these tiles to | 458 // Call DidTileRasterStateChange() for each of these tiles to |
| 459 // have this state change take effect. | 459 // have this state change take effect. |
| 460 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 460 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| 461 Tile* tile = *it; | 461 Tile* tile = *it; |
| 462 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) | 462 if (tile->managed_state().raster_state == WAITING_FOR_RASTER_STATE) |
| 463 DidTileRasterStateChange(tile, IDLE_STATE); | 463 DidTileRasterStateChange(tile, IDLE_STATE); |
| 464 } | 464 } |
| 465 | 465 |
| 466 size_t bytes_left = global_state_.memory_limit_in_bytes - unreleasable_bytes; | 466 size_t bytes_allocatable = global_state_.memory_limit_in_bytes - unreleasable_
bytes; |
| 467 size_t bytes_that_exceeded_memory_budget = 0; | 467 size_t bytes_that_exceeded_memory_budget = 0; |
| 468 size_t bytes_left = bytes_allocatable; |
| 468 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 469 for (TileVector::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
| 469 Tile* tile = *it; | 470 Tile* tile = *it; |
| 470 size_t tile_bytes = tile->bytes_consumed_if_allocated(); | 471 size_t tile_bytes = tile->bytes_consumed_if_allocated(); |
| 471 ManagedTileState& managed_tile_state = tile->managed_state(); | 472 ManagedTileState& managed_tile_state = tile->managed_state(); |
| 472 if (!managed_tile_state.can_be_freed) | 473 if (!managed_tile_state.can_be_freed) |
| 473 continue; | 474 continue; |
| 474 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && | 475 if (managed_tile_state.bin[HIGH_PRIORITY_BIN] == NEVER_BIN && |
| 475 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { | 476 managed_tile_state.bin[LOW_PRIORITY_BIN] == NEVER_BIN) { |
| 476 managed_tile_state.can_use_gpu_memory = false; | 477 managed_tile_state.can_use_gpu_memory = false; |
| 477 FreeResourcesForTile(tile); | 478 FreeResourcesForTile(tile); |
| 478 continue; | 479 continue; |
| 479 } | 480 } |
| 480 if (tile_bytes > bytes_left) { | 481 if (tile_bytes > bytes_left) { |
| 481 managed_tile_state.can_use_gpu_memory = false; | 482 managed_tile_state.can_use_gpu_memory = false; |
| 482 bytes_that_exceeded_memory_budget += tile_bytes; | 483 bytes_that_exceeded_memory_budget += tile_bytes; |
| 483 FreeResourcesForTile(tile); | 484 FreeResourcesForTile(tile); |
| 484 continue; | 485 continue; |
| 485 } | 486 } |
| 486 bytes_left -= tile_bytes; | 487 bytes_left -= tile_bytes; |
| 487 managed_tile_state.can_use_gpu_memory = true; | 488 managed_tile_state.can_use_gpu_memory = true; |
| 488 if (!managed_tile_state.resource && | 489 if (!managed_tile_state.resource && |
| 489 !managed_tile_state.resource_is_being_initialized) { | 490 !managed_tile_state.resource_is_being_initialized) { |
| 490 tiles_that_need_to_be_rasterized_.push_back(tile); | 491 tiles_that_need_to_be_rasterized_.push_back(tile); |
| 491 DidTileRasterStateChange(tile, WAITING_FOR_RASTER_STATE); | 492 DidTileRasterStateChange(tile, WAITING_FOR_RASTER_STATE); |
| 492 } | 493 } |
| 493 } | 494 } |
| 494 | 495 |
| 495 if (bytes_that_exceeded_memory_budget) | 496 ever_exceeded_memory_budget_ |= bytes_that_exceeded_memory_budget; |
| 496 ever_exceeded_memory_budget_ = true; | |
| 497 | |
| 498 if (ever_exceeded_memory_budget_) { | 497 if (ever_exceeded_memory_budget_) { |
| 499 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, | 498 TRACE_COUNTER_ID2("cc", "over_memory_budget", this, |
| 500 "budget", global_state_.memory_limit_in_bytes, | 499 "budget", global_state_.memory_limit_in_bytes, |
| 501 "over", bytes_that_exceeded_memory_budget); | 500 "over", bytes_that_exceeded_memory_budget); |
| 502 } | 501 } |
| 502 memory_stats_from_last_assign_.bytes_allocated = |
| 503 bytes_allocatable - bytes_left; |
| 504 memory_stats_from_last_assign_.bytes_unreleasable = unreleasable_bytes; |
| 505 memory_stats_from_last_assign_.bytes_over = |
| 506 bytes_that_exceeded_memory_budget; |
| 503 | 507 |
| 504 // Reverse two tiles_that_need_* vectors such that pop_back gets | 508 // Reverse two tiles_that_need_* vectors such that pop_back gets |
| 505 // the highest priority tile. | 509 // the highest priority tile. |
| 506 std::reverse( | 510 std::reverse( |
| 507 tiles_that_need_to_be_rasterized_.begin(), | 511 tiles_that_need_to_be_rasterized_.begin(), |
| 508 tiles_that_need_to_be_rasterized_.end()); | 512 tiles_that_need_to_be_rasterized_.end()); |
| 509 } | 513 } |
| 510 | 514 |
| 511 void TileManager::FreeResourcesForTile(Tile* tile) { | 515 void TileManager::FreeResourcesForTile(Tile* tile) { |
| 512 ManagedTileState& managed_tile_state = tile->managed_state(); | 516 ManagedTileState& managed_tile_state = tile->managed_state(); |
| (...skipping 260 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 773 RenderingStats* stats) { | 777 RenderingStats* stats) { |
| 774 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); | 778 TRACE_EVENT0("cc", "TileManager::RunImageDecodeTask"); |
| 775 base::TimeTicks decode_begin_time = base::TimeTicks::Now(); | 779 base::TimeTicks decode_begin_time = base::TimeTicks::Now(); |
| 776 pixel_ref->Decode(); | 780 pixel_ref->Decode(); |
| 777 stats->totalDeferredImageDecodeCount++; | 781 stats->totalDeferredImageDecodeCount++; |
| 778 stats->totalDeferredImageDecodeTime += | 782 stats->totalDeferredImageDecodeTime += |
| 779 base::TimeTicks::Now() - decode_begin_time; | 783 base::TimeTicks::Now() - decode_begin_time; |
| 780 } | 784 } |
| 781 | 785 |
| 782 } // namespace cc | 786 } // namespace cc |
| OLD | NEW |