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/picture_layer_tiling.h" | 5 #include "cc/resources/picture_layer_tiling.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <cmath> | 8 #include <cmath> |
9 #include <limits> | 9 #include <limits> |
10 | 10 |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
823 cache->previous_result = result; | 823 cache->previous_result = result; |
824 return result; | 824 return result; |
825 } | 825 } |
826 | 826 |
827 void PictureLayerTiling::UpdateEvictionCacheIfNeeded( | 827 void PictureLayerTiling::UpdateEvictionCacheIfNeeded( |
828 TreePriority tree_priority) { | 828 TreePriority tree_priority) { |
829 if (eviction_tiles_cache_valid_ && | 829 if (eviction_tiles_cache_valid_ && |
830 eviction_cache_tree_priority_ == tree_priority) | 830 eviction_cache_tree_priority_ == tree_priority) |
831 return; | 831 return; |
832 | 832 |
833 eviction_tiles_cache_.clear(); | 833 eventually_eviction_tiles_.clear(); |
834 eviction_tiles_cache_.reserve(tiles_.size()); | 834 soon_eviction_tiles_.clear(); |
835 now_required_for_activation_eviction_tiles_.clear(); | |
836 now_not_required_for_activation_eviction_tiles_.clear(); | |
837 | |
835 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 838 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
836 // TODO(vmpstr): This should update the priority if UpdateTilePriorities | 839 // TODO(vmpstr): This should update the priority if UpdateTilePriorities |
837 // changes not to do this. | 840 // changes not to do this. |
838 eviction_tiles_cache_.push_back(it->second); | 841 Tile* tile = it->second; |
842 const TilePriority& priority = | |
843 tile->priority_for_tree_priority(tree_priority); | |
844 switch (priority.priority_bin) { | |
845 case TilePriority::EVENTUALLY: | |
846 eventually_eviction_tiles_.push_back(tile); | |
847 break; | |
848 case TilePriority::SOON: | |
849 soon_eviction_tiles_.push_back(tile); | |
850 break; | |
851 case TilePriority::NOW: | |
852 if (tile->required_for_activation()) | |
853 now_required_for_activation_eviction_tiles_.push_back(tile); | |
854 else | |
855 now_not_required_for_activation_eviction_tiles_.push_back(tile); | |
856 break; | |
857 } | |
839 } | 858 } |
840 | 859 |
841 std::sort(eviction_tiles_cache_.begin(), | 860 // TODO(vmpstr): Do this lazily. One option is to have a "sorted" flag that |
842 eviction_tiles_cache_.end(), | 861 // can be updated for each of the queues. |
843 TileEvictionOrder(tree_priority)); | 862 TileEvictionOrder sort_order(tree_priority); |
863 std::sort(eventually_eviction_tiles_.begin(), | |
864 eventually_eviction_tiles_.end(), | |
865 sort_order); | |
866 std::sort( | |
867 soon_eviction_tiles_.begin(), soon_eviction_tiles_.end(), sort_order); | |
868 std::sort(now_required_for_activation_eviction_tiles_.begin(), | |
869 now_required_for_activation_eviction_tiles_.end(), | |
870 sort_order); | |
871 std::sort(now_not_required_for_activation_eviction_tiles_.begin(), | |
872 now_not_required_for_activation_eviction_tiles_.end(), | |
873 sort_order); | |
874 | |
844 eviction_tiles_cache_valid_ = true; | 875 eviction_tiles_cache_valid_ = true; |
845 eviction_cache_tree_priority_ = tree_priority; | 876 eviction_cache_tree_priority_ = tree_priority; |
846 } | 877 } |
847 | 878 |
848 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator() | 879 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator() |
849 : tiling_(NULL), current_tile_(NULL) {} | 880 : tiling_(NULL), current_tile_(NULL) {} |
850 | 881 |
851 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator( | 882 PictureLayerTiling::TilingRasterTileIterator::TilingRasterTileIterator( |
852 PictureLayerTiling* tiling, | 883 PictureLayerTiling* tiling, |
853 WhichTree tree) | 884 WhichTree tree) |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
963 } | 994 } |
964 next_index = spiral_iterator_.index(); | 995 next_index = spiral_iterator_.index(); |
965 break; | 996 break; |
966 } | 997 } |
967 current_tile_ = tiling_->TileAt(next_index.first, next_index.second); | 998 current_tile_ = tiling_->TileAt(next_index.first, next_index.second); |
968 } | 999 } |
969 return *this; | 1000 return *this; |
970 } | 1001 } |
971 | 1002 |
972 PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator() | 1003 PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator() |
973 : tiling_(NULL) { | 1004 : tiling_(NULL), eviction_tiles_(NULL) { |
974 } | 1005 } |
975 | 1006 |
976 PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( | 1007 PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( |
977 PictureLayerTiling* tiling, | 1008 PictureLayerTiling* tiling, |
978 TreePriority tree_priority) | 1009 TreePriority tree_priority, |
979 : tiling_(tiling), tree_priority_(tree_priority) { | 1010 TilePriority::PriorityBin type, |
1011 bool required_for_activation) | |
1012 : tiling_(tiling), tree_priority_(tree_priority), eviction_tiles_(NULL) { | |
1013 if (required_for_activation && type != TilePriority::NOW) | |
reveman
2014/08/01 17:54:47
could this be a DCHECK?
vmpstr
2014/08/01 19:39:50
No, this can't be a dcheck since we pass all 6 sta
reveman
2014/08/04 14:56:17
Acknowledged.
| |
1014 return; | |
1015 | |
980 tiling_->UpdateEvictionCacheIfNeeded(tree_priority_); | 1016 tiling_->UpdateEvictionCacheIfNeeded(tree_priority_); |
981 tile_iterator_ = tiling_->eviction_tiles_cache_.begin(); | 1017 switch (type) { |
982 if (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && | 1018 case TilePriority::EVENTUALLY: |
1019 eviction_tiles_ = &tiling_->eventually_eviction_tiles_; | |
1020 break; | |
1021 case TilePriority::SOON: | |
1022 eviction_tiles_ = &tiling_->soon_eviction_tiles_; | |
1023 break; | |
1024 case TilePriority::NOW: | |
1025 if (required_for_activation) | |
1026 eviction_tiles_ = &tiling_->now_required_for_activation_eviction_tiles_; | |
1027 else | |
1028 eviction_tiles_ = | |
1029 &tiling_->now_not_required_for_activation_eviction_tiles_; | |
1030 break; | |
1031 } | |
1032 DCHECK(eviction_tiles_); | |
1033 tile_iterator_ = eviction_tiles_->begin(); | |
1034 if (tile_iterator_ != eviction_tiles_->end() && | |
983 !(*tile_iterator_)->HasResources()) { | 1035 !(*tile_iterator_)->HasResources()) { |
984 ++(*this); | 1036 ++(*this); |
985 } | 1037 } |
986 } | 1038 } |
987 | 1039 |
988 PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() {} | 1040 PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() {} |
989 | 1041 |
990 PictureLayerTiling::TilingEvictionTileIterator::operator bool() const { | 1042 PictureLayerTiling::TilingEvictionTileIterator::operator bool() const { |
991 return tiling_ && tile_iterator_ != tiling_->eviction_tiles_cache_.end(); | 1043 return eviction_tiles_ && tile_iterator_ != eviction_tiles_->end(); |
reveman
2014/08/01 17:54:47
remove eviction_tiles_ check if you can DCHECK abo
| |
992 } | 1044 } |
993 | 1045 |
994 Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() { | 1046 Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() { |
995 DCHECK(*this); | 1047 DCHECK(*this); |
996 return *tile_iterator_; | 1048 return *tile_iterator_; |
997 } | 1049 } |
998 | 1050 |
999 const Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() const { | 1051 const Tile* PictureLayerTiling::TilingEvictionTileIterator::operator*() const { |
1000 DCHECK(*this); | 1052 DCHECK(*this); |
1001 return *tile_iterator_; | 1053 return *tile_iterator_; |
1002 } | 1054 } |
1003 | 1055 |
1004 PictureLayerTiling::TilingEvictionTileIterator& | 1056 PictureLayerTiling::TilingEvictionTileIterator& |
1005 PictureLayerTiling::TilingEvictionTileIterator:: | 1057 PictureLayerTiling::TilingEvictionTileIterator:: |
1006 operator++() { | 1058 operator++() { |
1007 DCHECK(*this); | 1059 DCHECK(*this); |
1008 do { | 1060 do { |
1009 ++tile_iterator_; | 1061 ++tile_iterator_; |
1010 } while (tile_iterator_ != tiling_->eviction_tiles_cache_.end() && | 1062 } while (tile_iterator_ != eviction_tiles_->end() && |
1011 (!(*tile_iterator_)->HasResources())); | 1063 (!(*tile_iterator_)->HasResources())); |
1012 | 1064 |
1013 return *this; | 1065 return *this; |
1014 } | 1066 } |
1015 | 1067 |
1016 } // namespace cc | 1068 } // namespace cc |
OLD | NEW |