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

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

Issue 822713002: Update from https://crrev.com/309415 (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 6 years 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/resources/picture_layer_tiling_set.h" 5 #include "cc/resources/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
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
47 skewport_target_time_in_seconds_(skewport_target_time_in_seconds), 47 skewport_target_time_in_seconds_(skewport_target_time_in_seconds),
48 skewport_extrapolation_limit_in_content_pixels_( 48 skewport_extrapolation_limit_in_content_pixels_(
49 skewport_extrapolation_limit_in_content_pixels), 49 skewport_extrapolation_limit_in_content_pixels),
50 client_(client) { 50 client_(client) {
51 } 51 }
52 52
53 PictureLayerTilingSet::~PictureLayerTilingSet() { 53 PictureLayerTilingSet::~PictureLayerTilingSet() {
54 } 54 }
55 55
56 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSource( 56 void PictureLayerTilingSet::UpdateTilingsToCurrentRasterSource(
57 RasterSource* raster_source, 57 scoped_refptr<RasterSource> raster_source,
58 const PictureLayerTilingSet* twin_set, 58 const PictureLayerTilingSet* twin_set,
59 const Region& layer_invalidation, 59 const Region& layer_invalidation,
60 float minimum_contents_scale) { 60 float minimum_contents_scale,
61 float maximum_contents_scale) {
61 RemoveTilingsBelowScale(minimum_contents_scale); 62 RemoveTilingsBelowScale(minimum_contents_scale);
62 63 RemoveTilingsAboveScale(maximum_contents_scale);
63 gfx::Size layer_bounds = raster_source->GetSize();
64 64
65 // Copy over tilings that are shared with the |twin_set| tiling set (if it 65 // Copy over tilings that are shared with the |twin_set| tiling set (if it
66 // exists). 66 // exists).
67 if (twin_set) { 67 if (twin_set) {
68 for (PictureLayerTiling* twin_tiling : twin_set->tilings_) { 68 for (PictureLayerTiling* twin_tiling : twin_set->tilings_) {
69 float contents_scale = twin_tiling->contents_scale(); 69 float contents_scale = twin_tiling->contents_scale();
70 DCHECK_GE(contents_scale, minimum_contents_scale); 70 DCHECK_GE(contents_scale, minimum_contents_scale);
71 DCHECK_LE(contents_scale, maximum_contents_scale);
71 72
72 PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale); 73 PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale);
73 if (!this_tiling) { 74 if (!this_tiling) {
74 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create( 75 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create(
75 contents_scale, layer_bounds, client_, max_tiles_for_interest_area_, 76 contents_scale, raster_source, client_,
76 skewport_target_time_in_seconds_, 77 max_tiles_for_interest_area_, skewport_target_time_in_seconds_,
77 skewport_extrapolation_limit_in_content_pixels_); 78 skewport_extrapolation_limit_in_content_pixels_);
78 tilings_.push_back(new_tiling.Pass()); 79 tilings_.push_back(new_tiling.Pass());
79 this_tiling = tilings_.back(); 80 this_tiling = tilings_.back();
80 } 81 }
81 this_tiling->CloneTilesAndPropertiesFrom(*twin_tiling); 82 this_tiling->CloneTilesAndPropertiesFrom(*twin_tiling);
82 } 83 }
83 } 84 }
84 85
85 // For unshared tilings, invalidate tiles and update them to the new raster 86 // For unshared tilings, invalidate tiles and update them to the new raster
86 // source. 87 // source.
87 for (PictureLayerTiling* tiling : tilings_) { 88 for (PictureLayerTiling* tiling : tilings_) {
88 if (twin_set && twin_set->FindTilingWithScale(tiling->contents_scale())) 89 if (twin_set && twin_set->FindTilingWithScale(tiling->contents_scale()))
89 continue; 90 continue;
90 91
91 tiling->Resize(layer_bounds); 92 tiling->SetRasterSourceAndResize(raster_source);
92 tiling->Invalidate(layer_invalidation); 93 tiling->Invalidate(layer_invalidation);
93 tiling->SetRasterSource(raster_source); 94 tiling->SetRasterSourceOnTiles();
94 // This is needed for cases where the live tiles rect didn't change but 95 // This is needed for cases where the live tiles rect didn't change but
95 // recordings exist in the raster source that did not exist on the last 96 // recordings exist in the raster source that did not exist on the last
96 // raster source. 97 // raster source.
97 tiling->CreateMissingTilesInLiveTilesRect(); 98 tiling->CreateMissingTilesInLiveTilesRect();
98 99
99 // If |twin_set| is present, use the resolutions from there. Otherwise leave 100 // If |twin_set| is present, use the resolutions from there. Otherwise leave
100 // all resolutions as they are. 101 // all resolutions as they are.
101 if (twin_set) 102 if (twin_set)
102 tiling->set_resolution(NON_IDEAL_RESOLUTION); 103 tiling->set_resolution(NON_IDEAL_RESOLUTION);
103 } 104 }
104 105
105 tilings_.sort(LargestToSmallestScaleFunctor()); 106 tilings_.sort(LargestToSmallestScaleFunctor());
106 107
107 #if DCHECK_IS_ON 108 #if DCHECK_IS_ON
108 for (PictureLayerTiling* tiling : tilings_) { 109 for (PictureLayerTiling* tiling : tilings_) {
109 DCHECK(tiling->tile_size() == 110 DCHECK(tiling->tile_size() ==
110 client_->CalculateTileSize(tiling->tiling_size())) 111 client_->CalculateTileSize(tiling->tiling_size()))
111 << "tile_size: " << tiling->tile_size().ToString() 112 << "tile_size: " << tiling->tile_size().ToString()
112 << " tiling_size: " << tiling->tiling_size().ToString() 113 << " tiling_size: " << tiling->tiling_size().ToString()
113 << " CalculateTileSize: " 114 << " CalculateTileSize: "
114 << client_->CalculateTileSize(tiling->tiling_size()).ToString(); 115 << client_->CalculateTileSize(tiling->tiling_size()).ToString();
115 } 116 }
116 117
117 if (!tilings_.empty()) { 118 if (!tilings_.empty()) {
118 size_t num_high_res = std::count_if(tilings_.begin(), tilings_.end(), 119 size_t num_high_res = std::count_if(tilings_.begin(), tilings_.end(),
119 [](PictureLayerTiling* tiling) { 120 [](PictureLayerTiling* tiling) {
120 return tiling->resolution() == HIGH_RESOLUTION; 121 return tiling->resolution() == HIGH_RESOLUTION;
121 }); 122 });
122 DCHECK_EQ(1u, num_high_res); 123 DCHECK_LE(num_high_res, 1u);
124 // When commiting from the main thread the high res tiling may get dropped,
125 // but when cloning to the active tree, there should always be one.
126 if (twin_set)
127 DCHECK_EQ(1u, num_high_res);
123 } 128 }
124 #endif 129 #endif
125 } 130 }
126 131
127 void PictureLayerTilingSet::CleanUpTilings( 132 void PictureLayerTilingSet::CleanUpTilings(
128 float min_acceptable_high_res_scale, 133 float min_acceptable_high_res_scale,
129 float max_acceptable_high_res_scale, 134 float max_acceptable_high_res_scale,
130 const std::vector<PictureLayerTiling*>& needed_tilings, 135 const std::vector<PictureLayerTiling*>& needed_tilings,
131 bool should_have_low_res, 136 bool should_have_low_res,
132 PictureLayerTilingSet* twin_set, 137 PictureLayerTilingSet* twin_set,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 return t->resolution() == NON_IDEAL_RESOLUTION; 188 return t->resolution() == NON_IDEAL_RESOLUTION;
184 }); 189 });
185 tilings_.erase(to_remove, tilings_.end()); 190 tilings_.erase(to_remove, tilings_.end());
186 } 191 }
187 192
188 void PictureLayerTilingSet::MarkAllTilingsNonIdeal() { 193 void PictureLayerTilingSet::MarkAllTilingsNonIdeal() {
189 for (auto* tiling : tilings_) 194 for (auto* tiling : tilings_)
190 tiling->set_resolution(NON_IDEAL_RESOLUTION); 195 tiling->set_resolution(NON_IDEAL_RESOLUTION);
191 } 196 }
192 197
193 bool PictureLayerTilingSet::SyncTilingsForTesting(
194 const PictureLayerTilingSet& other,
195 const gfx::Size& new_layer_bounds,
196 const Region& layer_invalidation,
197 float minimum_contents_scale,
198 RasterSource* raster_source) {
199 if (new_layer_bounds.IsEmpty()) {
200 RemoveAllTilings();
201 return false;
202 }
203
204 tilings_.reserve(other.tilings_.size());
205
206 // Remove any tilings that aren't in |other| or don't meet the minimum.
207 for (size_t i = 0; i < tilings_.size(); ++i) {
208 float scale = tilings_[i]->contents_scale();
209 if (scale >= minimum_contents_scale && !!other.FindTilingWithScale(scale))
210 continue;
211 // Swap with the last element and remove it.
212 tilings_.swap(tilings_.begin() + i, tilings_.end() - 1);
213 tilings_.pop_back();
214 --i;
215 }
216
217 bool have_high_res_tiling = false;
218
219 // Add any missing tilings from |other| that meet the minimum.
220 for (size_t i = 0; i < other.tilings_.size(); ++i) {
221 float contents_scale = other.tilings_[i]->contents_scale();
222 if (contents_scale < minimum_contents_scale)
223 continue;
224 if (PictureLayerTiling* this_tiling = FindTilingWithScale(contents_scale)) {
225 this_tiling->set_resolution(other.tilings_[i]->resolution());
226
227 this_tiling->Resize(new_layer_bounds);
228 this_tiling->Invalidate(layer_invalidation);
229 this_tiling->SetRasterSource(raster_source);
230 this_tiling->CreateMissingTilesInLiveTilesRect();
231 if (this_tiling->resolution() == HIGH_RESOLUTION)
232 have_high_res_tiling = true;
233
234 DCHECK(this_tiling->tile_size() ==
235 client_->CalculateTileSize(this_tiling->tiling_size()))
236 << "tile_size: " << this_tiling->tile_size().ToString()
237 << " tiling_size: " << this_tiling->tiling_size().ToString()
238 << " CalculateTileSize: "
239 << client_->CalculateTileSize(this_tiling->tiling_size()).ToString();
240 continue;
241 }
242 scoped_ptr<PictureLayerTiling> new_tiling = PictureLayerTiling::Create(
243 contents_scale, new_layer_bounds, client_, max_tiles_for_interest_area_,
244 skewport_target_time_in_seconds_,
245 skewport_extrapolation_limit_in_content_pixels_);
246 new_tiling->set_resolution(other.tilings_[i]->resolution());
247 if (new_tiling->resolution() == HIGH_RESOLUTION)
248 have_high_res_tiling = true;
249 tilings_.push_back(new_tiling.Pass());
250 }
251 tilings_.sort(LargestToSmallestScaleFunctor());
252
253 return have_high_res_tiling;
254 }
255
256 PictureLayerTiling* PictureLayerTilingSet::AddTiling( 198 PictureLayerTiling* PictureLayerTilingSet::AddTiling(
257 float contents_scale, 199 float contents_scale,
258 const gfx::Size& layer_bounds) { 200 scoped_refptr<RasterSource> raster_source) {
259 for (size_t i = 0; i < tilings_.size(); ++i) 201 for (size_t i = 0; i < tilings_.size(); ++i) {
260 DCHECK_NE(tilings_[i]->contents_scale(), contents_scale); 202 DCHECK_NE(tilings_[i]->contents_scale(), contents_scale);
203 DCHECK_EQ(tilings_[i]->raster_source(), raster_source.get());
204 }
261 205
262 tilings_.push_back(PictureLayerTiling::Create( 206 tilings_.push_back(PictureLayerTiling::Create(
263 contents_scale, layer_bounds, client_, max_tiles_for_interest_area_, 207 contents_scale, raster_source, client_, max_tiles_for_interest_area_,
264 skewport_target_time_in_seconds_, 208 skewport_target_time_in_seconds_,
265 skewport_extrapolation_limit_in_content_pixels_)); 209 skewport_extrapolation_limit_in_content_pixels_));
266 PictureLayerTiling* appended = tilings_.back(); 210 PictureLayerTiling* appended = tilings_.back();
267 211
268 tilings_.sort(LargestToSmallestScaleFunctor()); 212 tilings_.sort(LargestToSmallestScaleFunctor());
269 return appended; 213 return appended;
270 } 214 }
271 215
272 int PictureLayerTilingSet::NumHighResTilings() const { 216 int PictureLayerTilingSet::NumHighResTilings() const {
273 int num_high_res = 0; 217 int num_high_res = 0;
(...skipping 25 matching lines...) Expand all
299 } 243 }
300 244
301 void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) { 245 void PictureLayerTilingSet::RemoveTilingsBelowScale(float minimum_scale) {
302 auto to_remove = 246 auto to_remove =
303 tilings_.remove_if([minimum_scale](PictureLayerTiling* tiling) { 247 tilings_.remove_if([minimum_scale](PictureLayerTiling* tiling) {
304 return tiling->contents_scale() < minimum_scale; 248 return tiling->contents_scale() < minimum_scale;
305 }); 249 });
306 tilings_.erase(to_remove, tilings_.end()); 250 tilings_.erase(to_remove, tilings_.end());
307 } 251 }
308 252
253 void PictureLayerTilingSet::RemoveTilingsAboveScale(float maximum_scale) {
254 auto to_remove =
255 tilings_.remove_if([maximum_scale](PictureLayerTiling* tiling) {
256 return tiling->contents_scale() > maximum_scale;
257 });
258 tilings_.erase(to_remove, tilings_.end());
259 }
260
309 void PictureLayerTilingSet::RemoveAllTilings() { 261 void PictureLayerTilingSet::RemoveAllTilings() {
310 tilings_.clear(); 262 tilings_.clear();
311 } 263 }
312 264
313 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) { 265 void PictureLayerTilingSet::Remove(PictureLayerTiling* tiling) {
314 ScopedPtrVector<PictureLayerTiling>::iterator iter = 266 ScopedPtrVector<PictureLayerTiling>::iterator iter =
315 std::find(tilings_.begin(), tilings_.end(), tiling); 267 std::find(tilings_.begin(), tilings_.end(), tiling);
316 if (iter == tilings_.end()) 268 if (iter == tilings_.end())
317 return; 269 return;
318 tilings_.erase(iter); 270 tilings_.erase(iter);
(...skipping 27 matching lines...) Expand all
346 // The first tiling has the largest contents scale. 298 // The first tiling has the largest contents scale.
347 return tilings_[0]->contents_scale(); 299 return tilings_[0]->contents_scale();
348 } 300 }
349 301
350 bool PictureLayerTilingSet::UpdateTilePriorities( 302 bool PictureLayerTilingSet::UpdateTilePriorities(
351 const gfx::Rect& required_rect_in_layer_space, 303 const gfx::Rect& required_rect_in_layer_space,
352 float ideal_contents_scale, 304 float ideal_contents_scale,
353 double current_frame_time_in_seconds, 305 double current_frame_time_in_seconds,
354 const Occlusion& occlusion_in_layer_space, 306 const Occlusion& occlusion_in_layer_space,
355 bool can_require_tiles_for_activation) { 307 bool can_require_tiles_for_activation) {
356 bool tiling_needs_update = false; 308 bool updated = false;
357 // TODO(vmpstr): Check if we have to early out here, or if we can just do it
358 // as part of computing tile priority rects for tilings.
359 for (auto* tiling : tilings_) {
360 if (tiling->NeedsUpdateForFrameAtTimeAndViewport(
361 current_frame_time_in_seconds, required_rect_in_layer_space)) {
362 tiling_needs_update = true;
363 break;
364 }
365 }
366 if (!tiling_needs_update)
367 return false;
368
369 for (auto* tiling : tilings_) { 309 for (auto* tiling : tilings_) {
370 tiling->set_can_require_tiles_for_activation( 310 tiling->set_can_require_tiles_for_activation(
371 can_require_tiles_for_activation); 311 can_require_tiles_for_activation);
372 tiling->ComputeTilePriorityRects( 312 updated |= tiling->ComputeTilePriorityRects(
373 required_rect_in_layer_space, ideal_contents_scale, 313 required_rect_in_layer_space, ideal_contents_scale,
374 current_frame_time_in_seconds, occlusion_in_layer_space); 314 current_frame_time_in_seconds, occlusion_in_layer_space);
375 } 315 }
376 return true; 316 return updated;
377 } 317 }
378 318
379 void PictureLayerTilingSet::GetAllTilesForTracing( 319 void PictureLayerTilingSet::GetAllTilesForTracing(
380 std::set<const Tile*>* tiles) const { 320 std::set<const Tile*>* tiles) const {
381 for (auto* tiling : tilings_) 321 for (auto* tiling : tilings_)
382 tiling->GetAllTilesForTracing(tiles); 322 tiling->GetAllTilesForTracing(tiles);
383 } 323 }
384 324
385 PictureLayerTilingSet::CoverageIterator::CoverageIterator( 325 PictureLayerTilingSet::CoverageIterator::CoverageIterator(
386 const PictureLayerTilingSet* set, 326 const PictureLayerTilingSet* set,
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 case LOWER_THAN_LOW_RES: 542 case LOWER_THAN_LOW_RES:
603 range = TilingRange(low_res_range.end, tilings_.size()); 543 range = TilingRange(low_res_range.end, tilings_.size());
604 break; 544 break;
605 } 545 }
606 546
607 DCHECK_LE(range.start, range.end); 547 DCHECK_LE(range.start, range.end);
608 return range; 548 return range;
609 } 549 }
610 550
611 } // namespace cc 551 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698