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

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

Issue 1108773003: Revert of cc: Remove tile sharing from tilings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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
« no previous file with comments | « cc/resources/tiling_set_eviction_queue.h ('k') | cc/resources/tiling_set_raster_queue_all.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
11
12 bool IsSharedOutOfOrderTile(WhichTree tree, const Tile* tile) {
13 if (!tile->is_shared())
14 return false;
15
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 }
35
36 } // namespace
10 37
11 TilingSetEvictionQueue::TilingSetEvictionQueue( 38 TilingSetEvictionQueue::TilingSetEvictionQueue(
12 PictureLayerTilingSet* tiling_set, 39 PictureLayerTilingSet* tiling_set,
13 bool skip_shared_out_of_order_tiles) 40 bool skip_shared_out_of_order_tiles)
14 : tree_(tiling_set->client()->GetTree()), 41 : tree_(tiling_set->client()->GetTree()),
15 skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles), 42 skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles),
16 phase_(EVENTUALLY_RECT), 43 phase_(EVENTUALLY_RECT),
17 current_tile_(nullptr) { 44 current_tile_(nullptr) {
18 // Early out if the layer has no tilings. 45 // Early out if the layer has no tilings.
19 if (!tiling_set->num_tilings()) 46 if (!tiling_set->num_tilings())
20 return; 47 return;
21 GenerateTilingOrder(tiling_set); 48 GenerateTilingOrder(tiling_set);
22 eventually_iterator_ = EventuallyTilingIterator( 49 eventually_iterator_ = EventuallyTilingIterator(
23 &tilings_, tree_, skip_shared_out_of_order_tiles_); 50 &tilings_, tree_, skip_shared_out_of_order_tiles_);
24 if (eventually_iterator_.done()) { 51 if (eventually_iterator_.done()) {
25 AdvancePhase(); 52 AdvancePhase();
26 return; 53 return;
27 } 54 }
28 current_tile_ = *eventually_iterator_; 55 current_tile_ = *eventually_iterator_;
29 } 56 }
30 57
31 TilingSetEvictionQueue::~TilingSetEvictionQueue() { 58 TilingSetEvictionQueue::~TilingSetEvictionQueue() {
32 } 59 }
33 60
34 void TilingSetEvictionQueue::GenerateTilingOrder( 61 void TilingSetEvictionQueue::GenerateTilingOrder(
35 PictureLayerTilingSet* tiling_set) { 62 PictureLayerTilingSet* tiling_set) {
36 tilings_.reserve(tiling_set->num_tilings()); 63 tilings_.reserve(tiling_set->num_tilings());
37 // Generate all of the tilings in the order described in the header comment 64 // Generate all of the tilings in the order described in the header comment
38 // for this class. 65 // for this class.
39 PictureLayerTilingSet::TilingRange range = 66 auto range =
40 tiling_set->GetTilingRange(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); 67 tiling_set->GetTilingRange(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES);
41 for (int i = range.start; i < range.end; ++i) { 68 for (int i = range.start; i < range.end; ++i)
42 PictureLayerTiling* tiling = tiling_set->tiling_at(i); 69 tilings_.push_back(tiling_set->tiling_at(i));
43 if (tiling->has_tiles())
44 tilings_.push_back(tiling);
45 }
46 70
47 range = tiling_set->GetTilingRange(PictureLayerTilingSet::LOWER_THAN_LOW_RES); 71 range = tiling_set->GetTilingRange(PictureLayerTilingSet::LOWER_THAN_LOW_RES);
48 for (int i = range.end - 1; i >= range.start; --i) { 72 for (int i = range.end - 1; i >= range.start; --i)
49 PictureLayerTiling* tiling = tiling_set->tiling_at(i); 73 tilings_.push_back(tiling_set->tiling_at(i));
50 if (tiling->has_tiles())
51 tilings_.push_back(tiling);
52 }
53 74
54 range = tiling_set->GetTilingRange( 75 range = tiling_set->GetTilingRange(
55 PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES); 76 PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES);
56 for (int i = range.end - 1; i >= range.start; --i) { 77 for (int i = range.end - 1; i >= range.start; --i)
57 PictureLayerTiling* tiling = tiling_set->tiling_at(i); 78 tilings_.push_back(tiling_set->tiling_at(i));
58 if (tiling->has_tiles())
59 tilings_.push_back(tiling);
60 }
61 79
62 range = tiling_set->GetTilingRange(PictureLayerTilingSet::LOW_RES); 80 range = tiling_set->GetTilingRange(PictureLayerTilingSet::LOW_RES);
63 for (int i = range.start; i < range.end; ++i) { 81 for (int i = range.start; i < range.end; ++i)
64 PictureLayerTiling* tiling = tiling_set->tiling_at(i); 82 tilings_.push_back(tiling_set->tiling_at(i));
65 if (tiling->has_tiles())
66 tilings_.push_back(tiling);
67 }
68 83
69 range = tiling_set->GetTilingRange(PictureLayerTilingSet::HIGH_RES); 84 range = tiling_set->GetTilingRange(PictureLayerTilingSet::HIGH_RES);
70 for (int i = range.start; i < range.end; ++i) { 85 for (int i = range.start; i < range.end; ++i)
71 PictureLayerTiling* tiling = tiling_set->tiling_at(i); 86 tilings_.push_back(tiling_set->tiling_at(i));
72 if (tiling->has_tiles()) 87 DCHECK_EQ(tiling_set->num_tilings(), tilings_.size());
73 tilings_.push_back(tiling);
74 }
75 DCHECK_GE(tiling_set->num_tilings(), tilings_.size());
76 } 88 }
77 89
78 void TilingSetEvictionQueue::AdvancePhase() { 90 void TilingSetEvictionQueue::AdvancePhase() {
79 current_tile_ = nullptr; 91 current_tile_ = nullptr;
80 while (!current_tile_ && 92 while (!current_tile_ &&
81 phase_ != VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED) { 93 phase_ != VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED) {
82 phase_ = static_cast<Phase>(phase_ + 1); 94 phase_ = static_cast<Phase>(phase_ + 1);
83 switch (phase_) { 95 switch (phase_) {
84 case EVENTUALLY_RECT: 96 case EVENTUALLY_RECT:
85 NOTREACHED(); 97 NOTREACHED();
86 break; 98 break;
87 case SOON_BORDER_RECT: 99 case SOON_BORDER_RECT:
88 soon_iterator_ = SoonBorderTilingIterator( 100 soon_iterator_ = SoonBorderTilingIterator(
89 &tilings_, tree_, skip_shared_out_of_order_tiles_); 101 &tilings_, tree_, skip_shared_out_of_order_tiles_);
90 if (!soon_iterator_.done()) 102 if (!soon_iterator_.done())
91 current_tile_ = *soon_iterator_; 103 current_tile_ = *soon_iterator_;
92 break; 104 break;
93 case SKEWPORT_RECT: 105 case SKEWPORT_RECT:
94 skewport_iterator_ = SkewportTilingIterator( 106 skewport_iterator_ = SkewportTilingIterator(
95 &tilings_, tree_, skip_shared_out_of_order_tiles_); 107 &tilings_, tree_, skip_shared_out_of_order_tiles_);
96 if (!skewport_iterator_.done()) 108 if (!skewport_iterator_.done())
97 current_tile_ = *skewport_iterator_; 109 current_tile_ = *skewport_iterator_;
98 break; 110 break;
99 case PENDING_VISIBLE_RECT:
100 pending_visible_iterator_ = PendingVisibleTilingIterator(
101 &tilings_, tree_, skip_shared_out_of_order_tiles_,
102 false /* return required for activation tiles */);
103 if (!pending_visible_iterator_.done())
104 current_tile_ = *pending_visible_iterator_;
105 break;
106 case PENDING_VISIBLE_RECT_REQUIRED_FOR_ACTIVATION:
107 pending_visible_iterator_ = PendingVisibleTilingIterator(
108 &tilings_, tree_, skip_shared_out_of_order_tiles_,
109 true /* return required for activation tiles */);
110 if (!pending_visible_iterator_.done())
111 current_tile_ = *pending_visible_iterator_;
112 break;
113 case VISIBLE_RECT_OCCLUDED: 111 case VISIBLE_RECT_OCCLUDED:
114 visible_iterator_ = VisibleTilingIterator( 112 visible_iterator_ = VisibleTilingIterator(
115 &tilings_, tree_, skip_shared_out_of_order_tiles_, 113 &tilings_, tree_, skip_shared_out_of_order_tiles_,
116 true /* return occluded tiles */, 114 true /* return occluded tiles */,
117 false /* return required for activation tiles */); 115 false /* return required for activation tiles */);
118 if (!visible_iterator_.done()) 116 if (!visible_iterator_.done())
119 current_tile_ = *visible_iterator_; 117 current_tile_ = *visible_iterator_;
120 break; 118 break;
121 case VISIBLE_RECT_UNOCCLUDED: 119 case VISIBLE_RECT_UNOCCLUDED:
122 visible_iterator_ = VisibleTilingIterator( 120 visible_iterator_ = VisibleTilingIterator(
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
172 case SOON_BORDER_RECT: 170 case SOON_BORDER_RECT:
173 ++soon_iterator_; 171 ++soon_iterator_;
174 if (!soon_iterator_.done()) 172 if (!soon_iterator_.done())
175 current_tile_ = *soon_iterator_; 173 current_tile_ = *soon_iterator_;
176 break; 174 break;
177 case SKEWPORT_RECT: 175 case SKEWPORT_RECT:
178 ++skewport_iterator_; 176 ++skewport_iterator_;
179 if (!skewport_iterator_.done()) 177 if (!skewport_iterator_.done())
180 current_tile_ = *skewport_iterator_; 178 current_tile_ = *skewport_iterator_;
181 break; 179 break;
182 case PENDING_VISIBLE_RECT:
183 case PENDING_VISIBLE_RECT_REQUIRED_FOR_ACTIVATION:
184 ++pending_visible_iterator_;
185 if (!pending_visible_iterator_.done())
186 current_tile_ = *pending_visible_iterator_;
187 break;
188 case VISIBLE_RECT_OCCLUDED: 180 case VISIBLE_RECT_OCCLUDED:
189 case VISIBLE_RECT_UNOCCLUDED: 181 case VISIBLE_RECT_UNOCCLUDED:
190 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED: 182 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED:
191 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED: 183 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED:
192 ++visible_iterator_; 184 ++visible_iterator_;
193 if (!visible_iterator_.done()) 185 if (!visible_iterator_.done())
194 current_tile_ = *visible_iterator_; 186 current_tile_ = *visible_iterator_;
195 break; 187 break;
196 } 188 }
197 if (!current_tile_) 189 if (!current_tile_)
198 AdvancePhase(); 190 AdvancePhase();
199 } 191 }
200 192
201 // EvictionRectIterator 193 // EvictionRectIterator
202 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator() 194 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator()
203 : tile_(nullptr), 195 : tile_(nullptr),
204 tilings_(nullptr), 196 tilings_(nullptr),
205 tree_(ACTIVE_TREE), 197 tree_(ACTIVE_TREE),
206 skip_shared_out_of_order_tiles_(false), 198 skip_shared_out_of_order_tiles_(false),
207 tiling_index_(0) { 199 tiling_index_(0) {
208 } 200 }
209 201
210 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator( 202 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator(
211 std::vector<PictureLayerTiling*>* tilings, 203 std::vector<PictureLayerTiling*>* tilings,
212 WhichTree tree, 204 WhichTree tree,
213 bool skip_shared_out_of_order_tiles, 205 bool skip_shared_out_of_order_tiles)
214 bool skip_pending_visible_rect)
215 : tile_(nullptr), 206 : tile_(nullptr),
216 tilings_(tilings), 207 tilings_(tilings),
217 tree_(tree), 208 tree_(tree),
218 skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles), 209 skip_shared_out_of_order_tiles_(skip_shared_out_of_order_tiles),
219 skip_pending_visible_rect_(skip_pending_visible_rect),
220 tiling_index_(0) { 210 tiling_index_(0) {
221 } 211 }
222 212
223 template <typename TilingIteratorType> 213 template <typename TilingIteratorType>
224 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile( 214 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile(
225 TilingIteratorType* iterator) { 215 TilingIteratorType* iterator) {
226 bool found_tile = false; 216 bool found_tile = false;
227 while (!found_tile) { 217 while (!found_tile) {
228 ++(*iterator); 218 ++(*iterator);
229 if (!(*iterator)) { 219 if (!(*iterator)) {
230 tile_ = nullptr; 220 tile_ = nullptr;
231 break; 221 break;
232 } 222 }
233 found_tile = GetFirstTileAndCheckIfValid(iterator); 223 found_tile = GetFirstTileAndCheckIfValid(iterator);
234 } 224 }
235 return found_tile; 225 return found_tile;
236 } 226 }
237 227
238 template <typename TilingIteratorType> 228 template <typename TilingIteratorType>
239 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( 229 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid(
240 TilingIteratorType* iterator) { 230 TilingIteratorType* iterator) {
241 PictureLayerTiling* tiling = (*tilings_)[tiling_index_]; 231 tile_ = (*tilings_)[tiling_index_]->TileAt(iterator->index_x(),
242 tile_ = tiling->TileAt(iterator->index_x(), iterator->index_y()); 232 iterator->index_y());
243 // If there's nothing to evict, return false. 233 // If there's nothing to evict, return false.
244 if (!tile_ || !tile_->HasResource()) 234 if (!tile_ || !tile_->HasResource())
245 return false; 235 return false;
246 if (skip_pending_visible_rect_ && 236 (*tilings_)[tiling_index_]->UpdateTileAndTwinPriority(tile_);
247 tiling->pending_visible_rect().Intersects(tile_->content_rect())) { 237 // If the tile is out of order, return false.
238 if (skip_shared_out_of_order_tiles_ && IsSharedOutOfOrderTile(tree_, tile_))
248 return false; 239 return false;
249 }
250 (*tilings_)[tiling_index_]->UpdateTileAndTwinPriority(tile_);
251 // In other cases, the tile we got is a viable candidate, return true. 240 // In other cases, the tile we got is a viable candidate, return true.
252 return true; 241 return true;
253 } 242 }
254 243
255 // EventuallyTilingIterator 244 // EventuallyTilingIterator
256 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator( 245 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator(
257 std::vector<PictureLayerTiling*>* tilings, 246 std::vector<PictureLayerTiling*>* tilings,
258 WhichTree tree, 247 WhichTree tree,
259 bool skip_shared_out_of_order_tiles) 248 bool skip_shared_out_of_order_tiles)
260 : EvictionRectIterator(tilings, 249 : EvictionRectIterator(tilings, tree, skip_shared_out_of_order_tiles) {
261 tree,
262 skip_shared_out_of_order_tiles,
263 true /* skip_pending_visible_rect */) {
264 // Find the first tiling with a tile. 250 // Find the first tiling with a tile.
265 while (tiling_index_ < tilings_->size()) { 251 while (tiling_index_ < tilings_->size()) {
266 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) { 252 if (!((*tilings_))[tiling_index_]->has_eventually_rect_tiles()) {
267 ++tiling_index_; 253 ++tiling_index_;
268 continue; 254 continue;
269 } 255 }
270 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 256 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
271 (*tilings_)[tiling_index_]->tiling_data(), 257 ((*tilings_))[tiling_index_]->tiling_data(),
272 (*tilings_)[tiling_index_]->current_eventually_rect(), 258 ((*tilings_))[tiling_index_]->current_eventually_rect(),
273 (*tilings_)[tiling_index_]->current_skewport_rect(), 259 ((*tilings_))[tiling_index_]->current_skewport_rect(),
274 (*tilings_)[tiling_index_]->current_soon_border_rect()); 260 ((*tilings_))[tiling_index_]->current_soon_border_rect());
275 if (!iterator_) { 261 if (!iterator_) {
276 ++tiling_index_; 262 ++tiling_index_;
277 continue; 263 continue;
278 } 264 }
279 break; 265 break;
280 } 266 }
281 if (tiling_index_ >= tilings_->size()) 267 if (tiling_index_ >= tilings_->size())
282 return; 268 return;
283 if (!GetFirstTileAndCheckIfValid(&iterator_)) 269 if (!GetFirstTileAndCheckIfValid(&iterator_))
284 ++(*this); 270 ++(*this);
285 } 271 }
286 272
287 TilingSetEvictionQueue::EventuallyTilingIterator& 273 TilingSetEvictionQueue::EventuallyTilingIterator&
288 TilingSetEvictionQueue::EventuallyTilingIterator:: 274 TilingSetEvictionQueue::EventuallyTilingIterator::
289 operator++() { 275 operator++() {
290 bool found_tile = AdvanceToNextTile(&iterator_); 276 bool found_tile = AdvanceToNextTile(&iterator_);
291 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { 277 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
292 ++tiling_index_; 278 ++tiling_index_;
293 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) 279 if (!((*tilings_))[tiling_index_]->has_eventually_rect_tiles())
294 continue; 280 continue;
295 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 281 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
296 (*tilings_)[tiling_index_]->tiling_data(), 282 ((*tilings_))[tiling_index_]->tiling_data(),
297 (*tilings_)[tiling_index_]->current_eventually_rect(), 283 ((*tilings_))[tiling_index_]->current_eventually_rect(),
298 (*tilings_)[tiling_index_]->current_skewport_rect(), 284 ((*tilings_))[tiling_index_]->current_skewport_rect(),
299 (*tilings_)[tiling_index_]->current_soon_border_rect()); 285 ((*tilings_))[tiling_index_]->current_soon_border_rect());
300 if (!iterator_) 286 if (!iterator_)
301 continue; 287 continue;
302 found_tile = GetFirstTileAndCheckIfValid(&iterator_); 288 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
303 if (!found_tile) 289 if (!found_tile)
304 found_tile = AdvanceToNextTile(&iterator_); 290 found_tile = AdvanceToNextTile(&iterator_);
305 } 291 }
306 return *this; 292 return *this;
307 } 293 }
308 294
309 // SoonBorderTilingIterator 295 // SoonBorderTilingIterator
310 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator( 296 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator(
311 std::vector<PictureLayerTiling*>* tilings, 297 std::vector<PictureLayerTiling*>* tilings,
312 WhichTree tree, 298 WhichTree tree,
313 bool skip_shared_out_of_order_tiles) 299 bool skip_shared_out_of_order_tiles)
314 : EvictionRectIterator(tilings, 300 : EvictionRectIterator(tilings, tree, skip_shared_out_of_order_tiles) {
315 tree,
316 skip_shared_out_of_order_tiles,
317 true /* skip_pending_visible_rect */) {
318 // Find the first tiling with a tile. 301 // Find the first tiling with a tile.
319 while (tiling_index_ < tilings_->size()) { 302 while (tiling_index_ < tilings_->size()) {
320 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) { 303 if (!((*tilings_))[tiling_index_]->has_soon_border_rect_tiles()) {
321 ++tiling_index_; 304 ++tiling_index_;
322 continue; 305 continue;
323 } 306 }
324 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 307 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
325 (*tilings_)[tiling_index_]->tiling_data(), 308 ((*tilings_))[tiling_index_]->tiling_data(),
326 (*tilings_)[tiling_index_]->current_soon_border_rect(), 309 ((*tilings_))[tiling_index_]->current_soon_border_rect(),
327 (*tilings_)[tiling_index_]->current_skewport_rect(), 310 ((*tilings_))[tiling_index_]->current_skewport_rect(),
328 (*tilings_)[tiling_index_]->current_visible_rect()); 311 ((*tilings_))[tiling_index_]->current_visible_rect());
329 if (!iterator_) { 312 if (!iterator_) {
330 ++tiling_index_; 313 ++tiling_index_;
331 continue; 314 continue;
332 } 315 }
333 break; 316 break;
334 } 317 }
335 if (tiling_index_ >= tilings_->size()) 318 if (tiling_index_ >= tilings_->size())
336 return; 319 return;
337 if (!GetFirstTileAndCheckIfValid(&iterator_)) 320 if (!GetFirstTileAndCheckIfValid(&iterator_))
338 ++(*this); 321 ++(*this);
339 } 322 }
340 323
341 TilingSetEvictionQueue::SoonBorderTilingIterator& 324 TilingSetEvictionQueue::SoonBorderTilingIterator&
342 TilingSetEvictionQueue::SoonBorderTilingIterator:: 325 TilingSetEvictionQueue::SoonBorderTilingIterator::
343 operator++() { 326 operator++() {
344 bool found_tile = AdvanceToNextTile(&iterator_); 327 bool found_tile = AdvanceToNextTile(&iterator_);
345 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { 328 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
346 ++tiling_index_; 329 ++tiling_index_;
347 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) 330 if (!((*tilings_))[tiling_index_]->has_soon_border_rect_tiles())
348 continue; 331 continue;
349 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 332 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
350 (*tilings_)[tiling_index_]->tiling_data(), 333 ((*tilings_))[tiling_index_]->tiling_data(),
351 (*tilings_)[tiling_index_]->current_soon_border_rect(), 334 ((*tilings_))[tiling_index_]->current_soon_border_rect(),
352 (*tilings_)[tiling_index_]->current_skewport_rect(), 335 ((*tilings_))[tiling_index_]->current_skewport_rect(),
353 (*tilings_)[tiling_index_]->current_visible_rect()); 336 ((*tilings_))[tiling_index_]->current_visible_rect());
354 if (!iterator_) 337 if (!iterator_)
355 continue; 338 continue;
356 found_tile = GetFirstTileAndCheckIfValid(&iterator_); 339 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
357 if (!found_tile) 340 if (!found_tile)
358 found_tile = AdvanceToNextTile(&iterator_); 341 found_tile = AdvanceToNextTile(&iterator_);
359 } 342 }
360 return *this; 343 return *this;
361 } 344 }
362 345
363 // SkewportTilingIterator 346 // SkewportTilingIterator
364 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator( 347 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator(
365 std::vector<PictureLayerTiling*>* tilings, 348 std::vector<PictureLayerTiling*>* tilings,
366 WhichTree tree, 349 WhichTree tree,
367 bool skip_shared_out_of_order_tiles) 350 bool skip_shared_out_of_order_tiles)
368 : EvictionRectIterator(tilings, 351 : EvictionRectIterator(tilings, tree, skip_shared_out_of_order_tiles) {
369 tree,
370 skip_shared_out_of_order_tiles,
371 true /* skip_pending_visible_rect */) {
372 // Find the first tiling with a tile. 352 // Find the first tiling with a tile.
373 while (tiling_index_ < tilings_->size()) { 353 while (tiling_index_ < tilings_->size()) {
374 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) { 354 if (!((*tilings_))[tiling_index_]->has_skewport_rect_tiles()) {
375 ++tiling_index_; 355 ++tiling_index_;
376 continue; 356 continue;
377 } 357 }
378 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 358 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
379 (*tilings_)[tiling_index_]->tiling_data(), 359 ((*tilings_))[tiling_index_]->tiling_data(),
380 (*tilings_)[tiling_index_]->current_skewport_rect(), 360 ((*tilings_))[tiling_index_]->current_skewport_rect(),
381 (*tilings_)[tiling_index_]->current_visible_rect(), 361 ((*tilings_))[tiling_index_]->current_visible_rect(),
382 (*tilings_)[tiling_index_]->current_visible_rect()); 362 ((*tilings_))[tiling_index_]->current_visible_rect());
383 if (!iterator_) { 363 if (!iterator_) {
384 ++tiling_index_; 364 ++tiling_index_;
385 continue; 365 continue;
386 } 366 }
387 break; 367 break;
388 } 368 }
389 if (tiling_index_ >= tilings_->size()) 369 if (tiling_index_ >= tilings_->size())
390 return; 370 return;
391 if (!GetFirstTileAndCheckIfValid(&iterator_)) 371 if (!GetFirstTileAndCheckIfValid(&iterator_))
392 ++(*this); 372 ++(*this);
393 } 373 }
394 374
395 TilingSetEvictionQueue::SkewportTilingIterator& 375 TilingSetEvictionQueue::SkewportTilingIterator&
396 TilingSetEvictionQueue::SkewportTilingIterator:: 376 TilingSetEvictionQueue::SkewportTilingIterator::
397 operator++() { 377 operator++() {
398 bool found_tile = AdvanceToNextTile(&iterator_); 378 bool found_tile = AdvanceToNextTile(&iterator_);
399 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { 379 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
400 ++tiling_index_; 380 ++tiling_index_;
401 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) 381 if (!((*tilings_))[tiling_index_]->has_skewport_rect_tiles())
402 continue; 382 continue;
403 iterator_ = TilingData::ReverseSpiralDifferenceIterator( 383 iterator_ = TilingData::ReverseSpiralDifferenceIterator(
404 (*tilings_)[tiling_index_]->tiling_data(), 384 ((*tilings_))[tiling_index_]->tiling_data(),
405 (*tilings_)[tiling_index_]->current_skewport_rect(), 385 ((*tilings_))[tiling_index_]->current_skewport_rect(),
406 (*tilings_)[tiling_index_]->current_visible_rect(), 386 ((*tilings_))[tiling_index_]->current_visible_rect(),
407 (*tilings_)[tiling_index_]->current_visible_rect()); 387 ((*tilings_))[tiling_index_]->current_visible_rect());
408 if (!iterator_) 388 if (!iterator_)
409 continue; 389 continue;
410 found_tile = GetFirstTileAndCheckIfValid(&iterator_); 390 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
411 if (!found_tile) 391 if (!found_tile)
412 found_tile = AdvanceToNextTile(&iterator_); 392 found_tile = AdvanceToNextTile(&iterator_);
413 } 393 }
414 return *this; 394 return *this;
415 } 395 }
416 396
417 // PendingVisibleIterator
418 TilingSetEvictionQueue::PendingVisibleTilingIterator::
419 PendingVisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings,
420 WhichTree tree,
421 bool skip_shared_out_of_order_tiles,
422 bool return_required_for_activation_tiles)
423 : EvictionRectIterator(tilings,
424 tree,
425 skip_shared_out_of_order_tiles,
426 false /* skip_pending_visible_rect */),
427 return_required_for_activation_tiles_(
428 return_required_for_activation_tiles) {
429 // Find the first tiling with a tile.
430 while (tiling_index_ < tilings_->size()) {
431 iterator_ = TilingData::DifferenceIterator(
432 (*tilings_)[tiling_index_]->tiling_data(),
433 (*tilings_)[tiling_index_]->pending_visible_rect(),
434 (*tilings_)[tiling_index_]->current_visible_rect());
435 if (!iterator_) {
436 ++tiling_index_;
437 continue;
438 }
439 break;
440 }
441 if (tiling_index_ >= tilings_->size())
442 return;
443 if (!GetFirstTileAndCheckIfValid(&iterator_)) {
444 ++(*this);
445 return;
446 }
447 if (!TileMatchesRequiredFlags(tile_)) {
448 ++(*this);
449 return;
450 }
451 }
452
453 TilingSetEvictionQueue::PendingVisibleTilingIterator&
454 TilingSetEvictionQueue::PendingVisibleTilingIterator::
455 operator++() {
456 bool found_tile = AdvanceToNextTile(&iterator_);
457 while (found_tile && !TileMatchesRequiredFlags(tile_))
458 found_tile = AdvanceToNextTile(&iterator_);
459
460 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
461 ++tiling_index_;
462 iterator_ = TilingData::DifferenceIterator(
463 (*tilings_)[tiling_index_]->tiling_data(),
464 (*tilings_)[tiling_index_]->pending_visible_rect(),
465 (*tilings_)[tiling_index_]->current_visible_rect());
466 if (!iterator_)
467 continue;
468 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
469 if (!found_tile)
470 found_tile = AdvanceToNextTile(&iterator_);
471 while (found_tile && !TileMatchesRequiredFlags(tile_))
472 found_tile = AdvanceToNextTile(&iterator_);
473 }
474 return *this;
475 }
476
477 bool TilingSetEvictionQueue::PendingVisibleTilingIterator::
478 TileMatchesRequiredFlags(const Tile* tile) const {
479 bool activation_flag_matches =
480 tile->required_for_activation() == return_required_for_activation_tiles_;
481 return activation_flag_matches;
482 }
483
484 // VisibleTilingIterator 397 // VisibleTilingIterator
485 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator( 398 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator(
486 std::vector<PictureLayerTiling*>* tilings, 399 std::vector<PictureLayerTiling*>* tilings,
487 WhichTree tree, 400 WhichTree tree,
488 bool skip_shared_out_of_order_tiles, 401 bool skip_shared_out_of_order_tiles,
489 bool return_occluded_tiles, 402 bool return_occluded_tiles,
490 bool return_required_for_activation_tiles) 403 bool return_required_for_activation_tiles)
491 : EvictionRectIterator(tilings, 404 : EvictionRectIterator(tilings, tree, skip_shared_out_of_order_tiles),
492 tree,
493 skip_shared_out_of_order_tiles,
494 false /* skip_pending_visible_rect */),
495 return_occluded_tiles_(return_occluded_tiles), 405 return_occluded_tiles_(return_occluded_tiles),
496 return_required_for_activation_tiles_( 406 return_required_for_activation_tiles_(
497 return_required_for_activation_tiles) { 407 return_required_for_activation_tiles) {
498 // Find the first tiling with a tile. 408 // Find the first tiling with a tile.
499 while (tiling_index_ < tilings_->size()) { 409 while (tiling_index_ < tilings_->size()) {
500 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) { 410 if (!((*tilings_))[tiling_index_]->has_visible_rect_tiles()) {
501 ++tiling_index_; 411 ++tiling_index_;
502 continue; 412 continue;
503 } 413 }
504 iterator_ = TilingData::Iterator( 414 iterator_ = TilingData::Iterator(
505 (*tilings_)[tiling_index_]->tiling_data(), 415 ((*tilings_))[tiling_index_]->tiling_data(),
506 (*tilings_)[tiling_index_]->current_visible_rect(), false); 416 ((*tilings_))[tiling_index_]->current_visible_rect(), false);
507 if (!iterator_) { 417 if (!iterator_) {
508 ++tiling_index_; 418 ++tiling_index_;
509 continue; 419 continue;
510 } 420 }
511 break; 421 break;
512 } 422 }
513 if (tiling_index_ >= tilings_->size()) 423 if (tiling_index_ >= tilings_->size())
514 return; 424 return;
515 if (!GetFirstTileAndCheckIfValid(&iterator_)) { 425 if (!GetFirstTileAndCheckIfValid(&iterator_)) {
516 ++(*this); 426 ++(*this);
517 return; 427 return;
518 } 428 }
519 if (!TileMatchesRequiredFlags(tile_)) { 429 if (!TileMatchesRequiredFlags(tile_)) {
520 ++(*this); 430 ++(*this);
521 return; 431 return;
522 } 432 }
523 } 433 }
524 434
525 TilingSetEvictionQueue::VisibleTilingIterator& 435 TilingSetEvictionQueue::VisibleTilingIterator&
526 TilingSetEvictionQueue::VisibleTilingIterator:: 436 TilingSetEvictionQueue::VisibleTilingIterator::
527 operator++() { 437 operator++() {
528 bool found_tile = AdvanceToNextTile(&iterator_); 438 bool found_tile = AdvanceToNextTile(&iterator_);
529 while (found_tile && !TileMatchesRequiredFlags(tile_)) 439 while (found_tile && !TileMatchesRequiredFlags(tile_))
530 found_tile = AdvanceToNextTile(&iterator_); 440 found_tile = AdvanceToNextTile(&iterator_);
531 441
532 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { 442 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) {
533 ++tiling_index_; 443 ++tiling_index_;
534 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) 444 if (!((*tilings_))[tiling_index_]->has_visible_rect_tiles())
535 continue; 445 continue;
536 iterator_ = TilingData::Iterator( 446 iterator_ = TilingData::Iterator(
537 (*tilings_)[tiling_index_]->tiling_data(), 447 ((*tilings_))[tiling_index_]->tiling_data(),
538 (*tilings_)[tiling_index_]->current_visible_rect(), false); 448 ((*tilings_))[tiling_index_]->current_visible_rect(), false);
539 if (!iterator_) 449 if (!iterator_)
540 continue; 450 continue;
541 found_tile = GetFirstTileAndCheckIfValid(&iterator_); 451 found_tile = GetFirstTileAndCheckIfValid(&iterator_);
542 if (!found_tile) 452 if (!found_tile)
543 found_tile = AdvanceToNextTile(&iterator_); 453 found_tile = AdvanceToNextTile(&iterator_);
544 while (found_tile && !TileMatchesRequiredFlags(tile_)) 454 while (found_tile && !TileMatchesRequiredFlags(tile_))
545 found_tile = AdvanceToNextTile(&iterator_); 455 found_tile = AdvanceToNextTile(&iterator_);
546 } 456 }
547 return *this; 457 return *this;
548 } 458 }
549 459
550 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags( 460 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags(
551 const Tile* tile) const { 461 const Tile* tile) const {
552 bool activation_flag_matches = 462 bool activation_flag_matches =
553 tile->required_for_activation() == return_required_for_activation_tiles_; 463 tile->required_for_activation() == return_required_for_activation_tiles_;
554 bool occluded_flag_matches = tile->is_occluded() == return_occluded_tiles_; 464 bool occluded_flag_matches =
465 tile->is_occluded(tree_) == return_occluded_tiles_;
555 return activation_flag_matches && occluded_flag_matches; 466 return activation_flag_matches && occluded_flag_matches;
556 } 467 }
557 468
558 } // namespace cc 469 } // namespace cc
OLDNEW
« no previous file with comments | « cc/resources/tiling_set_eviction_queue.h ('k') | cc/resources/tiling_set_raster_queue_all.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698