| 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 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 668 mts.required_for_activation = tile_priority.required_for_activation; | 668 mts.required_for_activation = tile_priority.required_for_activation; |
| 669 | 669 |
| 670 mts.visible_and_ready_to_draw = | 670 mts.visible_and_ready_to_draw = |
| 671 tree_bin[ACTIVE_TREE] == NOW_AND_READY_TO_DRAW_BIN; | 671 tree_bin[ACTIVE_TREE] == NOW_AND_READY_TO_DRAW_BIN; |
| 672 | 672 |
| 673 // If the tile is in NEVER_BIN and it does not have an active task, then we | 673 // If the tile is in NEVER_BIN and it does not have an active task, then we |
| 674 // can release the resources early. If it does have the task however, we | 674 // can release the resources early. If it does have the task however, we |
| 675 // should keep it in the prioritized tile set to ensure that AssignGpuMemory | 675 // should keep it in the prioritized tile set to ensure that AssignGpuMemory |
| 676 // can visit it. | 676 // can visit it. |
| 677 if (mts.bin == NEVER_BIN && | 677 if (mts.bin == NEVER_BIN && |
| 678 !mts.tile_versions[mts.raster_mode].raster_task_ && | 678 !mts.tile_versions[mts.raster_mode].raster_task_) { |
| 679 !tile->required_for_activation()) { | |
| 680 FreeResourcesForTile(tile); | 679 FreeResourcesForTile(tile); |
| 681 continue; | 680 continue; |
| 682 } | 681 } |
| 683 | 682 |
| 684 // Insert the tile into a priority set. | 683 // Insert the tile into a priority set. |
| 685 tiles->InsertTile(tile, mts.bin); | 684 tiles->InsertTile(tile, mts.bin); |
| 686 } | 685 } |
| 687 } | 686 } |
| 688 | 687 |
| 689 void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) { | 688 void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 834 bool have_hit_soft_memory = false; // Soft memory comes after hard. | 833 bool have_hit_soft_memory = false; // Soft memory comes after hard. |
| 835 | 834 |
| 836 // Memory we assign to raster tasks now will be deducted from our memory | 835 // Memory we assign to raster tasks now will be deducted from our memory |
| 837 // in future iterations if priorities change. By assigning at most half | 836 // in future iterations if priorities change. By assigning at most half |
| 838 // the raster limit, we will always have another 50% left even if priorities | 837 // the raster limit, we will always have another 50% left even if priorities |
| 839 // change completely (assuming we check for completed/cancelled rasters | 838 // change completely (assuming we check for completed/cancelled rasters |
| 840 // between each call to this function). | 839 // between each call to this function). |
| 841 size_t max_raster_bytes = max_raster_usage_bytes_ / 2; | 840 size_t max_raster_bytes = max_raster_usage_bytes_ / 2; |
| 842 size_t raster_bytes = 0; | 841 size_t raster_bytes = 0; |
| 843 | 842 |
| 844 int processed_required_for_activation_tile_count = 0; | |
| 845 unsigned schedule_priority = 1u; | 843 unsigned schedule_priority = 1u; |
| 846 for (PrioritizedTileSet::Iterator it(tiles, true); it; ++it) { | 844 for (PrioritizedTileSet::Iterator it(tiles, true); it; ++it) { |
| 847 Tile* tile = *it; | 845 Tile* tile = *it; |
| 848 ManagedTileState& mts = tile->managed_state(); | 846 ManagedTileState& mts = tile->managed_state(); |
| 849 | 847 |
| 850 mts.scheduled_priority = schedule_priority++; | 848 mts.scheduled_priority = schedule_priority++; |
| 851 | 849 |
| 852 mts.raster_mode = tile->DetermineOverallRasterMode(); | 850 mts.raster_mode = tile->DetermineOverallRasterMode(); |
| 853 | 851 |
| 854 ManagedTileState::TileVersion& tile_version = | 852 ManagedTileState::TileVersion& tile_version = |
| 855 mts.tile_versions[mts.raster_mode]; | 853 mts.tile_versions[mts.raster_mode]; |
| 856 | 854 |
| 857 // If this tile doesn't need a resource, then nothing to do. | 855 // If this tile doesn't need a resource, then nothing to do. |
| 858 if (!tile_version.requires_resource()) | 856 if (!tile_version.requires_resource()) |
| 859 continue; | 857 continue; |
| 860 | 858 |
| 861 // If the tile is not needed, free it up. | 859 // If the tile is not needed, free it up. |
| 862 if (mts.bin == NEVER_BIN) { | 860 if (mts.bin == NEVER_BIN) { |
| 863 FreeResourcesForTile(tile); | 861 FreeResourcesForTile(tile); |
| 864 if (tile->required_for_activation()) | |
| 865 ++processed_required_for_activation_tile_count; | |
| 866 continue; | 862 continue; |
| 867 } | 863 } |
| 868 | 864 |
| 869 const bool tile_uses_hard_limit = mts.bin <= NOW_BIN; | 865 const bool tile_uses_hard_limit = mts.bin <= NOW_BIN; |
| 870 const size_t bytes_if_allocated = BytesConsumedIfAllocated(tile); | 866 const size_t bytes_if_allocated = BytesConsumedIfAllocated(tile); |
| 871 const size_t raster_bytes_if_rastered = raster_bytes + bytes_if_allocated; | 867 const size_t raster_bytes_if_rastered = raster_bytes + bytes_if_allocated; |
| 872 const size_t tile_bytes_left = | 868 const size_t tile_bytes_left = |
| 873 (tile_uses_hard_limit) ? hard_bytes_left : soft_bytes_left; | 869 (tile_uses_hard_limit) ? hard_bytes_left : soft_bytes_left; |
| 874 | 870 |
| 875 // Hard-limit is reserved for tiles that would cause a calamity | 871 // Hard-limit is reserved for tiles that would cause a calamity |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 914 oomed_soft = true; | 910 oomed_soft = true; |
| 915 if (tile_uses_hard_limit) { | 911 if (tile_uses_hard_limit) { |
| 916 oomed_hard = true; | 912 oomed_hard = true; |
| 917 bytes_that_exceeded_memory_budget += tile_bytes; | 913 bytes_that_exceeded_memory_budget += tile_bytes; |
| 918 } | 914 } |
| 919 } else { | 915 } else { |
| 920 resources_left -= tile_resources; | 916 resources_left -= tile_resources; |
| 921 hard_bytes_left -= tile_bytes; | 917 hard_bytes_left -= tile_bytes; |
| 922 soft_bytes_left = | 918 soft_bytes_left = |
| 923 (soft_bytes_left > tile_bytes) ? soft_bytes_left - tile_bytes : 0; | 919 (soft_bytes_left > tile_bytes) ? soft_bytes_left - tile_bytes : 0; |
| 924 if (tile_version.resource_) { | 920 if (tile_version.resource_) |
| 925 DCHECK(tile->IsReadyToDraw()); | |
| 926 continue; | 921 continue; |
| 927 } | |
| 928 } | 922 } |
| 929 | 923 |
| 930 DCHECK(!tile_version.resource_); | 924 DCHECK(!tile_version.resource_); |
| 931 | 925 |
| 932 // Tile shouldn't be rasterized if |tiles_that_need_to_be_rasterized| | 926 // Tile shouldn't be rasterized if |tiles_that_need_to_be_rasterized| |
| 933 // has reached it's limit or we've failed to assign gpu memory to this | 927 // has reached it's limit or we've failed to assign gpu memory to this |
| 934 // or any higher priority tile. Preventing tiles that fit into memory | 928 // or any higher priority tile. Preventing tiles that fit into memory |
| 935 // budget to be rasterized when higher priority tile is oom is | 929 // budget to be rasterized when higher priority tile is oom is |
| 936 // important for two reasons: | 930 // important for two reasons: |
| 937 // 1. Tile size should not impact raster priority. | 931 // 1. Tile size should not impact raster priority. |
| 938 // 2. Tiles with existing raster task could otherwise incorrectly | 932 // 2. Tiles with existing raster task could otherwise incorrectly |
| 939 // be added as they are not affected by |bytes_allocatable|. | 933 // be added as they are not affected by |bytes_allocatable|. |
| 940 bool can_schedule_tile = | 934 bool can_schedule_tile = |
| 941 !oomed_soft && raster_bytes_if_rastered <= max_raster_bytes && | 935 !oomed_soft && raster_bytes_if_rastered <= max_raster_bytes && |
| 942 tiles_that_need_to_be_rasterized->size() < kScheduledRasterTasksLimit; | 936 tiles_that_need_to_be_rasterized->size() < kScheduledRasterTasksLimit; |
| 943 | 937 |
| 944 if (!can_schedule_tile) { | 938 if (!can_schedule_tile) { |
| 945 all_tiles_that_need_to_be_rasterized_have_memory_ = false; | 939 all_tiles_that_need_to_be_rasterized_have_memory_ = false; |
| 940 if (tile->required_for_activation()) |
| 941 all_tiles_required_for_activation_have_memory_ = false; |
| 946 it.DisablePriorityOrdering(); | 942 it.DisablePriorityOrdering(); |
| 947 continue; | 943 continue; |
| 948 } | 944 } |
| 949 | 945 |
| 950 raster_bytes = raster_bytes_if_rastered; | 946 raster_bytes = raster_bytes_if_rastered; |
| 951 tiles_that_need_to_be_rasterized->push_back(tile); | 947 tiles_that_need_to_be_rasterized->push_back(tile); |
| 952 if (tile->required_for_activation()) | |
| 953 ++processed_required_for_activation_tile_count; | |
| 954 } | 948 } |
| 955 | 949 |
| 956 int total_required_for_activation_tile_count = 0; | |
| 957 for (std::vector<PictureLayerImpl*>::const_iterator it = layers_.begin(); | |
| 958 it != layers_.end(); | |
| 959 ++it) { | |
| 960 if ((*it)->GetTree() == PENDING_TREE) { | |
| 961 total_required_for_activation_tile_count += | |
| 962 (*it)->UninitializedTilesRequiredForActivationCount(); | |
| 963 } | |
| 964 } | |
| 965 | |
| 966 all_tiles_required_for_activation_have_memory_ = | |
| 967 processed_required_for_activation_tile_count == | |
| 968 total_required_for_activation_tile_count; | |
| 969 | |
| 970 // OOM reporting uses hard-limit, soft-OOM is normal depending on limit. | 950 // OOM reporting uses hard-limit, soft-OOM is normal depending on limit. |
| 971 ever_exceeded_memory_budget_ |= oomed_hard; | 951 ever_exceeded_memory_budget_ |= oomed_hard; |
| 972 if (ever_exceeded_memory_budget_) { | 952 if (ever_exceeded_memory_budget_) { |
| 973 TRACE_COUNTER_ID2("cc", | 953 TRACE_COUNTER_ID2("cc", |
| 974 "over_memory_budget", | 954 "over_memory_budget", |
| 975 this, | 955 this, |
| 976 "budget", | 956 "budget", |
| 977 global_state_.hard_memory_limit_in_bytes, | 957 global_state_.hard_memory_limit_in_bytes, |
| 978 "over", | 958 "over", |
| 979 bytes_that_exceeded_memory_budget); | 959 bytes_that_exceeded_memory_budget); |
| (...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1646 | 1626 |
| 1647 if (b_priority.resolution != a_priority.resolution) { | 1627 if (b_priority.resolution != a_priority.resolution) { |
| 1648 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || | 1628 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || |
| 1649 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || | 1629 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || |
| 1650 (a_priority.resolution == NON_IDEAL_RESOLUTION); | 1630 (a_priority.resolution == NON_IDEAL_RESOLUTION); |
| 1651 } | 1631 } |
| 1652 return a_priority.IsHigherPriorityThan(b_priority); | 1632 return a_priority.IsHigherPriorityThan(b_priority); |
| 1653 } | 1633 } |
| 1654 | 1634 |
| 1655 } // namespace cc | 1635 } // namespace cc |
| OLD | NEW |