Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(376)

Side by Side Diff: cc/tiles/picture_layer_tiling_set.cc

Issue 2175553002: Raster PictureLayerTiling with fractional translation (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: clean up Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 <stddef.h> 7 #include <stddef.h>
8 8
9 #include <limits> 9 #include <limits>
10 #include <set> 10 #include <set>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/memory/ptr_util.h" 13 #include "base/memory/ptr_util.h"
14 #include "cc/playback/raster_source.h" 14 #include "cc/playback/raster_source.h"
15 #include "ui/gfx/geometry/rect_conversions.h" 15 #include "ui/gfx/geometry/rect_conversions.h"
16 16
17 namespace cc { 17 namespace cc {
18 18
19 namespace { 19 namespace {
20 20
21 class LargestToSmallestScaleFunctor { 21 class LargestToSmallestScaleFunctor {
22 public: 22 public:
23 bool operator()(const std::unique_ptr<PictureLayerTiling>& left, 23 bool operator()(const std::unique_ptr<PictureLayerTiling>& left,
24 const std::unique_ptr<PictureLayerTiling>& right) { 24 const std::unique_ptr<PictureLayerTiling>& right) {
25 return left->contents_scale() > right->contents_scale(); 25 return left->contents_transform().pre_scale() >
26 right->contents_transform().pre_scale();
26 } 27 }
27 }; 28 };
28 29
29 inline float LargerRatio(float float1, float float2) { 30 inline float LargerRatio(float float1, float float2) {
30 DCHECK_GT(float1, 0.f); 31 DCHECK_GT(float1, 0.f);
31 DCHECK_GT(float2, 0.f); 32 DCHECK_GT(float2, 0.f);
32 return float1 > float2 ? float1 / float2 : float2 / float1; 33 return float1 > float2 ? float1 / float2 : float2 / float1;
33 } 34 }
34 35
35 const float kSoonBorderDistanceViewportPercentage = 0.15f; 36 const float kSoonBorderDistanceViewportPercentage = 0.15f;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 if (pending_twin_set->tilings_.empty()) { 74 if (pending_twin_set->tilings_.empty()) {
74 // If the twin (pending) tiling set is empty, it was not updated for the 75 // If the twin (pending) tiling set is empty, it was not updated for the
75 // current frame. So we drop tilings from our set as well, instead of 76 // current frame. So we drop tilings from our set as well, instead of
76 // leaving behind unshared tilings that are all non-ideal. 77 // leaving behind unshared tilings that are all non-ideal.
77 RemoveAllTilings(); 78 RemoveAllTilings();
78 return; 79 return;
79 } 80 }
80 81
81 bool tiling_sort_required = false; 82 bool tiling_sort_required = false;
82 for (const auto& pending_twin_tiling : pending_twin_set->tilings_) { 83 for (const auto& pending_twin_tiling : pending_twin_set->tilings_) {
83 float contents_scale = pending_twin_tiling->contents_scale(); 84 ScaleTranslate2d contents_transform =
84 PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale); 85 pending_twin_tiling->contents_transform();
86 PictureLayerTiling* this_tiling =
87 FindTilingWithScale(contents_transform.pre_scale());
88 if (this_tiling &&
89 this_tiling->contents_transform() != contents_transform) {
90 Remove(this_tiling);
91 this_tiling = nullptr;
92 }
85 if (!this_tiling) { 93 if (!this_tiling) {
86 std::unique_ptr<PictureLayerTiling> new_tiling(new PictureLayerTiling( 94 std::unique_ptr<PictureLayerTiling> new_tiling(new PictureLayerTiling(
87 tree_, contents_scale, raster_source_, client_)); 95 tree_, contents_transform, raster_source_, client_));
88 tilings_.push_back(std::move(new_tiling)); 96 tilings_.push_back(std::move(new_tiling));
89 this_tiling = tilings_.back().get(); 97 this_tiling = tilings_.back().get();
90 tiling_sort_required = true; 98 tiling_sort_required = true;
91 state_since_last_tile_priority_update_.added_tilings = true; 99 state_since_last_tile_priority_update_.added_tilings = true;
92 } 100 }
93 this_tiling->TakeTilesAndPropertiesFrom(pending_twin_tiling.get(), 101 this_tiling->TakeTilesAndPropertiesFrom(pending_twin_tiling.get(),
94 layer_invalidation); 102 layer_invalidation);
95 } 103 }
96 104
97 if (tiling_sort_required) { 105 if (tiling_sort_required) {
(...skipping 14 matching lines...) Expand all
112 raster_source_ = raster_source; 120 raster_source_ = raster_source;
113 121
114 // Copy over tilings that are shared with the |pending_twin_set| tiling set. 122 // Copy over tilings that are shared with the |pending_twin_set| tiling set.
115 // Also, copy all of the properties from twin tilings. 123 // Also, copy all of the properties from twin tilings.
116 CopyTilingsAndPropertiesFromPendingTwin(pending_twin_set, raster_source, 124 CopyTilingsAndPropertiesFromPendingTwin(pending_twin_set, raster_source,
117 layer_invalidation); 125 layer_invalidation);
118 126
119 // If the tiling is not shared (FindTilingWithScale returns nullptr), then 127 // If the tiling is not shared (FindTilingWithScale returns nullptr), then
120 // invalidate tiles and update them to the new raster source. 128 // invalidate tiles and update them to the new raster source.
121 for (const auto& tiling : tilings_) { 129 for (const auto& tiling : tilings_) {
122 if (pending_twin_set->FindTilingWithScale(tiling->contents_scale())) 130 if (pending_twin_set->FindTilingWithScale(
131 tiling->contents_transform().pre_scale()))
123 continue; 132 continue;
124 133
125 tiling->SetRasterSourceAndResize(raster_source); 134 tiling->SetRasterSourceAndResize(raster_source);
126 tiling->Invalidate(layer_invalidation); 135 tiling->Invalidate(layer_invalidation);
127 state_since_last_tile_priority_update_.invalidated = true; 136 state_since_last_tile_priority_update_.invalidated = true;
128 // This is needed for cases where the live tiles rect didn't change but 137 // This is needed for cases where the live tiles rect didn't change but
129 // recordings exist in the raster source that did not exist on the last 138 // recordings exist in the raster source that did not exist on the last
130 // raster source. 139 // raster source.
131 tiling->CreateMissingTilesInLiveTilesRect(); 140 tiling->CreateMissingTilesInLiveTilesRect();
132 141
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 } 224 }
216 225
217 void PictureLayerTilingSet::CleanUpTilings( 226 void PictureLayerTilingSet::CleanUpTilings(
218 float min_acceptable_high_res_scale, 227 float min_acceptable_high_res_scale,
219 float max_acceptable_high_res_scale, 228 float max_acceptable_high_res_scale,
220 const std::vector<PictureLayerTiling*>& needed_tilings, 229 const std::vector<PictureLayerTiling*>& needed_tilings,
221 PictureLayerTilingSet* twin_set) { 230 PictureLayerTilingSet* twin_set) {
222 std::vector<PictureLayerTiling*> to_remove; 231 std::vector<PictureLayerTiling*> to_remove;
223 for (const auto& tiling : tilings_) { 232 for (const auto& tiling : tilings_) {
224 // Keep all tilings within the min/max scales. 233 // Keep all tilings within the min/max scales.
225 if (tiling->contents_scale() >= min_acceptable_high_res_scale && 234 if (tiling->contents_transform().pre_scale() >=
226 tiling->contents_scale() <= max_acceptable_high_res_scale) { 235 min_acceptable_high_res_scale &&
236 tiling->contents_transform().pre_scale() <=
237 max_acceptable_high_res_scale) {
227 continue; 238 continue;
228 } 239 }
229 240
230 // Keep low resolution tilings. 241 // Keep low resolution tilings.
231 if (tiling->resolution() == LOW_RESOLUTION) 242 if (tiling->resolution() == LOW_RESOLUTION)
232 continue; 243 continue;
233 244
234 // Don't remove tilings that are required. 245 // Don't remove tilings that are required.
235 if (std::find(needed_tilings.begin(), needed_tilings.end(), tiling.get()) != 246 if (std::find(needed_tilings.begin(), needed_tilings.end(), tiling.get()) !=
236 needed_tilings.end()) { 247 needed_tilings.end()) {
(...skipping 17 matching lines...) Expand all
254 }); 265 });
255 tilings_.erase(to_remove, tilings_.end()); 266 tilings_.erase(to_remove, tilings_.end());
256 } 267 }
257 268
258 void PictureLayerTilingSet::MarkAllTilingsNonIdeal() { 269 void PictureLayerTilingSet::MarkAllTilingsNonIdeal() {
259 for (const auto& tiling : tilings_) 270 for (const auto& tiling : tilings_)
260 tiling->set_resolution(NON_IDEAL_RESOLUTION); 271 tiling->set_resolution(NON_IDEAL_RESOLUTION);
261 } 272 }
262 273
263 PictureLayerTiling* PictureLayerTilingSet::AddTiling( 274 PictureLayerTiling* PictureLayerTilingSet::AddTiling(
264 float contents_scale, 275 const ScaleTranslate2d& contents_transform,
265 scoped_refptr<RasterSource> raster_source) { 276 scoped_refptr<RasterSource> raster_source) {
266 if (!raster_source_) 277 if (!raster_source_)
267 raster_source_ = raster_source; 278 raster_source_ = raster_source;
268 279
269 for (size_t i = 0; i < tilings_.size(); ++i) { 280 for (size_t i = 0; i < tilings_.size(); ++i) {
270 DCHECK_NE(tilings_[i]->contents_scale(), contents_scale); 281 DCHECK_NE(tilings_[i]->contents_transform().pre_scale(),
282 contents_transform.pre_scale());
271 DCHECK_EQ(tilings_[i]->raster_source(), raster_source.get()); 283 DCHECK_EQ(tilings_[i]->raster_source(), raster_source.get());
272 } 284 }
273 285
274 tilings_.push_back(base::MakeUnique<PictureLayerTiling>( 286 tilings_.push_back(base::MakeUnique<PictureLayerTiling>(
275 tree_, contents_scale, raster_source, client_)); 287 tree_, contents_transform, raster_source, client_));
276 PictureLayerTiling* appended = tilings_.back().get(); 288 PictureLayerTiling* appended = tilings_.back().get();
277 state_since_last_tile_priority_update_.added_tilings = true; 289 state_since_last_tile_priority_update_.added_tilings = true;
278 290
279 std::sort(tilings_.begin(), tilings_.end(), LargestToSmallestScaleFunctor()); 291 std::sort(tilings_.begin(), tilings_.end(), LargestToSmallestScaleFunctor());
280 return appended; 292 return appended;
281 } 293 }
282 294
283 int PictureLayerTilingSet::NumHighResTilings() const { 295 int PictureLayerTilingSet::NumHighResTilings() const {
284 return std::count_if(tilings_.begin(), tilings_.end(), 296 return std::count_if(tilings_.begin(), tilings_.end(),
285 [](const std::unique_ptr<PictureLayerTiling>& tiling) { 297 [](const std::unique_ptr<PictureLayerTiling>& tiling) {
286 return tiling->resolution() == HIGH_RESOLUTION; 298 return tiling->resolution() == HIGH_RESOLUTION;
287 }); 299 });
288 } 300 }
289 301
290 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithScale( 302 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithScale(
291 float scale) const { 303 float scale) const {
292 for (size_t i = 0; i < tilings_.size(); ++i) { 304 for (size_t i = 0; i < tilings_.size(); ++i) {
293 if (tilings_[i]->contents_scale() == scale) 305 if (tilings_[i]->contents_transform().pre_scale() == scale)
294 return tilings_[i].get(); 306 return tilings_[i].get();
295 } 307 }
296 return nullptr; 308 return nullptr;
297 } 309 }
298 310
299 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithResolution( 311 PictureLayerTiling* PictureLayerTilingSet::FindTilingWithResolution(
300 TileResolution resolution) const { 312 TileResolution resolution) const {
301 auto iter = std::find_if( 313 auto iter = std::find_if(
302 tilings_.begin(), tilings_.end(), 314 tilings_.begin(), tilings_.end(),
303 [resolution](const std::unique_ptr<PictureLayerTiling>& tiling) { 315 [resolution](const std::unique_ptr<PictureLayerTiling>& tiling) {
304 return tiling->resolution() == resolution; 316 return tiling->resolution() == resolution;
305 }); 317 });
306 if (iter == tilings_.end()) 318 if (iter == tilings_.end())
307 return nullptr; 319 return nullptr;
308 return iter->get(); 320 return iter->get();
309 } 321 }
310 322
311 void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) { 323 void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) {
312 auto to_remove = std::remove_if( 324 auto to_remove = std::remove_if(
313 tilings_.begin(), tilings_.end(), 325 tilings_.begin(), tilings_.end(),
314 [minimum_scale](const std::unique_ptr<PictureLayerTiling>& tiling) { 326 [minimum_scale](const std::unique_ptr<PictureLayerTiling>& tiling) {
315 return tiling->contents_scale() < minimum_scale; 327 return tiling->contents_transform().pre_scale() < minimum_scale;
316 }); 328 });
317 tilings_.erase(to_remove, tilings_.end()); 329 tilings_.erase(to_remove, tilings_.end());
318 } 330 }
319 331
320 void PictureLayerTilingSet::RemoveTilingsAboveScale(float maximum_scale) { 332 void PictureLayerTilingSet::RemoveTilingsAboveScale(float maximum_scale) {
321 auto to_remove = std::remove_if( 333 auto to_remove = std::remove_if(
322 tilings_.begin(), tilings_.end(), 334 tilings_.begin(), tilings_.end(),
323 [maximum_scale](const std::unique_ptr<PictureLayerTiling>& tiling) { 335 [maximum_scale](const std::unique_ptr<PictureLayerTiling>& tiling) {
324 return tiling->contents_scale() > maximum_scale; 336 return tiling->contents_transform().pre_scale() > maximum_scale;
325 }); 337 });
326 tilings_.erase(to_remove, tilings_.end()); 338 tilings_.erase(to_remove, tilings_.end());
327 } 339 }
328 340
329 void PictureLayerTilingSet::RemoveAllTilings() { 341 void PictureLayerTilingSet::RemoveAllTilings() {
330 tilings_.clear(); 342 tilings_.clear();
331 } 343 }
332 344
333 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { 345 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) {
334 auto iter = std::find_if( 346 auto iter = std::find_if(
(...skipping 11 matching lines...) Expand all
346 tilings_[i]->Reset(); 358 tilings_[i]->Reset();
347 } 359 }
348 360
349 float PictureLayerTilingSet::GetSnappedContentsScale( 361 float PictureLayerTilingSet::GetSnappedContentsScale(
350 float start_scale, 362 float start_scale,
351 float snap_to_existing_tiling_ratio) const { 363 float snap_to_existing_tiling_ratio) const {
352 // If a tiling exists within the max snapping ratio, snap to its scale. 364 // If a tiling exists within the max snapping ratio, snap to its scale.
353 float snapped_contents_scale = start_scale; 365 float snapped_contents_scale = start_scale;
354 float snapped_ratio = snap_to_existing_tiling_ratio; 366 float snapped_ratio = snap_to_existing_tiling_ratio;
355 for (const auto& tiling : tilings_) { 367 for (const auto& tiling : tilings_) {
356 float tiling_contents_scale = tiling->contents_scale(); 368 float tiling_contents_scale = tiling->contents_transform().pre_scale();
357 float ratio = LargerRatio(tiling_contents_scale, start_scale); 369 float ratio = LargerRatio(tiling_contents_scale, start_scale);
358 if (ratio < snapped_ratio) { 370 if (ratio < snapped_ratio) {
359 snapped_contents_scale = tiling_contents_scale; 371 snapped_contents_scale = tiling_contents_scale;
360 snapped_ratio = ratio; 372 snapped_ratio = ratio;
361 } 373 }
362 } 374 }
363 return snapped_contents_scale; 375 return snapped_contents_scale;
364 } 376 }
365 377
366 float PictureLayerTilingSet::GetMaximumContentsScale() const { 378 float PictureLayerTilingSet::GetMaximumContentsScale() const {
367 if (tilings_.empty()) 379 if (tilings_.empty())
368 return 0.f; 380 return 0.f;
369 // The first tiling has the largest contents scale. 381 // The first tiling has the largest contents scale.
370 return tilings_[0]->contents_scale(); 382 return tilings_[0]->contents_transform().pre_scale();
371 } 383 }
372 384
373 bool PictureLayerTilingSet::TilingsNeedUpdate( 385 bool PictureLayerTilingSet::TilingsNeedUpdate(
374 const gfx::Rect& visible_rect_in_layer_space, 386 const gfx::Rect& visible_rect_in_layer_space,
375 double current_frame_time_in_seconds) { 387 double current_frame_time_in_seconds) {
376 // If we don't have any tilings, we don't need an update. 388 // If we don't have any tilings, we don't need an update.
377 if (num_tilings() == 0) 389 if (num_tilings() == 0)
378 return false; 390 return false;
379 391
380 // If we never updated the tiling set, then our history is empty. We should 392 // If we never updated the tiling set, then our history is empty. We should
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
547 float ideal_contents_scale) 559 float ideal_contents_scale)
548 : set_(set), 560 : set_(set),
549 contents_scale_(contents_scale), 561 contents_scale_(contents_scale),
550 ideal_contents_scale_(ideal_contents_scale), 562 ideal_contents_scale_(ideal_contents_scale),
551 current_tiling_(std::numeric_limits<size_t>::max()) { 563 current_tiling_(std::numeric_limits<size_t>::max()) {
552 missing_region_.Union(content_rect); 564 missing_region_.Union(content_rect);
553 565
554 size_t tilings_size = set_->tilings_.size(); 566 size_t tilings_size = set_->tilings_.size();
555 for (ideal_tiling_ = 0; ideal_tiling_ < tilings_size; ++ideal_tiling_) { 567 for (ideal_tiling_ = 0; ideal_tiling_ < tilings_size; ++ideal_tiling_) {
556 PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_].get(); 568 PictureLayerTiling* tiling = set_->tilings_[ideal_tiling_].get();
557 if (tiling->contents_scale() < ideal_contents_scale_) { 569 if (tiling->contents_transform().pre_scale() < ideal_contents_scale_) {
558 if (ideal_tiling_ > 0) 570 if (ideal_tiling_ > 0)
559 ideal_tiling_--; 571 ideal_tiling_--;
560 break; 572 break;
561 } 573 }
562 } 574 }
563 575
564 if (ideal_tiling_ == tilings_size && ideal_tiling_ > 0) 576 if (ideal_tiling_ == tilings_size && ideal_tiling_ > 0)
565 ideal_tiling_--; 577 ideal_tiling_--;
566 578
567 ++(*this); 579 ++(*this);
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 case LOWER_THAN_LOW_RES: 760 case LOWER_THAN_LOW_RES:
749 range = TilingRange(low_res_range.end, tilings_size); 761 range = TilingRange(low_res_range.end, tilings_size);
750 break; 762 break;
751 } 763 }
752 764
753 DCHECK_LE(range.start, range.end); 765 DCHECK_LE(range.start, range.end);
754 return range; 766 return range;
755 } 767 }
756 768
757 } // namespace cc 769 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698