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 #include <set> | 10 #include <set> |
(...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
735 Tile* twin_tile = | 735 Tile* twin_tile = |
736 twin_tiling->TileAt(tile->tiling_i_index(), tile->tiling_j_index()); | 736 twin_tiling->TileAt(tile->tiling_i_index(), tile->tiling_j_index()); |
737 // If twin tile is missing, it might not have a recording, so we don't need | 737 // If twin tile is missing, it might not have a recording, so we don't need |
738 // this tile to be required for activation. | 738 // this tile to be required for activation. |
739 if (!twin_tile) | 739 if (!twin_tile) |
740 return false; | 740 return false; |
741 | 741 |
742 return true; | 742 return true; |
743 } | 743 } |
744 | 744 |
745 void PictureLayerTiling::UpdateTileAndTwinPriority(Tile* tile) const { | 745 void PictureLayerTiling::UpdateTileAndTwinPriority( |
746 UpdateTilePriority(tile); | 746 Tile* tile, |
747 bool use_tile_priority_rects, | |
748 bool use_twin_tile_priority_rects) const { | |
749 if (use_tile_priority_rects) { | |
vmpstr
2014/10/31 15:35:49
How about we add a client_->GetMaxBinForTilePriori
USE eero AT chromium.org
2014/11/04 17:47:57
Done.
| |
750 UpdateTilePriority(tile); | |
751 } else { | |
752 WhichTree tree = client_->GetTree(); | |
753 tile->SetPriority(tree, TilePriority()); | |
754 tile->set_is_occluded(tree, false); | |
755 if (tree == PENDING_TREE) | |
756 tile->set_required_for_activation(false); | |
757 } | |
747 | 758 |
748 const PictureLayerTiling* twin_tiling = | 759 const PictureLayerTiling* twin_tiling = |
749 client_->GetPendingOrActiveTwinTiling(this); | 760 client_->GetPendingOrActiveTwinTiling(this); |
750 if (!tile->is_shared() || !twin_tiling) { | 761 if (use_twin_tile_priority_rects && tile->is_shared() && twin_tiling) { |
762 twin_tiling->UpdateTilePriority(tile); | |
763 } else { | |
751 WhichTree tree = client_->GetTree(); | 764 WhichTree tree = client_->GetTree(); |
752 WhichTree twin_tree = tree == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE; | 765 WhichTree twin_tree = tree == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE; |
753 tile->SetPriority(twin_tree, TilePriority()); | 766 tile->SetPriority(twin_tree, TilePriority()); |
754 tile->set_is_occluded(twin_tree, false); | 767 tile->set_is_occluded(twin_tree, false); |
755 if (twin_tree == PENDING_TREE) | 768 if (twin_tree == PENDING_TREE) |
756 tile->set_required_for_activation(false); | 769 tile->set_required_for_activation(false); |
757 return; | |
758 } | 770 } |
759 | |
760 twin_tiling->UpdateTilePriority(tile); | |
761 } | 771 } |
762 | 772 |
763 void PictureLayerTiling::UpdateTilePriority(Tile* tile) const { | 773 void PictureLayerTiling::UpdateTilePriority(Tile* tile) const { |
764 // TODO(vmpstr): This code should return the priority instead of setting it on | 774 // TODO(vmpstr): This code should return the priority instead of setting it on |
765 // the tile. This should be a part of the change to move tile priority from | 775 // the tile. This should be a part of the change to move tile priority from |
766 // tiles into iterators. | 776 // tiles into iterators. |
767 WhichTree tree = client_->GetTree(); | 777 WhichTree tree = client_->GetTree(); |
768 | 778 |
769 DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile); | 779 DCHECK_EQ(TileAt(tile->tiling_i_index(), tile->tiling_j_index()), tile); |
770 gfx::Rect tile_bounds = | 780 gfx::Rect tile_bounds = |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
968 break; | 978 break; |
969 } | 979 } |
970 | 980 |
971 gfx::Rect result(origin_x, origin_y, width, height); | 981 gfx::Rect result(origin_x, origin_y, width, height); |
972 if (cache) | 982 if (cache) |
973 cache->previous_result = result; | 983 cache->previous_result = result; |
974 return result; | 984 return result; |
975 } | 985 } |
976 | 986 |
977 void PictureLayerTiling::UpdateEvictionCacheIfNeeded( | 987 void PictureLayerTiling::UpdateEvictionCacheIfNeeded( |
978 TreePriority tree_priority) { | 988 TreePriority tree_priority, |
989 bool use_tile_priority_rects, | |
990 bool use_twin_tile_priority_rects) { | |
979 if (eviction_tiles_cache_valid_ && | 991 if (eviction_tiles_cache_valid_ && |
980 eviction_cache_tree_priority_ == tree_priority) | 992 eviction_cache_tree_priority_ == tree_priority) |
981 return; | 993 return; |
982 | 994 |
983 eviction_tiles_now_.clear(); | 995 eviction_tiles_now_.clear(); |
984 eviction_tiles_now_and_required_for_activation_.clear(); | 996 eviction_tiles_now_and_required_for_activation_.clear(); |
985 eviction_tiles_soon_.clear(); | 997 eviction_tiles_soon_.clear(); |
986 eviction_tiles_soon_and_required_for_activation_.clear(); | 998 eviction_tiles_soon_and_required_for_activation_.clear(); |
987 eviction_tiles_eventually_.clear(); | 999 eviction_tiles_eventually_.clear(); |
988 eviction_tiles_eventually_and_required_for_activation_.clear(); | 1000 eviction_tiles_eventually_and_required_for_activation_.clear(); |
989 | 1001 |
990 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { | 1002 for (TileMap::iterator it = tiles_.begin(); it != tiles_.end(); ++it) { |
991 Tile* tile = it->second.get(); | 1003 Tile* tile = it->second.get(); |
992 UpdateTileAndTwinPriority(tile); | 1004 UpdateTileAndTwinPriority( |
1005 tile, use_tile_priority_rects, use_twin_tile_priority_rects); | |
993 const TilePriority& priority = | 1006 const TilePriority& priority = |
994 tile->priority_for_tree_priority(tree_priority); | 1007 tile->priority_for_tree_priority(tree_priority); |
995 switch (priority.priority_bin) { | 1008 switch (priority.priority_bin) { |
996 case TilePriority::EVENTUALLY: | 1009 case TilePriority::EVENTUALLY: |
997 if (tile->required_for_activation()) | 1010 if (tile->required_for_activation()) |
998 eviction_tiles_eventually_and_required_for_activation_.push_back( | 1011 eviction_tiles_eventually_and_required_for_activation_.push_back( |
999 tile); | 1012 tile); |
1000 else | 1013 else |
1001 eviction_tiles_eventually_.push_back(tile); | 1014 eviction_tiles_eventually_.push_back(tile); |
1002 break; | 1015 break; |
(...skipping 30 matching lines...) Expand all Loading... | |
1033 std::sort(eviction_tiles_eventually_and_required_for_activation_.begin(), | 1046 std::sort(eviction_tiles_eventually_and_required_for_activation_.begin(), |
1034 eviction_tiles_eventually_and_required_for_activation_.end(), | 1047 eviction_tiles_eventually_and_required_for_activation_.end(), |
1035 sort_order); | 1048 sort_order); |
1036 | 1049 |
1037 eviction_tiles_cache_valid_ = true; | 1050 eviction_tiles_cache_valid_ = true; |
1038 eviction_cache_tree_priority_ = tree_priority; | 1051 eviction_cache_tree_priority_ = tree_priority; |
1039 } | 1052 } |
1040 | 1053 |
1041 const std::vector<Tile*>* PictureLayerTiling::GetEvictionTiles( | 1054 const std::vector<Tile*>* PictureLayerTiling::GetEvictionTiles( |
1042 TreePriority tree_priority, | 1055 TreePriority tree_priority, |
1043 EvictionCategory category) { | 1056 EvictionCategory category, |
1044 UpdateEvictionCacheIfNeeded(tree_priority); | 1057 bool use_tile_priority_rects, |
1058 bool use_twin_tile_priority_rects) { | |
1059 UpdateEvictionCacheIfNeeded( | |
1060 tree_priority, use_tile_priority_rects, use_twin_tile_priority_rects); | |
1045 switch (category) { | 1061 switch (category) { |
1046 case EVENTUALLY: | 1062 case EVENTUALLY: |
1047 return &eviction_tiles_eventually_; | 1063 return &eviction_tiles_eventually_; |
1048 case EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION: | 1064 case EVENTUALLY_AND_REQUIRED_FOR_ACTIVATION: |
1049 return &eviction_tiles_eventually_and_required_for_activation_; | 1065 return &eviction_tiles_eventually_and_required_for_activation_; |
1050 case SOON: | 1066 case SOON: |
1051 return &eviction_tiles_soon_; | 1067 return &eviction_tiles_soon_; |
1052 case SOON_AND_REQUIRED_FOR_ACTIVATION: | 1068 case SOON_AND_REQUIRED_FOR_ACTIVATION: |
1053 return &eviction_tiles_soon_and_required_for_activation_; | 1069 return &eviction_tiles_soon_and_required_for_activation_; |
1054 case NOW: | 1070 case NOW: |
(...skipping 23 matching lines...) Expand all Loading... | |
1078 AdvancePhase(); | 1094 AdvancePhase(); |
1079 return; | 1095 return; |
1080 } | 1096 } |
1081 | 1097 |
1082 current_tile_ = | 1098 current_tile_ = |
1083 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); | 1099 tiling_->TileAt(visible_iterator_.index_x(), visible_iterator_.index_y()); |
1084 if (!current_tile_ || !TileNeedsRaster(current_tile_)) { | 1100 if (!current_tile_ || !TileNeedsRaster(current_tile_)) { |
1085 ++(*this); | 1101 ++(*this); |
1086 return; | 1102 return; |
1087 } | 1103 } |
1088 tiling_->UpdateTileAndTwinPriority(current_tile_); | 1104 tiling_->UpdateTileAndTwinPriority(current_tile_, true, true); |
1089 } | 1105 } |
1090 | 1106 |
1091 PictureLayerTiling::TilingRasterTileIterator::~TilingRasterTileIterator() {} | 1107 PictureLayerTiling::TilingRasterTileIterator::~TilingRasterTileIterator() {} |
1092 | 1108 |
1093 void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { | 1109 void PictureLayerTiling::TilingRasterTileIterator::AdvancePhase() { |
1094 DCHECK_LT(phase_, EVENTUALLY_RECT); | 1110 DCHECK_LT(phase_, EVENTUALLY_RECT); |
1095 | 1111 |
1096 do { | 1112 do { |
1097 phase_ = static_cast<Phase>(phase_ + 1); | 1113 phase_ = static_cast<Phase>(phase_ + 1); |
1098 switch (phase_) { | 1114 switch (phase_) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1141 ++spiral_iterator_; | 1157 ++spiral_iterator_; |
1142 } | 1158 } |
1143 | 1159 |
1144 if (!spiral_iterator_ && phase_ == EVENTUALLY_RECT) { | 1160 if (!spiral_iterator_ && phase_ == EVENTUALLY_RECT) { |
1145 current_tile_ = NULL; | 1161 current_tile_ = NULL; |
1146 break; | 1162 break; |
1147 } | 1163 } |
1148 } while (!spiral_iterator_); | 1164 } while (!spiral_iterator_); |
1149 | 1165 |
1150 if (current_tile_) | 1166 if (current_tile_) |
1151 tiling_->UpdateTileAndTwinPriority(current_tile_); | 1167 tiling_->UpdateTileAndTwinPriority(current_tile_, true, true); |
1152 } | 1168 } |
1153 | 1169 |
1154 PictureLayerTiling::TilingRasterTileIterator& | 1170 PictureLayerTiling::TilingRasterTileIterator& |
1155 PictureLayerTiling::TilingRasterTileIterator:: | 1171 PictureLayerTiling::TilingRasterTileIterator:: |
1156 operator++() { | 1172 operator++() { |
1157 current_tile_ = NULL; | 1173 current_tile_ = NULL; |
1158 while (!current_tile_ || !TileNeedsRaster(current_tile_)) { | 1174 while (!current_tile_ || !TileNeedsRaster(current_tile_)) { |
1159 std::pair<int, int> next_index; | 1175 std::pair<int, int> next_index; |
1160 switch (phase_) { | 1176 switch (phase_) { |
1161 case VISIBLE_RECT: | 1177 case VISIBLE_RECT: |
(...skipping 19 matching lines...) Expand all Loading... | |
1181 current_tile_ = NULL; | 1197 current_tile_ = NULL; |
1182 return *this; | 1198 return *this; |
1183 } | 1199 } |
1184 next_index = spiral_iterator_.index(); | 1200 next_index = spiral_iterator_.index(); |
1185 break; | 1201 break; |
1186 } | 1202 } |
1187 current_tile_ = tiling_->TileAt(next_index.first, next_index.second); | 1203 current_tile_ = tiling_->TileAt(next_index.first, next_index.second); |
1188 } | 1204 } |
1189 | 1205 |
1190 if (current_tile_) | 1206 if (current_tile_) |
1191 tiling_->UpdateTileAndTwinPriority(current_tile_); | 1207 tiling_->UpdateTileAndTwinPriority(current_tile_, true, true); |
1192 return *this; | 1208 return *this; |
1193 } | 1209 } |
1194 | 1210 |
1195 PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator() | 1211 PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator() |
1196 : eviction_tiles_(NULL), current_eviction_tiles_index_(0u) { | 1212 : eviction_tiles_(NULL), current_eviction_tiles_index_(0u) { |
1197 } | 1213 } |
1198 | 1214 |
1199 PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( | 1215 PictureLayerTiling::TilingEvictionTileIterator::TilingEvictionTileIterator( |
1200 PictureLayerTiling* tiling, | 1216 PictureLayerTiling* tiling, |
1201 TreePriority tree_priority, | 1217 TreePriority tree_priority, |
1202 EvictionCategory category) | 1218 EvictionCategory category, |
1203 : eviction_tiles_(tiling->GetEvictionTiles(tree_priority, category)), | 1219 bool use_tile_priority_rects, |
1220 bool use_twin_tile_priority_rects) | |
1221 : eviction_tiles_(tiling->GetEvictionTiles(tree_priority, | |
1222 category, | |
1223 use_tile_priority_rects, | |
1224 use_twin_tile_priority_rects)), | |
1204 // Note: initializing to "0 - 1" works as overflow is well defined for | 1225 // Note: initializing to "0 - 1" works as overflow is well defined for |
1205 // unsigned integers. | 1226 // unsigned integers. |
1206 current_eviction_tiles_index_(static_cast<size_t>(0) - 1) { | 1227 current_eviction_tiles_index_(static_cast<size_t>(0) - 1) { |
1207 DCHECK(eviction_tiles_); | 1228 DCHECK(eviction_tiles_); |
1208 ++(*this); | 1229 ++(*this); |
1209 } | 1230 } |
1210 | 1231 |
1211 PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() { | 1232 PictureLayerTiling::TilingEvictionTileIterator::~TilingEvictionTileIterator() { |
1212 } | 1233 } |
1213 | 1234 |
(...skipping 18 matching lines...) Expand all Loading... | |
1232 DCHECK(*this); | 1253 DCHECK(*this); |
1233 do { | 1254 do { |
1234 ++current_eviction_tiles_index_; | 1255 ++current_eviction_tiles_index_; |
1235 } while (current_eviction_tiles_index_ != eviction_tiles_->size() && | 1256 } while (current_eviction_tiles_index_ != eviction_tiles_->size() && |
1236 !(*eviction_tiles_)[current_eviction_tiles_index_]->HasResources()); | 1257 !(*eviction_tiles_)[current_eviction_tiles_index_]->HasResources()); |
1237 | 1258 |
1238 return *this; | 1259 return *this; |
1239 } | 1260 } |
1240 | 1261 |
1241 } // namespace cc | 1262 } // namespace cc |
OLD | NEW |