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 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()) { | |
| 679 FreeResourcesForTile(tile); | 680 FreeResourcesForTile(tile); |
| 680 continue; | 681 continue; |
| 681 } | 682 } |
| 682 | 683 |
| 683 // Insert the tile into a priority set. | 684 // Insert the tile into a priority set. |
| 684 tiles->InsertTile(tile, mts.bin); | 685 tiles->InsertTile(tile, mts.bin); |
| 685 } | 686 } |
| 686 } | 687 } |
| 687 | 688 |
| 688 void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) { | 689 void TileManager::ManageTiles(const GlobalStateThatImpactsTilePriority& state) { |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 833 bool have_hit_soft_memory = false; // Soft memory comes after hard. | 834 bool have_hit_soft_memory = false; // Soft memory comes after hard. |
| 834 | 835 |
| 835 // Memory we assign to raster tasks now will be deducted from our memory | 836 // Memory we assign to raster tasks now will be deducted from our memory |
| 836 // in future iterations if priorities change. By assigning at most half | 837 // in future iterations if priorities change. By assigning at most half |
| 837 // the raster limit, we will always have another 50% left even if priorities | 838 // the raster limit, we will always have another 50% left even if priorities |
| 838 // change completely (assuming we check for completed/cancelled rasters | 839 // change completely (assuming we check for completed/cancelled rasters |
| 839 // between each call to this function). | 840 // between each call to this function). |
| 840 size_t max_raster_bytes = max_raster_usage_bytes_ / 2; | 841 size_t max_raster_bytes = max_raster_usage_bytes_ / 2; |
| 841 size_t raster_bytes = 0; | 842 size_t raster_bytes = 0; |
| 842 | 843 |
| 844 size_t processed_required_for_activation_tile_count = 0u; | |
| 843 unsigned schedule_priority = 1u; | 845 unsigned schedule_priority = 1u; |
| 844 for (PrioritizedTileSet::Iterator it(tiles, true); it; ++it) { | 846 for (PrioritizedTileSet::Iterator it(tiles, true); it; ++it) { |
| 845 Tile* tile = *it; | 847 Tile* tile = *it; |
| 846 ManagedTileState& mts = tile->managed_state(); | 848 ManagedTileState& mts = tile->managed_state(); |
| 847 | 849 |
| 848 mts.scheduled_priority = schedule_priority++; | 850 mts.scheduled_priority = schedule_priority++; |
| 849 | 851 |
| 850 mts.raster_mode = tile->DetermineOverallRasterMode(); | 852 mts.raster_mode = tile->DetermineOverallRasterMode(); |
| 851 | 853 |
| 852 ManagedTileState::TileVersion& tile_version = | 854 ManagedTileState::TileVersion& tile_version = |
| 853 mts.tile_versions[mts.raster_mode]; | 855 mts.tile_versions[mts.raster_mode]; |
| 854 | 856 |
| 855 // If this tile doesn't need a resource, then nothing to do. | 857 // If this tile doesn't need a resource, then nothing to do. |
| 856 if (!tile_version.requires_resource()) | 858 if (!tile_version.requires_resource()) |
| 857 continue; | 859 continue; |
| 858 | 860 |
| 859 // If the tile is not needed, free it up. | 861 // If the tile is not needed, free it up. |
| 860 if (mts.bin == NEVER_BIN) { | 862 if (mts.bin == NEVER_BIN) { |
| 861 FreeResourcesForTile(tile); | 863 FreeResourcesForTile(tile); |
| 864 if (tile->required_for_activation()) | |
| 865 ++processed_required_for_activation_tile_count; | |
| 862 continue; | 866 continue; |
| 863 } | 867 } |
| 864 | 868 |
| 865 const bool tile_uses_hard_limit = mts.bin <= NOW_BIN; | 869 const bool tile_uses_hard_limit = mts.bin <= NOW_BIN; |
| 866 const size_t bytes_if_allocated = BytesConsumedIfAllocated(tile); | 870 const size_t bytes_if_allocated = BytesConsumedIfAllocated(tile); |
| 867 const size_t raster_bytes_if_rastered = raster_bytes + bytes_if_allocated; | 871 const size_t raster_bytes_if_rastered = raster_bytes + bytes_if_allocated; |
| 868 const size_t tile_bytes_left = | 872 const size_t tile_bytes_left = |
| 869 (tile_uses_hard_limit) ? hard_bytes_left : soft_bytes_left; | 873 (tile_uses_hard_limit) ? hard_bytes_left : soft_bytes_left; |
| 870 | 874 |
| 871 // Hard-limit is reserved for tiles that would cause a calamity | 875 // Hard-limit is reserved for tiles that would cause a calamity |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 910 oomed_soft = true; | 914 oomed_soft = true; |
| 911 if (tile_uses_hard_limit) { | 915 if (tile_uses_hard_limit) { |
| 912 oomed_hard = true; | 916 oomed_hard = true; |
| 913 bytes_that_exceeded_memory_budget += tile_bytes; | 917 bytes_that_exceeded_memory_budget += tile_bytes; |
| 914 } | 918 } |
| 915 } else { | 919 } else { |
| 916 resources_left -= tile_resources; | 920 resources_left -= tile_resources; |
| 917 hard_bytes_left -= tile_bytes; | 921 hard_bytes_left -= tile_bytes; |
| 918 soft_bytes_left = | 922 soft_bytes_left = |
| 919 (soft_bytes_left > tile_bytes) ? soft_bytes_left - tile_bytes : 0; | 923 (soft_bytes_left > tile_bytes) ? soft_bytes_left - tile_bytes : 0; |
| 920 if (tile_version.resource_) | 924 if (tile_version.resource_) { |
| 925 DCHECK(tile->IsReadyToDraw()); | |
| 921 continue; | 926 continue; |
| 927 } | |
| 922 } | 928 } |
| 923 | 929 |
| 924 DCHECK(!tile_version.resource_); | 930 DCHECK(!tile_version.resource_); |
| 925 | 931 |
| 926 // Tile shouldn't be rasterized if |tiles_that_need_to_be_rasterized| | 932 // Tile shouldn't be rasterized if |tiles_that_need_to_be_rasterized| |
| 927 // has reached it's limit or we've failed to assign gpu memory to this | 933 // has reached it's limit or we've failed to assign gpu memory to this |
| 928 // or any higher priority tile. Preventing tiles that fit into memory | 934 // or any higher priority tile. Preventing tiles that fit into memory |
| 929 // budget to be rasterized when higher priority tile is oom is | 935 // budget to be rasterized when higher priority tile is oom is |
| 930 // important for two reasons: | 936 // important for two reasons: |
| 931 // 1. Tile size should not impact raster priority. | 937 // 1. Tile size should not impact raster priority. |
| 932 // 2. Tiles with existing raster task could otherwise incorrectly | 938 // 2. Tiles with existing raster task could otherwise incorrectly |
| 933 // be added as they are not affected by |bytes_allocatable|. | 939 // be added as they are not affected by |bytes_allocatable|. |
| 934 bool can_schedule_tile = | 940 bool can_schedule_tile = |
| 935 !oomed_soft && raster_bytes_if_rastered <= max_raster_bytes && | 941 !oomed_soft && raster_bytes_if_rastered <= max_raster_bytes && |
| 936 tiles_that_need_to_be_rasterized->size() < kScheduledRasterTasksLimit; | 942 tiles_that_need_to_be_rasterized->size() < kScheduledRasterTasksLimit; |
| 937 | 943 |
| 938 if (!can_schedule_tile) { | 944 if (!can_schedule_tile) { |
| 939 all_tiles_that_need_to_be_rasterized_have_memory_ = false; | 945 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; | |
| 942 it.DisablePriorityOrdering(); | 946 it.DisablePriorityOrdering(); |
| 943 continue; | 947 continue; |
| 944 } | 948 } |
| 945 | 949 |
| 946 raster_bytes = raster_bytes_if_rastered; | 950 raster_bytes = raster_bytes_if_rastered; |
| 947 tiles_that_need_to_be_rasterized->push_back(tile); | 951 tiles_that_need_to_be_rasterized->push_back(tile); |
| 952 if (tile->required_for_activation()) | |
| 953 ++processed_required_for_activation_tile_count; | |
| 948 } | 954 } |
| 949 | 955 |
| 956 size_t total_required_for_activation_tile_count = 0; | |
|
enne (OOO)
2014/04/29 19:44:19
style nit: size_t -> int
vmpstr
2014/04/29 22:56:20
Done.
| |
| 957 for (std::vector<PictureLayerImpl*>::const_iterator it = layers_.begin(); | |
| 958 it != layers_.end(); | |
| 959 ++it) { | |
| 960 if ((*it)->IsOnActiveOrPendingTree()) { | |
|
enne (OOO)
2014/04/29 19:44:19
Shouldn't this just be on pending?
vmpstr
2014/04/29 22:56:20
Done.
| |
| 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 | |
| 950 // OOM reporting uses hard-limit, soft-OOM is normal depending on limit. | 970 // OOM reporting uses hard-limit, soft-OOM is normal depending on limit. |
| 951 ever_exceeded_memory_budget_ |= oomed_hard; | 971 ever_exceeded_memory_budget_ |= oomed_hard; |
| 952 if (ever_exceeded_memory_budget_) { | 972 if (ever_exceeded_memory_budget_) { |
| 953 TRACE_COUNTER_ID2("cc", | 973 TRACE_COUNTER_ID2("cc", |
| 954 "over_memory_budget", | 974 "over_memory_budget", |
| 955 this, | 975 this, |
| 956 "budget", | 976 "budget", |
| 957 global_state_.hard_memory_limit_in_bytes, | 977 global_state_.hard_memory_limit_in_bytes, |
| 958 "over", | 978 "over", |
| 959 bytes_that_exceeded_memory_budget); | 979 bytes_that_exceeded_memory_budget); |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1192 tile_version.set_solid_color(analysis.solid_color); | 1212 tile_version.set_solid_color(analysis.solid_color); |
| 1193 resource_pool_->ReleaseResource(resource.Pass()); | 1213 resource_pool_->ReleaseResource(resource.Pass()); |
| 1194 } else { | 1214 } else { |
| 1195 tile_version.set_use_resource(); | 1215 tile_version.set_use_resource(); |
| 1196 tile_version.resource_ = resource.Pass(); | 1216 tile_version.resource_ = resource.Pass(); |
| 1197 | 1217 |
| 1198 bytes_releasable_ += BytesConsumedIfAllocated(tile); | 1218 bytes_releasable_ += BytesConsumedIfAllocated(tile); |
| 1199 ++resources_releasable_; | 1219 ++resources_releasable_; |
| 1200 } | 1220 } |
| 1201 | 1221 |
| 1222 client_->NotifyTileInitialized(tile); | |
| 1223 | |
| 1202 FreeUnusedResourcesForTile(tile); | 1224 FreeUnusedResourcesForTile(tile); |
| 1203 if (tile->priority(ACTIVE_TREE).distance_to_visible == 0.f) | 1225 if (tile->priority(ACTIVE_TREE).distance_to_visible == 0.f) |
| 1204 did_initialize_visible_tile_ = true; | 1226 did_initialize_visible_tile_ = true; |
| 1205 } | 1227 } |
| 1206 | 1228 |
| 1207 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, | 1229 scoped_refptr<Tile> TileManager::CreateTile(PicturePileImpl* picture_pile, |
| 1208 const gfx::Size& tile_size, | 1230 const gfx::Size& tile_size, |
| 1209 const gfx::Rect& content_rect, | 1231 const gfx::Rect& content_rect, |
| 1210 const gfx::Rect& opaque_rect, | 1232 const gfx::Rect& opaque_rect, |
| 1211 float contents_scale, | 1233 float contents_scale, |
| (...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1624 | 1646 |
| 1625 if (b_priority.resolution != a_priority.resolution) { | 1647 if (b_priority.resolution != a_priority.resolution) { |
| 1626 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || | 1648 return (prioritize_low_res && b_priority.resolution == LOW_RESOLUTION) || |
| 1627 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || | 1649 (!prioritize_low_res && b_priority.resolution == HIGH_RESOLUTION) || |
| 1628 (a_priority.resolution == NON_IDEAL_RESOLUTION); | 1650 (a_priority.resolution == NON_IDEAL_RESOLUTION); |
| 1629 } | 1651 } |
| 1630 return a_priority.IsHigherPriorityThan(b_priority); | 1652 return a_priority.IsHigherPriorityThan(b_priority); |
| 1631 } | 1653 } |
| 1632 | 1654 |
| 1633 } // namespace cc | 1655 } // namespace cc |
| OLD | NEW |