| 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/tiles/picture_layer_tiling_set.h" | 5 #include "cc/tiles/picture_layer_tiling_set.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "cc/playback/display_list_raster_source.h" | 11 #include "cc/playback/display_list_raster_source.h" |
| 12 | 12 |
| 13 namespace cc { | 13 namespace cc { |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 class LargestToSmallestScaleFunctor { | 17 class LargestToSmallestScaleFunctor { |
| 18 public: | 18 public: |
| 19 bool operator() (PictureLayerTiling* left, PictureLayerTiling* right) { | 19 bool operator()(const scoped_ptr<PictureLayerTiling>& left, |
| 20 const scoped_ptr<PictureLayerTiling>& right) { |
| 20 return left->contents_scale() > right->contents_scale(); | 21 return left->contents_scale() > right->contents_scale(); |
| 21 } | 22 } |
| 22 }; | 23 }; |
| 23 | 24 |
| 24 inline float LargerRatio(float float1, float float2) { | 25 inline float LargerRatio(float float1, float float2) { |
| 25 DCHECK_GT(float1, 0.f); | 26 DCHECK_GT(float1, 0.f); |
| 26 DCHECK_GT(float2, 0.f); | 27 DCHECK_GT(float2, 0.f); |
| 27 return float1 > float2 ? float1 / float2 : float2 / float1; | 28 return float1 > float2 ? float1 / float2 : float2 / float1; |
| 28 } | 29 } |
| 29 | 30 |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 const Region& layer_invalidation) { | 65 const Region& layer_invalidation) { |
| 65 if (pending_twin_set->tilings_.empty()) { | 66 if (pending_twin_set->tilings_.empty()) { |
| 66 // If the twin (pending) tiling set is empty, it was not updated for the | 67 // If the twin (pending) tiling set is empty, it was not updated for the |
| 67 // current frame. So we drop tilings from our set as well, instead of | 68 // current frame. So we drop tilings from our set as well, instead of |
| 68 // leaving behind unshared tilings that are all non-ideal. | 69 // leaving behind unshared tilings that are all non-ideal. |
| 69 RemoveAllTilings(); | 70 RemoveAllTilings(); |
| 70 return; | 71 return; |
| 71 } | 72 } |
| 72 | 73 |
| 73 bool tiling_sort_required = false; | 74 bool tiling_sort_required = false; |
| 74 for (PictureLayerTiling* pending_twin_tiling : pending_twin_set->tilings_) { | 75 for (const auto& pending_twin_tiling : pending_twin_set->tilings_) { |
| 75 float contents_scale = pending_twin_tiling->contents_scale(); | 76 float contents_scale = pending_twin_tiling->contents_scale(); |
| 76 PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale); | 77 PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale); |
| 77 if (!this_tiling) { | 78 if (!this_tiling) { |
| 78 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( | 79 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( |
| 79 tree_, contents_scale, raster_source, client_, | 80 tree_, contents_scale, raster_source, client_, |
| 80 tiling_interest_area_padding_, skewport_target_time_in_seconds_, | 81 tiling_interest_area_padding_, skewport_target_time_in_seconds_, |
| 81 skewport_extrapolation_limit_in_content_pixels_); | 82 skewport_extrapolation_limit_in_content_pixels_); |
| 82 tilings_.push_back(new_tiling.Pass()); | 83 tilings_.push_back(new_tiling.Pass()); |
| 83 this_tiling = tilings_.back(); | 84 this_tiling = tilings_.back().get(); |
| 84 tiling_sort_required = true; | 85 tiling_sort_required = true; |
| 85 } | 86 } |
| 86 this_tiling->TakeTilesAndPropertiesFrom(pending_twin_tiling, | 87 this_tiling->TakeTilesAndPropertiesFrom(pending_twin_tiling.get(), |
| 87 layer_invalidation); | 88 layer_invalidation); |
| 88 } | 89 } |
| 89 | 90 |
| 90 if (tiling_sort_required) | 91 if (tiling_sort_required) { |
| 91 tilings_.sort(LargestToSmallestScaleFunctor()); | 92 std::sort(tilings_.begin(), tilings_.end(), |
| 93 LargestToSmallestScaleFunctor()); |
| 94 } |
| 92 } | 95 } |
| 93 | 96 |
| 94 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSourceForActivation( | 97 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSourceForActivation( |
| 95 scoped_refptr<DisplayListRasterSource> raster_source, | 98 scoped_refptr<DisplayListRasterSource> raster_source, |
| 96 const PictureLayerTilingSet* pending_twin_set, | 99 const PictureLayerTilingSet* pending_twin_set, |
| 97 const Region& layer_invalidation, | 100 const Region& layer_invalidation, |
| 98 float minimum_contents_scale, | 101 float minimum_contents_scale, |
| 99 float maximum_contents_scale) { | 102 float maximum_contents_scale) { |
| 100 RemoveTilingsBelowScale(minimum_contents_scale); | 103 RemoveTilingsBelowScale(minimum_contents_scale); |
| 101 RemoveTilingsAboveScale(maximum_contents_scale); | 104 RemoveTilingsAboveScale(maximum_contents_scale); |
| 102 | 105 |
| 103 // Copy over tilings that are shared with the |pending_twin_set| tiling set. | 106 // Copy over tilings that are shared with the |pending_twin_set| tiling set. |
| 104 // Also, copy all of the properties from twin tilings. | 107 // Also, copy all of the properties from twin tilings. |
| 105 CopyTilingsAndPropertiesFromPendingTwin(pending_twin_set, raster_source, | 108 CopyTilingsAndPropertiesFromPendingTwin(pending_twin_set, raster_source, |
| 106 layer_invalidation); | 109 layer_invalidation); |
| 107 | 110 |
| 108 // If the tiling is not shared (FindTilingWithScale returns nullptr), then | 111 // If the tiling is not shared (FindTilingWithScale returns nullptr), then |
| 109 // invalidate tiles and update them to the new raster source. | 112 // invalidate tiles and update them to the new raster source. |
| 110 for (PictureLayerTiling* tiling : tilings_) { | 113 for (const auto& tiling : tilings_) { |
| 111 if (pending_twin_set->FindTilingWithScale(tiling->contents_scale())) | 114 if (pending_twin_set->FindTilingWithScale(tiling->contents_scale())) |
| 112 continue; | 115 continue; |
| 113 | 116 |
| 114 tiling->SetRasterSourceAndResize(raster_source); | 117 tiling->SetRasterSourceAndResize(raster_source); |
| 115 tiling->Invalidate(layer_invalidation); | 118 tiling->Invalidate(layer_invalidation); |
| 116 // This is needed for cases where the live tiles rect didn't change but | 119 // This is needed for cases where the live tiles rect didn't change but |
| 117 // recordings exist in the raster source that did not exist on the last | 120 // recordings exist in the raster source that did not exist on the last |
| 118 // raster source. | 121 // raster source. |
| 119 tiling->CreateMissingTilesInLiveTilesRect(); | 122 tiling->CreateMissingTilesInLiveTilesRect(); |
| 120 | 123 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 132 | 135 |
| 133 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSourceForCommit( | 136 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSourceForCommit( |
| 134 scoped_refptr<DisplayListRasterSource> raster_source, | 137 scoped_refptr<DisplayListRasterSource> raster_source, |
| 135 const Region& layer_invalidation, | 138 const Region& layer_invalidation, |
| 136 float minimum_contents_scale, | 139 float minimum_contents_scale, |
| 137 float maximum_contents_scale) { | 140 float maximum_contents_scale) { |
| 138 RemoveTilingsBelowScale(minimum_contents_scale); | 141 RemoveTilingsBelowScale(minimum_contents_scale); |
| 139 RemoveTilingsAboveScale(maximum_contents_scale); | 142 RemoveTilingsAboveScale(maximum_contents_scale); |
| 140 | 143 |
| 141 // Invalidate tiles and update them to the new raster source. | 144 // Invalidate tiles and update them to the new raster source. |
| 142 for (PictureLayerTiling* tiling : tilings_) { | 145 for (const scoped_ptr<PictureLayerTiling>& tiling : tilings_) { |
| 143 DCHECK(tree_ != PENDING_TREE || !tiling->has_tiles()); | 146 DCHECK(tree_ != PENDING_TREE || !tiling->has_tiles()); |
| 144 tiling->SetRasterSourceAndResize(raster_source); | 147 tiling->SetRasterSourceAndResize(raster_source); |
| 145 | 148 |
| 146 // We can commit on either active or pending trees, but only active one can | 149 // We can commit on either active or pending trees, but only active one can |
| 147 // have tiles at this point. | 150 // have tiles at this point. |
| 148 if (tree_ == ACTIVE_TREE) | 151 if (tree_ == ACTIVE_TREE) |
| 149 tiling->Invalidate(layer_invalidation); | 152 tiling->Invalidate(layer_invalidation); |
| 150 | 153 |
| 151 // This is needed for cases where the live tiles rect didn't change but | 154 // This is needed for cases where the live tiles rect didn't change but |
| 152 // recordings exist in the raster source that did not exist on the last | 155 // recordings exist in the raster source that did not exist on the last |
| 153 // raster source. | 156 // raster source. |
| 154 tiling->CreateMissingTilesInLiveTilesRect(); | 157 tiling->CreateMissingTilesInLiveTilesRect(); |
| 155 } | 158 } |
| 156 VerifyTilings(nullptr /* pending_twin_set */); | 159 VerifyTilings(nullptr /* pending_twin_set */); |
| 157 } | 160 } |
| 158 | 161 |
| 159 void PictureLayerTilingSet::UpdateRasterSourceDueToLCDChange( | 162 void PictureLayerTilingSet::UpdateRasterSourceDueToLCDChange( |
| 160 const scoped_refptr<DisplayListRasterSource>& raster_source, | 163 const scoped_refptr<DisplayListRasterSource>& raster_source, |
| 161 const Region& layer_invalidation) { | 164 const Region& layer_invalidation) { |
| 162 for (PictureLayerTiling* tiling : tilings_) { | 165 for (const auto& tiling : tilings_) { |
| 163 tiling->SetRasterSourceAndResize(raster_source); | 166 tiling->SetRasterSourceAndResize(raster_source); |
| 164 tiling->Invalidate(layer_invalidation); | 167 tiling->Invalidate(layer_invalidation); |
| 165 // Since the invalidation changed, we need to create any missing tiles in | 168 // Since the invalidation changed, we need to create any missing tiles in |
| 166 // the live tiles rect again. | 169 // the live tiles rect again. |
| 167 tiling->CreateMissingTilesInLiveTilesRect(); | 170 tiling->CreateMissingTilesInLiveTilesRect(); |
| 168 } | 171 } |
| 169 } | 172 } |
| 170 | 173 |
| 171 void PictureLayerTilingSet::VerifyTilings( | 174 void PictureLayerTilingSet::VerifyTilings( |
| 172 const PictureLayerTilingSet* pending_twin_set) const { | 175 const PictureLayerTilingSet* pending_twin_set) const { |
| 173 #if DCHECK_IS_ON() | 176 #if DCHECK_IS_ON() |
| 174 for (PictureLayerTiling* tiling : tilings_) { | 177 for (const auto& tiling : tilings_) { |
| 175 DCHECK(tiling->tile_size() == | 178 DCHECK(tiling->tile_size() == |
| 176 client_->CalculateTileSize(tiling->tiling_size())) | 179 client_->CalculateTileSize(tiling->tiling_size())) |
| 177 << "tile_size: " << tiling->tile_size().ToString() | 180 << "tile_size: " << tiling->tile_size().ToString() |
| 178 << " tiling_size: " << tiling->tiling_size().ToString() | 181 << " tiling_size: " << tiling->tiling_size().ToString() |
| 179 << " CalculateTileSize: " | 182 << " CalculateTileSize: " |
| 180 << client_->CalculateTileSize(tiling->tiling_size()).ToString(); | 183 << client_->CalculateTileSize(tiling->tiling_size()).ToString(); |
| 181 } | 184 } |
| 182 | 185 |
| 183 if (!tilings_.empty()) { | 186 if (!tilings_.empty()) { |
| 184 DCHECK_LE(NumHighResTilings(), 1); | 187 DCHECK_LE(NumHighResTilings(), 1); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 195 } | 198 } |
| 196 #endif | 199 #endif |
| 197 } | 200 } |
| 198 | 201 |
| 199 void PictureLayerTilingSet::CleanUpTilings( | 202 void PictureLayerTilingSet::CleanUpTilings( |
| 200 float min_acceptable_high_res_scale, | 203 float min_acceptable_high_res_scale, |
| 201 float max_acceptable_high_res_scale, | 204 float max_acceptable_high_res_scale, |
| 202 const std::vector<PictureLayerTiling*>& needed_tilings, | 205 const std::vector<PictureLayerTiling*>& needed_tilings, |
| 203 PictureLayerTilingSet* twin_set) { | 206 PictureLayerTilingSet* twin_set) { |
| 204 std::vector<PictureLayerTiling*> to_remove; | 207 std::vector<PictureLayerTiling*> to_remove; |
| 205 for (auto* tiling : tilings_) { | 208 for (const auto& tiling : tilings_) { |
| 206 // Keep all tilings within the min/max scales. | 209 // Keep all tilings within the min/max scales. |
| 207 if (tiling->contents_scale() >= min_acceptable_high_res_scale && | 210 if (tiling->contents_scale() >= min_acceptable_high_res_scale && |
| 208 tiling->contents_scale() <= max_acceptable_high_res_scale) { | 211 tiling->contents_scale() <= max_acceptable_high_res_scale) { |
| 209 continue; | 212 continue; |
| 210 } | 213 } |
| 211 | 214 |
| 212 // Keep low resolution tilings. | 215 // Keep low resolution tilings. |
| 213 if (tiling->resolution() == LOW_RESOLUTION) | 216 if (tiling->resolution() == LOW_RESOLUTION) |
| 214 continue; | 217 continue; |
| 215 | 218 |
| 216 // Don't remove tilings that are required. | 219 // Don't remove tilings that are required. |
| 217 if (std::find(needed_tilings.begin(), needed_tilings.end(), tiling) != | 220 if (std::find(needed_tilings.begin(), needed_tilings.end(), tiling.get()) != |
| 218 needed_tilings.end()) { | 221 needed_tilings.end()) { |
| 219 continue; | 222 continue; |
| 220 } | 223 } |
| 221 | 224 |
| 222 to_remove.push_back(tiling); | 225 to_remove.push_back(tiling.get()); |
| 223 } | 226 } |
| 224 | 227 |
| 225 for (auto* tiling : to_remove) { | 228 for (auto* tiling : to_remove) { |
| 226 DCHECK_NE(HIGH_RESOLUTION, tiling->resolution()); | 229 DCHECK_NE(HIGH_RESOLUTION, tiling->resolution()); |
| 227 Remove(tiling); | 230 Remove(tiling); |
| 228 } | 231 } |
| 229 } | 232 } |
| 230 | 233 |
| 231 void PictureLayerTilingSet::RemoveNonIdealTilings() { | 234 void PictureLayerTilingSet::RemoveNonIdealTilings() { |
| 232 auto to_remove = tilings_.remove_if([](PictureLayerTiling* t) { | 235 auto to_remove = |
| 233 return t->resolution() == NON_IDEAL_RESOLUTION; | 236 std::remove_if(tilings_.begin(), tilings_.end(), |
| 234 }); | 237 [](const scoped_ptr<PictureLayerTiling>& t) { |
| 238 return t->resolution() == NON_IDEAL_RESOLUTION; |
| 239 }); |
| 235 tilings_.erase(to_remove, tilings_.end()); | 240 tilings_.erase(to_remove, tilings_.end()); |
| 236 } | 241 } |
| 237 | 242 |
| 238 void PictureLayerTilingSet::MarkAllTilingsNonIdeal() { | 243 void PictureLayerTilingSet::MarkAllTilingsNonIdeal() { |
| 239 for (auto* tiling : tilings_) | 244 for (const auto& tiling : tilings_) |
| 240 tiling->set_resolution(NON_IDEAL_RESOLUTION); | 245 tiling->set_resolution(NON_IDEAL_RESOLUTION); |
| 241 } | 246 } |
| 242 | 247 |
| 243 PictureLayerTiling* PictureLayerTilingSet::AddTiling( | 248 PictureLayerTiling* PictureLayerTilingSet::AddTiling( |
| 244 float contents_scale, | 249 float contents_scale, |
| 245 scoped_refptr<DisplayListRasterSource> raster_source) { | 250 scoped_refptr<DisplayListRasterSource> raster_source) { |
| 246 for (size_t i = 0; i < tilings_.size(); ++i) { | 251 for (size_t i = 0; i < tilings_.size(); ++i) { |
| 247 DCHECK_NE(tilings_[i]->contents_scale(), contents_scale); | 252 DCHECK_NE(tilings_[i]->contents_scale(), contents_scale); |
| 248 DCHECK_EQ(tilings_[i]->raster_source(), raster_source.get()); | 253 DCHECK_EQ(tilings_[i]->raster_source(), raster_source.get()); |
| 249 } | 254 } |
| 250 | 255 |
| 251 tilings_.push_back(PictureLayerTiling::Create( | 256 tilings_.push_back(PictureLayerTiling::Create( |
| 252 tree_, contents_scale, raster_source, client_, | 257 tree_, contents_scale, raster_source, client_, |
| 253 tiling_interest_area_padding_, skewport_target_time_in_seconds_, | 258 tiling_interest_area_padding_, skewport_target_time_in_seconds_, |
| 254 skewport_extrapolation_limit_in_content_pixels_)); | 259 skewport_extrapolation_limit_in_content_pixels_)); |
| 255 PictureLayerTiling* appended = tilings_.back(); | 260 PictureLayerTiling* appended = tilings_.back().get(); |
| 256 | 261 |
| 257 tilings_.sort(LargestToSmallestScaleFunctor()); | 262 std::sort(tilings_.begin(), tilings_.end(), LargestToSmallestScaleFunctor()); |
| 258 return appended; | 263 return appended; |
| 259 } | 264 } |
| 260 | 265 |
| 261 int PictureLayerTilingSet::NumHighResTilings() const { | 266 int PictureLayerTilingSet::NumHighResTilings() const { |
| 262 return std::count_if(tilings_.begin(), tilings_.end(), | 267 return std::count_if(tilings_.begin(), tilings_.end(), |
| 263 [](PictureLayerTiling* tiling) { | 268 [](const scoped_ptr<PictureLayerTiling>& tiling) { |
| 264 return tiling->resolution() == HIGH_RESOLUTION; | 269 return tiling->resolution() == HIGH_RESOLUTION; |
| 265 }); | 270 }); |
| 266 } | 271 } |
| 267 | 272 |
| 268 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithScale( | 273 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithScale( |
| 269 float scale) const { | 274 float scale) const { |
| 270 for (size_t i = 0; i < tilings_.size(); ++i) { | 275 for (size_t i = 0; i < tilings_.size(); ++i) { |
| 271 if (tilings_[i]->contents_scale() == scale) | 276 if (tilings_[i]->contents_scale() == scale) |
| 272 return tilings_[i]; | 277 return tilings_[i].get(); |
| 273 } | 278 } |
| 274 return NULL; | 279 return nullptr; |
| 275 } | 280 } |
| 276 | 281 |
| 277 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithResolution( | 282 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithResolution( |
| 278 TileResolution resolution) const { | 283 TileResolution resolution) const { |
| 279 auto iter = std::find_if(tilings_.begin(), tilings_.end(), | 284 auto iter = |
| 280 [resolution](const PictureLayerTiling* tiling) { | 285 std::find_if(tilings_.begin(), tilings_.end(), |
| 281 return tiling->resolution() == resolution; | 286 [resolution](const scoped_ptr<PictureLayerTiling>& tiling) { |
| 282 }); | 287 return tiling->resolution() == resolution; |
| 288 }); |
| 283 if (iter == tilings_.end()) | 289 if (iter == tilings_.end()) |
| 284 return NULL; | 290 return nullptr; |
| 285 return *iter; | 291 return iter->get(); |
| 286 } | 292 } |
| 287 | 293 |
| 288 void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) { | 294 void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) { |
| 289 auto to_remove = | 295 auto to_remove = std::remove_if( |
| 290 tilings_.remove_if([minimum_scale](PictureLayerTiling* tiling) { | 296 tilings_.begin(), tilings_.end(), |
| 297 [minimum_scale](const scoped_ptr<PictureLayerTiling>& tiling) { |
| 291 return tiling->contents_scale() < minimum_scale; | 298 return tiling->contents_scale() < minimum_scale; |
| 292 }); | 299 }); |
| 293 tilings_.erase(to_remove, tilings_.end()); | 300 tilings_.erase(to_remove, tilings_.end()); |
| 294 } | 301 } |
| 295 | 302 |
| 296 void PictureLayerTilingSet::RemoveTilingsAboveScale(float maximum_scale) { | 303 void PictureLayerTilingSet::RemoveTilingsAboveScale(float maximum_scale) { |
| 297 auto to_remove = | 304 auto to_remove = std::remove_if( |
| 298 tilings_.remove_if([maximum_scale](PictureLayerTiling* tiling) { | 305 tilings_.begin(), tilings_.end(), |
| 306 [maximum_scale](const scoped_ptr<PictureLayerTiling>& tiling) { |
| 299 return tiling->contents_scale() > maximum_scale; | 307 return tiling->contents_scale() > maximum_scale; |
| 300 }); | 308 }); |
| 301 tilings_.erase(to_remove, tilings_.end()); | 309 tilings_.erase(to_remove, tilings_.end()); |
| 302 } | 310 } |
| 303 | 311 |
| 304 void PictureLayerTilingSet::RemoveAllTilings() { | 312 void PictureLayerTilingSet::RemoveAllTilings() { |
| 305 tilings_.clear(); | 313 tilings_.clear(); |
| 306 } | 314 } |
| 307 | 315 |
| 308 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { | 316 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { |
| 309 ScopedPtrVector<PictureLayerTiling>::iterator iter = | 317 auto iter = |
| 310 std::find(tilings_.begin(), tilings_.end(), tiling); | 318 std::find_if(tilings_.begin(), tilings_.end(), |
| 319 [tiling](const scoped_ptr<PictureLayerTiling>& candidate) { |
| 320 return candidate.get() == tiling; |
| 321 }); |
| 311 if (iter == tilings_.end()) | 322 if (iter == tilings_.end()) |
| 312 return; | 323 return; |
| 313 tilings_.erase(iter); | 324 tilings_.erase(iter); |
| 314 } | 325 } |
| 315 | 326 |
| 316 void PictureLayerTilingSet::RemoveAllTiles() { | 327 void PictureLayerTilingSet::RemoveAllTiles() { |
| 317 for (size_t i = 0; i < tilings_.size(); ++i) | 328 for (size_t i = 0; i < tilings_.size(); ++i) |
| 318 tilings_[i]->Reset(); | 329 tilings_[i]->Reset(); |
| 319 } | 330 } |
| 320 | 331 |
| 321 float PictureLayerTilingSet::GetSnappedContentsScale( | 332 float PictureLayerTilingSet::GetSnappedContentsScale( |
| 322 float start_scale, | 333 float start_scale, |
| 323 float snap_to_existing_tiling_ratio) const { | 334 float snap_to_existing_tiling_ratio) const { |
| 324 // If a tiling exists within the max snapping ratio, snap to its scale. | 335 // If a tiling exists within the max snapping ratio, snap to its scale. |
| 325 float snapped_contents_scale = start_scale; | 336 float snapped_contents_scale = start_scale; |
| 326 float snapped_ratio = snap_to_existing_tiling_ratio; | 337 float snapped_ratio = snap_to_existing_tiling_ratio; |
| 327 for (const auto* tiling : tilings_) { | 338 for (const auto& tiling : tilings_) { |
| 328 float tiling_contents_scale = tiling->contents_scale(); | 339 float tiling_contents_scale = tiling->contents_scale(); |
| 329 float ratio = LargerRatio(tiling_contents_scale, start_scale); | 340 float ratio = LargerRatio(tiling_contents_scale, start_scale); |
| 330 if (ratio < snapped_ratio) { | 341 if (ratio < snapped_ratio) { |
| 331 snapped_contents_scale = tiling_contents_scale; | 342 snapped_contents_scale = tiling_contents_scale; |
| 332 snapped_ratio = ratio; | 343 snapped_ratio = ratio; |
| 333 } | 344 } |
| 334 } | 345 } |
| 335 return snapped_contents_scale; | 346 return snapped_contents_scale; |
| 336 } | 347 } |
| 337 | 348 |
| 338 float PictureLayerTilingSet::GetMaximumContentsScale() const { | 349 float PictureLayerTilingSet::GetMaximumContentsScale() const { |
| 339 if (tilings_.empty()) | 350 if (tilings_.empty()) |
| 340 return 0.f; | 351 return 0.f; |
| 341 // The first tiling has the largest contents scale. | 352 // The first tiling has the largest contents scale. |
| 342 return tilings_[0]->contents_scale(); | 353 return tilings_[0]->contents_scale(); |
| 343 } | 354 } |
| 344 | 355 |
| 345 bool PictureLayerTilingSet::UpdateTilePriorities( | 356 bool PictureLayerTilingSet::UpdateTilePriorities( |
| 346 const gfx::Rect& required_rect_in_layer_space, | 357 const gfx::Rect& required_rect_in_layer_space, |
| 347 float ideal_contents_scale, | 358 float ideal_contents_scale, |
| 348 double current_frame_time_in_seconds, | 359 double current_frame_time_in_seconds, |
| 349 const Occlusion& occlusion_in_layer_space, | 360 const Occlusion& occlusion_in_layer_space, |
| 350 bool can_require_tiles_for_activation) { | 361 bool can_require_tiles_for_activation) { |
| 351 bool updated = false; | 362 bool updated = false; |
| 352 for (auto* tiling : tilings_) { | 363 for (const auto& tiling : tilings_) { |
| 353 tiling->set_can_require_tiles_for_activation( | 364 tiling->set_can_require_tiles_for_activation( |
| 354 can_require_tiles_for_activation); | 365 can_require_tiles_for_activation); |
| 355 updated |= tiling->ComputeTilePriorityRects( | 366 updated |= tiling->ComputeTilePriorityRects( |
| 356 required_rect_in_layer_space, ideal_contents_scale, | 367 required_rect_in_layer_space, ideal_contents_scale, |
| 357 current_frame_time_in_seconds, occlusion_in_layer_space); | 368 current_frame_time_in_seconds, occlusion_in_layer_space); |
| 358 } | 369 } |
| 359 return updated; | 370 return updated; |
| 360 } | 371 } |
| 361 | 372 |
| 362 void PictureLayerTilingSet::GetAllPrioritizedTilesForTracing( | 373 void PictureLayerTilingSet::GetAllPrioritizedTilesForTracing( |
| 363 std::vector<PrioritizedTile>* prioritized_tiles) const { | 374 std::vector<PrioritizedTile>* prioritized_tiles) const { |
| 364 for (auto* tiling : tilings_) | 375 for (const auto& tiling : tilings_) |
| 365 tiling->GetAllPrioritizedTilesForTracing(prioritized_tiles); | 376 tiling->GetAllPrioritizedTilesForTracing(prioritized_tiles); |
| 366 } | 377 } |
| 367 | 378 |
| 368 PictureLayerTilingSet::CoverageIterator::CoverageIterator( | 379 PictureLayerTilingSet::CoverageIterator::CoverageIterator( |
| 369 const PictureLayerTilingSet* set, | 380 const PictureLayerTilingSet* set, |
| 370 float contents_scale, | 381 float contents_scale, |
| 371 const gfx::Rect& content_rect, | 382 const gfx::Rect& content_rect, |
| 372 float ideal_contents_scale) | 383 float ideal_contents_scale) |
| 373 : set_(set), | 384 : set_(set), |
| 374 contents_scale_(contents_scale), | 385 contents_scale_(contents_scale), |
| 375 ideal_contents_scale_(ideal_contents_scale), | 386 ideal_contents_scale_(ideal_contents_scale), |
| 376 current_tiling_(std::numeric_limits<size_t>::max()) { | 387 current_tiling_(std::numeric_limits<size_t>::max()) { |
| 377 missing_region_.Union(content_rect); | 388 missing_region_.Union(content_rect); |
| 378 | 389 |
| 379 size_t tilings_size = set_->tilings_.size(); | 390 size_t tilings_size = set_->tilings_.size(); |
| 380 for (ideal_tiling_ = 0; ideal_tiling_ < tilings_size; ++ideal_tiling_) { | 391 for (ideal_tiling_ = 0; ideal_tiling_ < tilings_size; ++ideal_tiling_) { |
| 381 PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_]; | 392 PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_].get(); |
| 382 if (tiling->contents_scale() < ideal_contents_scale_) { | 393 if (tiling->contents_scale() < ideal_contents_scale_) { |
| 383 if (ideal_tiling_ > 0) | 394 if (ideal_tiling_ > 0) |
| 384 ideal_tiling_--; | 395 ideal_tiling_--; |
| 385 break; | 396 break; |
| 386 } | 397 } |
| 387 } | 398 } |
| 388 | 399 |
| 389 if (ideal_tiling_ == tilings_size && ideal_tiling_ > 0) | 400 if (ideal_tiling_ == tilings_size && ideal_tiling_ > 0) |
| 390 ideal_tiling_--; | 401 ideal_tiling_--; |
| 391 | 402 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 405 } | 416 } |
| 406 | 417 |
| 407 gfx::RectF PictureLayerTilingSet::CoverageIterator::texture_rect() const { | 418 gfx::RectF PictureLayerTilingSet::CoverageIterator::texture_rect() const { |
| 408 if (!tiling_iter_) | 419 if (!tiling_iter_) |
| 409 return gfx::RectF(); | 420 return gfx::RectF(); |
| 410 return tiling_iter_.texture_rect(); | 421 return tiling_iter_.texture_rect(); |
| 411 } | 422 } |
| 412 | 423 |
| 413 Tile* PictureLayerTilingSet::CoverageIterator::operator->() const { | 424 Tile* PictureLayerTilingSet::CoverageIterator::operator->() const { |
| 414 if (!tiling_iter_) | 425 if (!tiling_iter_) |
| 415 return NULL; | 426 return nullptr; |
| 416 return *tiling_iter_; | 427 return *tiling_iter_; |
| 417 } | 428 } |
| 418 | 429 |
| 419 Tile* PictureLayerTilingSet::CoverageIterator::operator*() const { | 430 Tile* PictureLayerTilingSet::CoverageIterator::operator*() const { |
| 420 if (!tiling_iter_) | 431 if (!tiling_iter_) |
| 421 return NULL; | 432 return nullptr; |
| 422 return *tiling_iter_; | 433 return *tiling_iter_; |
| 423 } | 434 } |
| 424 | 435 |
| 425 TileResolution PictureLayerTilingSet::CoverageIterator::resolution() const { | 436 TileResolution PictureLayerTilingSet::CoverageIterator::resolution() const { |
| 426 const PictureLayerTiling* tiling = CurrentTiling(); | 437 const PictureLayerTiling* tiling = CurrentTiling(); |
| 427 DCHECK(tiling); | 438 DCHECK(tiling); |
| 428 return tiling->resolution(); | 439 return tiling->resolution(); |
| 429 } | 440 } |
| 430 | 441 |
| 431 PictureLayerTiling* PictureLayerTilingSet::CoverageIterator::CurrentTiling() | 442 PictureLayerTiling* PictureLayerTilingSet::CoverageIterator::CurrentTiling() |
| 432 const { | 443 const { |
| 433 if (current_tiling_ == std::numeric_limits<size_t>::max()) | 444 if (current_tiling_ == std::numeric_limits<size_t>::max()) |
| 434 return NULL; | 445 return nullptr; |
| 435 if (current_tiling_ >= set_->tilings_.size()) | 446 if (current_tiling_ >= set_->tilings_.size()) |
| 436 return NULL; | 447 return nullptr; |
| 437 return set_->tilings_[current_tiling_]; | 448 return set_->tilings_[current_tiling_].get(); |
| 438 } | 449 } |
| 439 | 450 |
| 440 size_t PictureLayerTilingSet::CoverageIterator::NextTiling() const { | 451 size_t PictureLayerTilingSet::CoverageIterator::NextTiling() const { |
| 441 // Order returned by this method is: | 452 // Order returned by this method is: |
| 442 // 1. Ideal tiling index | 453 // 1. Ideal tiling index |
| 443 // 2. Tiling index < Ideal in decreasing order (higher res than ideal) | 454 // 2. Tiling index < Ideal in decreasing order (higher res than ideal) |
| 444 // 3. Tiling index > Ideal in increasing order (lower res than ideal) | 455 // 3. Tiling index > Ideal in increasing order (lower res than ideal) |
| 445 // 4. Tiling index > tilings.size() (invalid index) | 456 // 4. Tiling index > tilings.size() (invalid index) |
| 446 if (current_tiling_ == std::numeric_limits<size_t>::max()) | 457 if (current_tiling_ == std::numeric_limits<size_t>::max()) |
| 447 return ideal_tiling_; | 458 return ideal_tiling_; |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 gfx::Rect last_rect = region_iter_.rect(); | 509 gfx::Rect last_rect = region_iter_.rect(); |
| 499 region_iter_.next(); | 510 region_iter_.next(); |
| 500 | 511 |
| 501 // Done, found next checkerboard rect to return. | 512 // Done, found next checkerboard rect to return. |
| 502 if (current_tiling_ >= set_->tilings_.size()) | 513 if (current_tiling_ >= set_->tilings_.size()) |
| 503 return *this; | 514 return *this; |
| 504 | 515 |
| 505 // Construct a new iterator for the next tiling, but we need to loop | 516 // Construct a new iterator for the next tiling, but we need to loop |
| 506 // again until we get to a valid one. | 517 // again until we get to a valid one. |
| 507 tiling_iter_ = PictureLayerTiling::CoverageIterator( | 518 tiling_iter_ = PictureLayerTiling::CoverageIterator( |
| 508 set_->tilings_[current_tiling_], | 519 set_->tilings_[current_tiling_].get(), contents_scale_, last_rect); |
| 509 contents_scale_, | |
| 510 last_rect); | |
| 511 } | 520 } |
| 512 | 521 |
| 513 return *this; | 522 return *this; |
| 514 } | 523 } |
| 515 | 524 |
| 516 PictureLayerTilingSet::CoverageIterator::operator bool() const { | 525 PictureLayerTilingSet::CoverageIterator::operator bool() const { |
| 517 return current_tiling_ < set_->tilings_.size() || region_iter_.has_rect(); | 526 return current_tiling_ < set_->tilings_.size() || region_iter_.has_rect(); |
| 518 } | 527 } |
| 519 | 528 |
| 520 void PictureLayerTilingSet::AsValueInto( | 529 void PictureLayerTilingSet::AsValueInto( |
| (...skipping 14 matching lines...) Expand all Loading... |
| 535 | 544 |
| 536 PictureLayerTilingSet::TilingRange PictureLayerTilingSet::GetTilingRange( | 545 PictureLayerTilingSet::TilingRange PictureLayerTilingSet::GetTilingRange( |
| 537 TilingRangeType type) const { | 546 TilingRangeType type) const { |
| 538 // Doesn't seem to be the case right now but if it ever becomes a performance | 547 // Doesn't seem to be the case right now but if it ever becomes a performance |
| 539 // problem to compute these ranges each time this function is called, we can | 548 // problem to compute these ranges each time this function is called, we can |
| 540 // compute them only when the tiling set has changed instead. | 549 // compute them only when the tiling set has changed instead. |
| 541 size_t tilings_size = tilings_.size(); | 550 size_t tilings_size = tilings_.size(); |
| 542 TilingRange high_res_range(0, 0); | 551 TilingRange high_res_range(0, 0); |
| 543 TilingRange low_res_range(tilings_.size(), tilings_.size()); | 552 TilingRange low_res_range(tilings_.size(), tilings_.size()); |
| 544 for (size_t i = 0; i < tilings_size; ++i) { | 553 for (size_t i = 0; i < tilings_size; ++i) { |
| 545 const PictureLayerTiling* tiling = tilings_[i]; | 554 const PictureLayerTiling* tiling = tilings_[i].get(); |
| 546 if (tiling->resolution() == HIGH_RESOLUTION) | 555 if (tiling->resolution() == HIGH_RESOLUTION) |
| 547 high_res_range = TilingRange(i, i + 1); | 556 high_res_range = TilingRange(i, i + 1); |
| 548 if (tiling->resolution() == LOW_RESOLUTION) | 557 if (tiling->resolution() == LOW_RESOLUTION) |
| 549 low_res_range = TilingRange(i, i + 1); | 558 low_res_range = TilingRange(i, i + 1); |
| 550 } | 559 } |
| 551 | 560 |
| 552 TilingRange range(0, 0); | 561 TilingRange range(0, 0); |
| 553 switch (type) { | 562 switch (type) { |
| 554 case HIGHER_THAN_HIGH_RES: | 563 case HIGHER_THAN_HIGH_RES: |
| 555 range = TilingRange(0, high_res_range.start); | 564 range = TilingRange(0, high_res_range.start); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 575 case LOWER_THAN_LOW_RES: | 584 case LOWER_THAN_LOW_RES: |
| 576 range = TilingRange(low_res_range.end, tilings_size); | 585 range = TilingRange(low_res_range.end, tilings_size); |
| 577 break; | 586 break; |
| 578 } | 587 } |
| 579 | 588 |
| 580 DCHECK_LE(range.start, range.end); | 589 DCHECK_LE(range.start, range.end); |
| 581 return range; | 590 return range; |
| 582 } | 591 } |
| 583 | 592 |
| 584 } // namespace cc | 593 } // namespace cc |
| OLD | NEW |