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

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

Issue 1051993002: cc: Remove tile sharing from tilings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: update Created 5 years, 8 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 <utility> 5 #include <utility>
6 6
7 #include "cc/resources/tiling_set_eviction_queue.h" 7 #include "cc/resources/tiling_set_eviction_queue.h"
8 8
9 namespace cc { 9 namespace cc {
10 namespace { 10 namespace {
11 11
12 bool IsSharedOutOfOrderTile(WhichTree tree, const Tile* tile) { 12 bool IsSharedOutOfOrderTile(WhichTree tree, const Tile* tile) {
13 if (!tile->is_shared()) 13 // TODO(vmpstr): Clean up is_shared usage.
14 return false; 14 DCHECK(!tile->is_shared());
15 15 return false;
16 // The priority for tile priority of a shared tile will be a combined
17 // priority thus return shared tiles from a higher priority tree as
18 // it is out of order for a lower priority tree.
19 WhichTree twin_tree = tree == ACTIVE_TREE ? PENDING_TREE : ACTIVE_TREE;
20 const TilePriority& priority = tile->priority(tree);
21 const TilePriority& twin_priority = tile->priority(twin_tree);
22 if (priority.priority_bin != twin_priority.priority_bin)
23 return priority.priority_bin > twin_priority.priority_bin;
24 const bool occluded = tile->is_occluded(tree);
25 const bool twin_occluded = tile->is_occluded(twin_tree);
26 if (occluded != twin_occluded)
27 return occluded;
28 if (priority.distance_to_visible != twin_priority.distance_to_visible)
29 return priority.distance_to_visible > twin_priority.distance_to_visible;
30
31 // If priorities are the same, it does not matter which tree returns
32 // the tile. Let's pick the pending tree.
33 return tree != PENDING_TREE;
34 } 16 }
35 17
36 } // namespace 18 } // namespace
37 19
38 TilingSetEvictionQueue::TilingSetEvictionQueue( 20 TilingSetEvictionQueue::TilingSetEvictionQueue(
39 PictureLayerTilingSet* tiling_set, 21 PictureLayerTilingSet* tiling_set,
40 bool skip_shared_out_of_order_tiles) 22 bool skip_shared_out_of_order_tiles)
41 : tree_(tiling_set->client()->GetTree()), 23 : tree_(tiling_set->client()->GetTree()),
42 skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles), 24 skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles),
43 phase_(EVENTUALLY_RECT), 25 phase_(EVENTUALLY_RECT),
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
101 &tilings_, tree_, skip_shared_out_of_order_tiles_); 83 &tilings_, tree_, skip_shared_out_of_order_tiles_);
102 if (!soon_iterator_.done()) 84 if (!soon_iterator_.done())
103 current_tile_ = *soon_iterator_; 85 current_tile_ = *soon_iterator_;
104 break; 86 break;
105 case SKEWPORT_RECT: 87 case SKEWPORT_RECT:
106 skewport_iterator_ = SkewportTilingIterator( 88 skewport_iterator_ = SkewportTilingIterator(
107 &tilings_, tree_, skip_shared_out_of_order_tiles_); 89 &tilings_, tree_, skip_shared_out_of_order_tiles_);
108 if (!skewport_iterator_.done()) 90 if (!skewport_iterator_.done())
109 current_tile_ = *skewport_iterator_; 91 current_tile_ = *skewport_iterator_;
110 break; 92 break;
93 case PENDING_VISIBLE_RECT:
94 pending_visible_iterator_ = PendingVisibleTilingIterator(
95 &tilings_, tree_, skip_shared_out_of_order_tiles_,
96 false /* return required for activation tiles */);
97 if (!pending_visible_iterator_.done())
98 current_tile_ = *pending_visible_iterator_;
99 break;
100 case PENDING_VISIBLE_RECT_REQUIRED_FOR_ACTIVATION:
101 pending_visible_iterator_ = PendingVisibleTilingIterator(
102 &tilings_, tree_, skip_shared_out_of_order_tiles_,
103 true /* return required for activation tiles */);
104 if (!pending_visible_iterator_.done())
105 current_tile_ = *pending_visible_iterator_;
106 break;
111 case VISIBLE_RECT_OCCLUDED: 107 case VISIBLE_RECT_OCCLUDED:
112 visible_iterator_ = VisibleTilingIterator( 108 visible_iterator_ = VisibleTilingIterator(
113 &tilings_, tree_, skip_shared_out_of_order_tiles_, 109 &tilings_, tree_, skip_shared_out_of_order_tiles_,
114 true /* return occluded tiles */, 110 true /* return occluded tiles */,
115 false /* return required for activation tiles */); 111 false /* return required for activation tiles */);
116 if (!visible_iterator_.done()) 112 if (!visible_iterator_.done())
117 current_tile_ = *visible_iterator_; 113 current_tile_ = *visible_iterator_;
118 break; 114 break;
119 case VISIBLE_RECT_UNOCCLUDED: 115 case VISIBLE_RECT_UNOCCLUDED:
120 visible_iterator_ = VisibleTilingIterator( 116 visible_iterator_ = VisibleTilingIterator(
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 case SOON_BORDER_RECT: 166 case SOON_BORDER_RECT:
171 ++soon_iterator_; 167 ++soon_iterator_;
172 if (!soon_iterator_.done()) 168 if (!soon_iterator_.done())
173 current_tile_ = *soon_iterator_; 169 current_tile_ = *soon_iterator_;
174 break; 170 break;
175 case SKEWPORT_RECT: 171 case SKEWPORT_RECT:
176 ++skewport_iterator_; 172 ++skewport_iterator_;
177 if (!skewport_iterator_.done()) 173 if (!skewport_iterator_.done())
178 current_tile_ = *skewport_iterator_; 174 current_tile_ = *skewport_iterator_;
179 break; 175 break;
176 case PENDING_VISIBLE_RECT:
177 case PENDING_VISIBLE_RECT_REQUIRED_FOR_ACTIVATION:
178 ++pending_visible_iterator_;
179 if (!pending_visible_iterator_.done())
180 current_tile_ = *pending_visible_iterator_;
181 break;
180 case VISIBLE_RECT_OCCLUDED: 182 case VISIBLE_RECT_OCCLUDED:
181 case VISIBLE_RECT_UNOCCLUDED: 183 case VISIBLE_RECT_UNOCCLUDED:
182 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED: 184 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED:
183 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED: 185 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED:
184 ++visible_iterator_; 186 ++visible_iterator_;
185 if (!visible_iterator_.done()) 187 if (!visible_iterator_.done())
186 current_tile_ = *visible_iterator_; 188 current_tile_ = *visible_iterator_;
187 break; 189 break;
188 } 190 }
189 if (!current_tile_) 191 if (!current_tile_)
190 AdvancePhase(); 192 AdvancePhase();
191 } 193 }
192 194
193 // EvictionRectIterator 195 // EvictionRectIterator
194 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator() 196 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator()
195 : tile_(nullptr), 197 : tile_(nullptr),
196 tilings_(nullptr), 198 tilings_(nullptr),
197 tree_(ACTIVE_TREE), 199 tree_(ACTIVE_TREE),
198 skip_shared_out_of_order_tiles_(false), 200 skip_shared_out_of_order_tiles_(false),
199 tiling_index_(0) { 201 tiling_index_(0) {
200 } 202 }
201 203
202 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator( 204 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator(
203 std::vector<PictureLayerTiling*>* tilings, 205 std::vector<PictureLayerTiling*>* tilings,
204 WhichTree tree, 206 WhichTree tree,
205 bool skip_shared_out_of_order_tiles) 207 bool skip_shared_out_of_order_tiles,
208 bool skip_pending_visible_rect)
206 : tile_(nullptr), 209 : tile_(nullptr),
207 tilings_(tilings), 210 tilings_(tilings),
208 tree_(tree), 211 tree_(tree),
209 skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles), 212 skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles),
213 skip_pending_visible_rect_(skip_pending_visible_rect),
210 tiling_index_(0) { 214 tiling_index_(0) {
211 } 215 }
212 216
213 template <typename TilingIteratorType> 217 template <typename TilingIteratorType>
214 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile( 218 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile(
215 TilingIteratorType* iterator) { 219 TilingIteratorType* iterator) {
216 bool found_tile = false; 220 bool found_tile = false;
217 while (!found_tile) { 221 while (!found_tile) {
218 ++(*iterator); 222 ++(*iterator);
219 if (!(*iterator)) { 223 if (!(*iterator)) {
220 tile_ = nullptr; 224 tile_ = nullptr;
221 break; 225 break;
222 } 226 }
223 found_tile = GetFirstTileAndCheckIfValid(iterator); 227 found_tile = GetFirstTileAndCheckIfValid(iterator);
224 } 228 }
225 return found_tile; 229 return found_tile;
226 } 230 }
227 231
228 template <typename TilingIteratorType> 232 template <typename TilingIteratorType>
229 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( 233 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid(
230 TilingIteratorType* iterator) { 234 TilingIteratorType* iterator) {
231 tile_ = (*tilings_)[tiling_index_]->TileAt(iterator->index_x(), 235 PictureLayerTiling* tiling = (*tilings_)[tiling_index_];
232 iterator->index_y()); 236 tile_ = tiling->TileAt(iterator->index_x(), iterator->index_y());
233 // If there's nothing to evict, return false. 237 // If there's nothing to evict, return false.
234 if (!tile_ || !tile_->HasResource()) 238 if (!tile_ || !tile_->HasResource())
235 return false; 239 return false;
240 if (skip_pending_visible_rect_ &&
241 tiling->pending_visible_rect().Intersects(tile_->content_rect())) {
242 return false;
243 }
236 (*tilings_)[tiling_index_]->UpdateTileAndTwinPriority(tile_); 244 (*tilings_)[tiling_index_]->UpdateTileAndTwinPriority(tile_);
237 // If the tile is out of order, return false. 245 // If the tile is out of order, return false.
238 if (skip_shared_out_of_order_tiles_ && IsSharedOutOfOrderTile(tree_, tile_)) 246 if (skip_shared_out_of_order_tiles_ && IsSharedOutOfOrderTile(tree_, tile_))
239 return false; 247 return false;
240 // In other cases, the tile we got is a viable candidate, return true. 248 // In other cases, the tile we got is a viable candidate, return true.
241 return true; 249 return true;
242 } 250 }
243 251
244 // EventuallyTilingIterator 252 // EventuallyTilingIterator
245 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator( 253 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator(
246 std::vector<PictureLayerTiling*>* tilings, 254 std::vector<PictureLayerTiling*>* tilings,
247 WhichTree tree, 255 WhichTree tree,
248 bool skip_shared_out_of_order_tiles) 256 bool skip_shared_out_of_order_tiles)
249 : EvictionRectIterator(tilings, tree, skip_shared_out_of_order_tiles) { 257 : EvictionRectIterator(tilings,
258 tree,
259 skip_shared_out_of_order_tiles,
260 true /* skip_pending_visible_rect */) {
250 // Find the first tiling with a tile. 261 // Find the first tiling with a tile.
251 while (tiling_index_ < tilings_->size()) { 262 while (tiling_index_ < tilings_->size()) {
252 if (!((*tilings_))[tiling_index_]->has_eventually_rect_tiles()) { 263 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) {
enne (OOO) 2015/04/13 22:36:03 How about a temporary variable for (*tilings)[tili
vmpstr 2015/04/13 23:52:13 Are you OK with this being a follow-up (since I ha
253 ++tiling_index_; 264 ++tiling_index_;
254 continue; 265 continue;
255 } 266 }
256 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 267 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
257 ((*tilings_))[tiling_index_]->tiling_data(), 268 (*tilings_)[tiling_index_]->tiling_data(),
258 ((*tilings_))[tiling_index_]->current_eventually_rect(), 269 (*tilings_)[tiling_index_]->current_eventually_rect(),
259 ((*tilings_))[tiling_index_]->current_skewport_rect(), 270 (*tilings_)[tiling_index_]->current_skewport_rect(),
260 ((*tilings_))[tiling_index_]->current_soon_border_rect()); 271 (*tilings_)[tiling_index_]->current_soon_border_rect());
261 if (!iterator_) { 272 if (!iterator_) {
262 ++tiling_index_; 273 ++tiling_index_;
263 continue; 274 continue;
264 } 275 }
265 break; 276 break;
266 } 277 }
267 if (tiling_index_ >= tilings_->size()) 278 if (tiling_index_ >= tilings_->size())
268 return; 279 return;
269 if (!GetFirstTileAndCheckIfValid(&iterator_)) 280 if (!GetFirstTileAndCheckIfValid(&iterator_))
270 ++(*this); 281 ++(*this);
271 } 282 }
272 283
273 TilingSetEvictionQueue::EventuallyTilingIterator& 284 TilingSetEvictionQueue::EventuallyTilingIterator&
274 TilingSetEvictionQueue::EventuallyTilingIterator:: 285 TilingSetEvictionQueue::EventuallyTilingIterator::
275 operator++() { 286 operator++() {
276 bool found_tile = AdvanceToNextTile(&iterator_); 287 bool found_tile = AdvanceToNextTile(&iterator_);
277 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { 288 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
278 ++tiling_index_; 289 ++tiling_index_;
279 if (!((*tilings_))[tiling_index_]->has_eventually_rect_tiles()) 290 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles())
280 continue; 291 continue;
281 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 292 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
282 ((*tilings_))[tiling_index_]->tiling_data(), 293 (*tilings_)[tiling_index_]->tiling_data(),
283 ((*tilings_))[tiling_index_]->current_eventually_rect(), 294 (*tilings_)[tiling_index_]->current_eventually_rect(),
284 ((*tilings_))[tiling_index_]->current_skewport_rect(), 295 (*tilings_)[tiling_index_]->current_skewport_rect(),
285 ((*tilings_))[tiling_index_]->current_soon_border_rect()); 296 (*tilings_)[tiling_index_]->current_soon_border_rect());
286 if (!iterator_) 297 if (!iterator_)
287 continue; 298 continue;
288 found_tile = GetFirstTileAndCheckIfValid(&iterator_); 299 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
289 if (!found_tile) 300 if (!found_tile)
290 found_tile = AdvanceToNextTile(&iterator_); 301 found_tile = AdvanceToNextTile(&iterator_);
291 } 302 }
292 return *this; 303 return *this;
293 } 304 }
294 305
295 // SoonBorderTilingIterator 306 // SoonBorderTilingIterator
296 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator( 307 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator(
297 std::vector<PictureLayerTiling*>* tilings, 308 std::vector<PictureLayerTiling*>* tilings,
298 WhichTree tree, 309 WhichTree tree,
299 bool skip_shared_out_of_order_tiles) 310 bool skip_shared_out_of_order_tiles)
300 : EvictionRectIterator(tilings, tree, skip_shared_out_of_order_tiles) { 311 : EvictionRectIterator(tilings,
312 tree,
313 skip_shared_out_of_order_tiles,
314 true /* skip_pending_visible_rect */) {
301 // Find the first tiling with a tile. 315 // Find the first tiling with a tile.
302 while (tiling_index_ < tilings_->size()) { 316 while (tiling_index_ < tilings_->size()) {
303 if (!((*tilings_))[tiling_index_]->has_soon_border_rect_tiles()) { 317 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) {
304 ++tiling_index_; 318 ++tiling_index_;
305 continue; 319 continue;
306 } 320 }
307 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 321 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
308 ((*tilings_))[tiling_index_]->tiling_data(), 322 (*tilings_)[tiling_index_]->tiling_data(),
309 ((*tilings_))[tiling_index_]->current_soon_border_rect(), 323 (*tilings_)[tiling_index_]->current_soon_border_rect(),
310 ((*tilings_))[tiling_index_]->current_skewport_rect(), 324 (*tilings_)[tiling_index_]->current_skewport_rect(),
311 ((*tilings_))[tiling_index_]->current_visible_rect()); 325 (*tilings_)[tiling_index_]->current_visible_rect());
312 if (!iterator_) { 326 if (!iterator_) {
313 ++tiling_index_; 327 ++tiling_index_;
314 continue; 328 continue;
315 } 329 }
316 break; 330 break;
317 } 331 }
318 if (tiling_index_ >= tilings_->size()) 332 if (tiling_index_ >= tilings_->size())
319 return; 333 return;
320 if (!GetFirstTileAndCheckIfValid(&iterator_)) 334 if (!GetFirstTileAndCheckIfValid(&iterator_))
321 ++(*this); 335 ++(*this);
322 } 336 }
323 337
324 TilingSetEvictionQueue::SoonBorderTilingIterator& 338 TilingSetEvictionQueue::SoonBorderTilingIterator&
325 TilingSetEvictionQueue::SoonBorderTilingIterator:: 339 TilingSetEvictionQueue::SoonBorderTilingIterator::
326 operator++() { 340 operator++() {
327 bool found_tile = AdvanceToNextTile(&iterator_); 341 bool found_tile = AdvanceToNextTile(&iterator_);
328 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { 342 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
329 ++tiling_index_; 343 ++tiling_index_;
330 if (!((*tilings_))[tiling_index_]->has_soon_border_rect_tiles()) 344 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles())
331 continue; 345 continue;
332 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 346 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
333 ((*tilings_))[tiling_index_]->tiling_data(), 347 (*tilings_)[tiling_index_]->tiling_data(),
334 ((*tilings_))[tiling_index_]->current_soon_border_rect(), 348 (*tilings_)[tiling_index_]->current_soon_border_rect(),
335 ((*tilings_))[tiling_index_]->current_skewport_rect(), 349 (*tilings_)[tiling_index_]->current_skewport_rect(),
336 ((*tilings_))[tiling_index_]->current_visible_rect()); 350 (*tilings_)[tiling_index_]->current_visible_rect());
337 if (!iterator_) 351 if (!iterator_)
338 continue; 352 continue;
339 found_tile = GetFirstTileAndCheckIfValid(&iterator_); 353 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
340 if (!found_tile) 354 if (!found_tile)
341 found_tile = AdvanceToNextTile(&iterator_); 355 found_tile = AdvanceToNextTile(&iterator_);
342 } 356 }
343 return *this; 357 return *this;
344 } 358 }
345 359
346 // SkewportTilingIterator 360 // SkewportTilingIterator
347 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator( 361 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator(
348 std::vector<PictureLayerTiling*>* tilings, 362 std::vector<PictureLayerTiling*>* tilings,
349 WhichTree tree, 363 WhichTree tree,
350 bool skip_shared_out_of_order_tiles) 364 bool skip_shared_out_of_order_tiles)
351 : EvictionRectIterator(tilings, tree, skip_shared_out_of_order_tiles) { 365 : EvictionRectIterator(tilings,
366 tree,
367 skip_shared_out_of_order_tiles,
368 true /* skip_pending_visible_rect */) {
352 // Find the first tiling with a tile. 369 // Find the first tiling with a tile.
353 while (tiling_index_ < tilings_->size()) { 370 while (tiling_index_ < tilings_->size()) {
354 if (!((*tilings_))[tiling_index_]->has_skewport_rect_tiles()) { 371 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) {
355 ++tiling_index_; 372 ++tiling_index_;
356 continue; 373 continue;
357 } 374 }
358 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 375 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
359 ((*tilings_))[tiling_index_]->tiling_data(), 376 (*tilings_)[tiling_index_]->tiling_data(),
360 ((*tilings_))[tiling_index_]->current_skewport_rect(), 377 (*tilings_)[tiling_index_]->current_skewport_rect(),
361 ((*tilings_))[tiling_index_]->current_visible_rect(), 378 (*tilings_)[tiling_index_]->current_visible_rect(),
362 ((*tilings_))[tiling_index_]->current_visible_rect()); 379 (*tilings_)[tiling_index_]->current_visible_rect());
363 if (!iterator_) { 380 if (!iterator_) {
364 ++tiling_index_; 381 ++tiling_index_;
365 continue; 382 continue;
366 } 383 }
367 break; 384 break;
368 } 385 }
369 if (tiling_index_ >= tilings_->size()) 386 if (tiling_index_ >= tilings_->size())
370 return; 387 return;
371 if (!GetFirstTileAndCheckIfValid(&iterator_)) 388 if (!GetFirstTileAndCheckIfValid(&iterator_))
372 ++(*this); 389 ++(*this);
373 } 390 }
374 391
375 TilingSetEvictionQueue::SkewportTilingIterator& 392 TilingSetEvictionQueue::SkewportTilingIterator&
376 TilingSetEvictionQueue::SkewportTilingIterator:: 393 TilingSetEvictionQueue::SkewportTilingIterator::
377 operator++() { 394 operator++() {
378 bool found_tile = AdvanceToNextTile(&iterator_); 395 bool found_tile = AdvanceToNextTile(&iterator_);
379 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { 396 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
380 ++tiling_index_; 397 ++tiling_index_;
381 if (!((*tilings_))[tiling_index_]->has_skewport_rect_tiles()) 398 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles())
382 continue; 399 continue;
383 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 400 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
384 ((*tilings_))[tiling_index_]->tiling_data(), 401 (*tilings_)[tiling_index_]->tiling_data(),
385 ((*tilings_))[tiling_index_]->current_skewport_rect(), 402 (*tilings_)[tiling_index_]->current_skewport_rect(),
386 ((*tilings_))[tiling_index_]->current_visible_rect(), 403 (*tilings_)[tiling_index_]->current_visible_rect(),
387 ((*tilings_))[tiling_index_]->current_visible_rect()); 404 (*tilings_)[tiling_index_]->current_visible_rect());
388 if (!iterator_) 405 if (!iterator_)
389 continue; 406 continue;
390 found_tile = GetFirstTileAndCheckIfValid(&iterator_); 407 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
391 if (!found_tile) 408 if (!found_tile)
392 found_tile = AdvanceToNextTile(&iterator_); 409 found_tile = AdvanceToNextTile(&iterator_);
393 } 410 }
394 return *this; 411 return *this;
395 } 412 }
396 413
414 // PendingVisibleIterator
415 TilingSetEvictionQueue::PendingVisibleTilingIterator::
416 PendingVisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings,
417 WhichTree tree,
418 bool skip_shared_out_of_order_tiles,
419 bool return_required_for_activation_tiles)
420 : EvictionRectIterator(tilings,
421 tree,
422 skip_shared_out_of_order_tiles,
423 false /* skip_pending_visible_rect */),
424 return_required_for_activation_tiles_(
425 return_required_for_activation_tiles) {
426 // Find the first tiling with a tile.
427 while (tiling_index_ < tilings_->size()) {
428 iterator_ = TilingData::DifferenceIterator(
429 (*tilings_)[tiling_index_]->tiling_data(),
430 (*tilings_)[tiling_index_]->pending_visible_rect(),
431 (*tilings_)[tiling_index_]->current_visible_rect());
432 if (!iterator_) {
433 ++tiling_index_;
434 continue;
435 }
436 break;
437 }
438 if (tiling_index_ >= tilings_->size())
439 return;
440 if (!GetFirstTileAndCheckIfValid(&iterator_)) {
441 ++(*this);
442 return;
443 }
444 if (!TileMatchesRequiredFlags(tile_)) {
445 ++(*this);
446 return;
447 }
448 }
449
450 TilingSetEvictionQueue::PendingVisibleTilingIterator&
451 TilingSetEvictionQueue::PendingVisibleTilingIterator::
452 operator++() {
453 bool found_tile = AdvanceToNextTile(&iterator_);
454 while (found_tile && !TileMatchesRequiredFlags(tile_))
455 found_tile = AdvanceToNextTile(&iterator_);
456
457 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
458 ++tiling_index_;
459 iterator_ = TilingData::DifferenceIterator(
460 (*tilings_)[tiling_index_]->tiling_data(),
461 (*tilings_)[tiling_index_]->pending_visible_rect(),
462 (*tilings_)[tiling_index_]->current_visible_rect());
463 if (!iterator_)
464 continue;
465 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
466 if (!found_tile)
467 found_tile = AdvanceToNextTile(&iterator_);
468 while (found_tile && !TileMatchesRequiredFlags(tile_))
469 found_tile = AdvanceToNextTile(&iterator_);
470 }
471 return *this;
472 }
473
474 bool TilingSetEvictionQueue::PendingVisibleTilingIterator::
475 TileMatchesRequiredFlags(const Tile* tile) const {
476 bool activation_flag_matches =
477 tile->required_for_activation() == return_required_for_activation_tiles_;
478 return activation_flag_matches;
479 }
480
397 // VisibleTilingIterator 481 // VisibleTilingIterator
398 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator( 482 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator(
399 std::vector<PictureLayerTiling*>* tilings, 483 std::vector<PictureLayerTiling*>* tilings,
400 WhichTree tree, 484 WhichTree tree,
401 bool skip_shared_out_of_order_tiles, 485 bool skip_shared_out_of_order_tiles,
402 bool return_occluded_tiles, 486 bool return_occluded_tiles,
403 bool return_required_for_activation_tiles) 487 bool return_required_for_activation_tiles)
404 : EvictionRectIterator(tilings, tree, skip_shared_out_of_order_tiles), 488 : EvictionRectIterator(tilings,
489 tree,
490 skip_shared_out_of_order_tiles,
491 false /* skip_pending_visible_rect */),
405 return_occluded_tiles_(return_occluded_tiles), 492 return_occluded_tiles_(return_occluded_tiles),
406 return_required_for_activation_tiles_( 493 return_required_for_activation_tiles_(
407 return_required_for_activation_tiles) { 494 return_required_for_activation_tiles) {
408 // Find the first tiling with a tile. 495 // Find the first tiling with a tile.
409 while (tiling_index_ < tilings_->size()) { 496 while (tiling_index_ < tilings_->size()) {
410 if (!((*tilings_))[tiling_index_]->has_visible_rect_tiles()) { 497 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) {
411 ++tiling_index_; 498 ++tiling_index_;
412 continue; 499 continue;
413 } 500 }
414 iterator_ = TilingData::Iterator( 501 iterator_ = TilingData::Iterator(
415 ((*tilings_))[tiling_index_]->tiling_data(), 502 (*tilings_)[tiling_index_]->tiling_data(),
416 ((*tilings_))[tiling_index_]->current_visible_rect(), false); 503 (*tilings_)[tiling_index_]->current_visible_rect(), false);
417 if (!iterator_) { 504 if (!iterator_) {
418 ++tiling_index_; 505 ++tiling_index_;
419 continue; 506 continue;
420 } 507 }
421 break; 508 break;
422 } 509 }
423 if (tiling_index_ >= tilings_->size()) 510 if (tiling_index_ >= tilings_->size())
424 return; 511 return;
425 if (!GetFirstTileAndCheckIfValid(&iterator_)) { 512 if (!GetFirstTileAndCheckIfValid(&iterator_)) {
426 ++(*this); 513 ++(*this);
427 return; 514 return;
428 } 515 }
429 if (!TileMatchesRequiredFlags(tile_)) { 516 if (!TileMatchesRequiredFlags(tile_)) {
430 ++(*this); 517 ++(*this);
431 return; 518 return;
432 } 519 }
433 } 520 }
434 521
435 TilingSetEvictionQueue::VisibleTilingIterator& 522 TilingSetEvictionQueue::VisibleTilingIterator&
436 TilingSetEvictionQueue::VisibleTilingIterator:: 523 TilingSetEvictionQueue::VisibleTilingIterator::
437 operator++() { 524 operator++() {
438 bool found_tile = AdvanceToNextTile(&iterator_); 525 bool found_tile = AdvanceToNextTile(&iterator_);
439 while (found_tile && !TileMatchesRequiredFlags(tile_)) 526 while (found_tile && !TileMatchesRequiredFlags(tile_))
440 found_tile = AdvanceToNextTile(&iterator_); 527 found_tile = AdvanceToNextTile(&iterator_);
441 528
442 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { 529 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
443 ++tiling_index_; 530 ++tiling_index_;
444 if (!((*tilings_))[tiling_index_]->has_visible_rect_tiles()) 531 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles())
445 continue; 532 continue;
446 iterator_ = TilingData::Iterator( 533 iterator_ = TilingData::Iterator(
447 ((*tilings_))[tiling_index_]->tiling_data(), 534 (*tilings_)[tiling_index_]->tiling_data(),
448 ((*tilings_))[tiling_index_]->current_visible_rect(), false); 535 (*tilings_)[tiling_index_]->current_visible_rect(), false);
449 if (!iterator_) 536 if (!iterator_)
450 continue; 537 continue;
451 found_tile = GetFirstTileAndCheckIfValid(&iterator_); 538 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
452 if (!found_tile) 539 if (!found_tile)
453 found_tile = AdvanceToNextTile(&iterator_); 540 found_tile = AdvanceToNextTile(&iterator_);
454 while (found_tile && !TileMatchesRequiredFlags(tile_)) 541 while (found_tile && !TileMatchesRequiredFlags(tile_))
455 found_tile = AdvanceToNextTile(&iterator_); 542 found_tile = AdvanceToNextTile(&iterator_);
456 } 543 }
457 return *this; 544 return *this;
458 } 545 }
459 546
460 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags( 547 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags(
461 const Tile* tile) const { 548 const Tile* tile) const {
462 bool activation_flag_matches = 549 bool activation_flag_matches =
463 tile->required_for_activation() == return_required_for_activation_tiles_; 550 tile->required_for_activation() == return_required_for_activation_tiles_;
464 bool occluded_flag_matches = 551 bool occluded_flag_matches =
465 tile->is_occluded(tree_) == return_occluded_tiles_; 552 tile->is_occluded(tree_) == return_occluded_tiles_;
466 return activation_flag_matches && occluded_flag_matches; 553 return activation_flag_matches && occluded_flag_matches;
467 } 554 }
468 555
469 } // namespace cc 556 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698