OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include <utility> | |
6 | |
7 #include "cc/resources/tiling_set_eviction_queue.h" | |
8 | |
9 namespace cc { | |
10 | |
11 TilingSetEvictionQueue::TilingSetEvictionQueue( | |
12 PictureLayerTilingSet* tiling_set) | |
13 : tree_(tiling_set->tree()), phase_(EVENTUALLY_RECT) { | |
14 // Early out if the layer has no tilings. | |
15 if (!tiling_set->num_tilings()) | |
16 return; | |
17 GenerateTilingOrder(tiling_set); | |
18 eventually_iterator_ = EventuallyTilingIterator(&tilings_, tree_); | |
19 if (eventually_iterator_.done()) { | |
20 AdvancePhase(); | |
21 return; | |
22 } | |
23 current_tile_ = *eventually_iterator_; | |
24 } | |
25 | |
26 TilingSetEvictionQueue::~TilingSetEvictionQueue() { | |
27 } | |
28 | |
29 void TilingSetEvictionQueue::GenerateTilingOrder( | |
30 PictureLayerTilingSet* tiling_set) { | |
31 tilings_.reserve(tiling_set->num_tilings()); | |
32 // Generate all of the tilings in the order described in the header comment | |
33 // for this class. | |
34 PictureLayerTilingSet::TilingRange range = | |
35 tiling_set->GetTilingRange(PictureLayerTilingSet::HIGHER_THAN_HIGH_RES); | |
36 for (int i = range.start; i < range.end; ++i) { | |
37 PictureLayerTiling* tiling = tiling_set->tiling_at(i); | |
38 if (tiling->has_tiles()) | |
39 tilings_.push_back(tiling); | |
40 } | |
41 | |
42 range = tiling_set->GetTilingRange(PictureLayerTilingSet::LOWER_THAN_LOW_RES); | |
43 for (int i = range.end - 1; i >= range.start; --i) { | |
44 PictureLayerTiling* tiling = tiling_set->tiling_at(i); | |
45 if (tiling->has_tiles()) | |
46 tilings_.push_back(tiling); | |
47 } | |
48 | |
49 range = tiling_set->GetTilingRange( | |
50 PictureLayerTilingSet::BETWEEN_HIGH_AND_LOW_RES); | |
51 for (int i = range.end - 1; i >= range.start; --i) { | |
52 PictureLayerTiling* tiling = tiling_set->tiling_at(i); | |
53 if (tiling->has_tiles()) | |
54 tilings_.push_back(tiling); | |
55 } | |
56 | |
57 range = tiling_set->GetTilingRange(PictureLayerTilingSet::LOW_RES); | |
58 for (int i = range.start; i < range.end; ++i) { | |
59 PictureLayerTiling* tiling = tiling_set->tiling_at(i); | |
60 if (tiling->has_tiles()) | |
61 tilings_.push_back(tiling); | |
62 } | |
63 | |
64 range = tiling_set->GetTilingRange(PictureLayerTilingSet::HIGH_RES); | |
65 for (int i = range.start; i < range.end; ++i) { | |
66 PictureLayerTiling* tiling = tiling_set->tiling_at(i); | |
67 if (tiling->has_tiles()) | |
68 tilings_.push_back(tiling); | |
69 } | |
70 DCHECK_GE(tiling_set->num_tilings(), tilings_.size()); | |
71 } | |
72 | |
73 void TilingSetEvictionQueue::AdvancePhase() { | |
74 current_tile_ = PrioritizedTile(); | |
75 while (!current_tile_.tile() && | |
76 phase_ != VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED) { | |
77 phase_ = static_cast<Phase>(phase_ + 1); | |
78 switch (phase_) { | |
79 case EVENTUALLY_RECT: | |
80 NOTREACHED(); | |
81 break; | |
82 case SOON_BORDER_RECT: | |
83 soon_iterator_ = SoonBorderTilingIterator(&tilings_, tree_); | |
84 if (!soon_iterator_.done()) | |
85 current_tile_ = *soon_iterator_; | |
86 break; | |
87 case SKEWPORT_RECT: | |
88 skewport_iterator_ = SkewportTilingIterator(&tilings_, tree_); | |
89 if (!skewport_iterator_.done()) | |
90 current_tile_ = *skewport_iterator_; | |
91 break; | |
92 case PENDING_VISIBLE_RECT: | |
93 pending_visible_iterator_ = PendingVisibleTilingIterator( | |
94 &tilings_, tree_, false /* return required for activation tiles */); | |
95 if (!pending_visible_iterator_.done()) | |
96 current_tile_ = *pending_visible_iterator_; | |
97 break; | |
98 case PENDING_VISIBLE_RECT_REQUIRED_FOR_ACTIVATION: | |
99 pending_visible_iterator_ = PendingVisibleTilingIterator( | |
100 &tilings_, tree_, true /* return required for activation tiles */); | |
101 if (!pending_visible_iterator_.done()) | |
102 current_tile_ = *pending_visible_iterator_; | |
103 break; | |
104 case VISIBLE_RECT_OCCLUDED: | |
105 visible_iterator_ = VisibleTilingIterator( | |
106 &tilings_, tree_, true /* return occluded tiles */, | |
107 false /* return required for activation tiles */); | |
108 if (!visible_iterator_.done()) | |
109 current_tile_ = *visible_iterator_; | |
110 break; | |
111 case VISIBLE_RECT_UNOCCLUDED: | |
112 visible_iterator_ = VisibleTilingIterator( | |
113 &tilings_, tree_, false /* return occluded tiles */, | |
114 false /* return required for activation tiles */); | |
115 if (!visible_iterator_.done()) | |
116 current_tile_ = *visible_iterator_; | |
117 break; | |
118 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED: | |
119 visible_iterator_ = VisibleTilingIterator( | |
120 &tilings_, tree_, true /* return occluded tiles */, | |
121 true /* return required for activation tiles */); | |
122 if (!visible_iterator_.done()) | |
123 current_tile_ = *visible_iterator_; | |
124 break; | |
125 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED: | |
126 visible_iterator_ = VisibleTilingIterator( | |
127 &tilings_, tree_, false /* return occluded tiles */, | |
128 true /* return required for activation tiles */); | |
129 if (!visible_iterator_.done()) | |
130 current_tile_ = *visible_iterator_; | |
131 break; | |
132 } | |
133 } | |
134 } | |
135 | |
136 bool TilingSetEvictionQueue::IsEmpty() const { | |
137 return !current_tile_.tile(); | |
138 } | |
139 | |
140 const PrioritizedTile& TilingSetEvictionQueue::Top() const { | |
141 DCHECK(!IsEmpty()); | |
142 return current_tile_; | |
143 } | |
144 | |
145 void TilingSetEvictionQueue::Pop() { | |
146 DCHECK(!IsEmpty()); | |
147 current_tile_ = PrioritizedTile(); | |
148 switch (phase_) { | |
149 case EVENTUALLY_RECT: | |
150 ++eventually_iterator_; | |
151 if (!eventually_iterator_.done()) | |
152 current_tile_ = *eventually_iterator_; | |
153 break; | |
154 case SOON_BORDER_RECT: | |
155 ++soon_iterator_; | |
156 if (!soon_iterator_.done()) | |
157 current_tile_ = *soon_iterator_; | |
158 break; | |
159 case SKEWPORT_RECT: | |
160 ++skewport_iterator_; | |
161 if (!skewport_iterator_.done()) | |
162 current_tile_ = *skewport_iterator_; | |
163 break; | |
164 case PENDING_VISIBLE_RECT: | |
165 case PENDING_VISIBLE_RECT_REQUIRED_FOR_ACTIVATION: | |
166 ++pending_visible_iterator_; | |
167 if (!pending_visible_iterator_.done()) | |
168 current_tile_ = *pending_visible_iterator_; | |
169 break; | |
170 case VISIBLE_RECT_OCCLUDED: | |
171 case VISIBLE_RECT_UNOCCLUDED: | |
172 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_OCCLUDED: | |
173 case VISIBLE_RECT_REQUIRED_FOR_ACTIVATION_UNOCCLUDED: | |
174 ++visible_iterator_; | |
175 if (!visible_iterator_.done()) | |
176 current_tile_ = *visible_iterator_; | |
177 break; | |
178 } | |
179 if (!current_tile_.tile()) | |
180 AdvancePhase(); | |
181 } | |
182 | |
183 // EvictionRectIterator | |
184 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator() | |
185 : tilings_(nullptr), tree_(ACTIVE_TREE), tiling_index_(0) { | |
186 } | |
187 | |
188 TilingSetEvictionQueue::EvictionRectIterator::EvictionRectIterator( | |
189 std::vector<PictureLayerTiling*>* tilings, | |
190 WhichTree tree, | |
191 PictureLayerTiling::PriorityRectType priority_rect_type) | |
192 : tilings_(tilings), | |
193 tree_(tree), | |
194 priority_rect_type_(priority_rect_type), | |
195 tiling_index_(0) { | |
196 } | |
197 | |
198 template <typename TilingIteratorType> | |
199 bool TilingSetEvictionQueue::EvictionRectIterator::AdvanceToNextTile( | |
200 TilingIteratorType* iterator) { | |
201 bool found_tile = false; | |
202 while (!found_tile) { | |
203 ++(*iterator); | |
204 if (!(*iterator)) { | |
205 prioritized_tile_ = PrioritizedTile(); | |
206 break; | |
207 } | |
208 found_tile = GetFirstTileAndCheckIfValid(iterator); | |
209 } | |
210 return found_tile; | |
211 } | |
212 | |
213 template <typename TilingIteratorType> | |
214 bool TilingSetEvictionQueue::EvictionRectIterator::GetFirstTileAndCheckIfValid( | |
215 TilingIteratorType* iterator) { | |
216 PictureLayerTiling* tiling = (*tilings_)[tiling_index_]; | |
217 Tile* tile = tiling->TileAt(iterator->index_x(), iterator->index_y()); | |
218 prioritized_tile_ = PrioritizedTile(); | |
219 // If there's nothing to evict, return false. | |
220 if (!tile || !tile->draw_info().has_resource()) | |
221 return false; | |
222 // After the pending visible rect has been processed, we must return false | |
223 // for pending visible rect tiles as tiling iterators do not ignore those | |
224 // tiles. | |
225 if (priority_rect_type_ > PictureLayerTiling::PENDING_VISIBLE_RECT && | |
226 tiling->pending_visible_rect().Intersects(tile->content_rect())) { | |
227 return false; | |
228 } | |
229 (*tilings_)[tiling_index_]->UpdateRequiredStatesOnTile(tile); | |
230 prioritized_tile_ = (*tilings_)[tiling_index_]->MakePrioritizedTile( | |
231 tile, priority_rect_type_); | |
232 // In other cases, the tile we got is a viable candidate, return true. | |
233 return true; | |
234 } | |
235 | |
236 // EventuallyTilingIterator | |
237 TilingSetEvictionQueue::EventuallyTilingIterator::EventuallyTilingIterator( | |
238 std::vector<PictureLayerTiling*>* tilings, | |
239 WhichTree tree) | |
240 : EvictionRectIterator(tilings, tree, PictureLayerTiling::EVENTUALLY_RECT) { | |
241 // Find the first tiling with a tile. | |
242 while (tiling_index_ < tilings_->size()) { | |
243 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) { | |
244 ++tiling_index_; | |
245 continue; | |
246 } | |
247 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | |
248 (*tilings_)[tiling_index_]->tiling_data(), | |
249 (*tilings_)[tiling_index_]->current_eventually_rect(), | |
250 (*tilings_)[tiling_index_]->current_skewport_rect(), | |
251 (*tilings_)[tiling_index_]->current_soon_border_rect()); | |
252 if (!iterator_) { | |
253 ++tiling_index_; | |
254 continue; | |
255 } | |
256 break; | |
257 } | |
258 if (tiling_index_ >= tilings_->size()) | |
259 return; | |
260 if (!GetFirstTileAndCheckIfValid(&iterator_)) | |
261 ++(*this); | |
262 } | |
263 | |
264 TilingSetEvictionQueue::EventuallyTilingIterator& | |
265 TilingSetEvictionQueue::EventuallyTilingIterator:: | |
266 operator++() { | |
267 bool found_tile = AdvanceToNextTile(&iterator_); | |
268 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { | |
269 ++tiling_index_; | |
270 if (!(*tilings_)[tiling_index_]->has_eventually_rect_tiles()) | |
271 continue; | |
272 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | |
273 (*tilings_)[tiling_index_]->tiling_data(), | |
274 (*tilings_)[tiling_index_]->current_eventually_rect(), | |
275 (*tilings_)[tiling_index_]->current_skewport_rect(), | |
276 (*tilings_)[tiling_index_]->current_soon_border_rect()); | |
277 if (!iterator_) | |
278 continue; | |
279 found_tile = GetFirstTileAndCheckIfValid(&iterator_); | |
280 if (!found_tile) | |
281 found_tile = AdvanceToNextTile(&iterator_); | |
282 } | |
283 return *this; | |
284 } | |
285 | |
286 // SoonBorderTilingIterator | |
287 TilingSetEvictionQueue::SoonBorderTilingIterator::SoonBorderTilingIterator( | |
288 std::vector<PictureLayerTiling*>* tilings, | |
289 WhichTree tree) | |
290 : EvictionRectIterator(tilings, | |
291 tree, | |
292 PictureLayerTiling::SOON_BORDER_RECT) { | |
293 // Find the first tiling with a tile. | |
294 while (tiling_index_ < tilings_->size()) { | |
295 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) { | |
296 ++tiling_index_; | |
297 continue; | |
298 } | |
299 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | |
300 (*tilings_)[tiling_index_]->tiling_data(), | |
301 (*tilings_)[tiling_index_]->current_soon_border_rect(), | |
302 (*tilings_)[tiling_index_]->current_skewport_rect(), | |
303 (*tilings_)[tiling_index_]->current_visible_rect()); | |
304 if (!iterator_) { | |
305 ++tiling_index_; | |
306 continue; | |
307 } | |
308 break; | |
309 } | |
310 if (tiling_index_ >= tilings_->size()) | |
311 return; | |
312 if (!GetFirstTileAndCheckIfValid(&iterator_)) | |
313 ++(*this); | |
314 } | |
315 | |
316 TilingSetEvictionQueue::SoonBorderTilingIterator& | |
317 TilingSetEvictionQueue::SoonBorderTilingIterator:: | |
318 operator++() { | |
319 bool found_tile = AdvanceToNextTile(&iterator_); | |
320 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { | |
321 ++tiling_index_; | |
322 if (!(*tilings_)[tiling_index_]->has_soon_border_rect_tiles()) | |
323 continue; | |
324 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | |
325 (*tilings_)[tiling_index_]->tiling_data(), | |
326 (*tilings_)[tiling_index_]->current_soon_border_rect(), | |
327 (*tilings_)[tiling_index_]->current_skewport_rect(), | |
328 (*tilings_)[tiling_index_]->current_visible_rect()); | |
329 if (!iterator_) | |
330 continue; | |
331 found_tile = GetFirstTileAndCheckIfValid(&iterator_); | |
332 if (!found_tile) | |
333 found_tile = AdvanceToNextTile(&iterator_); | |
334 } | |
335 return *this; | |
336 } | |
337 | |
338 // SkewportTilingIterator | |
339 TilingSetEvictionQueue::SkewportTilingIterator::SkewportTilingIterator( | |
340 std::vector<PictureLayerTiling*>* tilings, | |
341 WhichTree tree) | |
342 : EvictionRectIterator(tilings, tree, PictureLayerTiling::SKEWPORT_RECT) { | |
343 // Find the first tiling with a tile. | |
344 while (tiling_index_ < tilings_->size()) { | |
345 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) { | |
346 ++tiling_index_; | |
347 continue; | |
348 } | |
349 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | |
350 (*tilings_)[tiling_index_]->tiling_data(), | |
351 (*tilings_)[tiling_index_]->current_skewport_rect(), | |
352 (*tilings_)[tiling_index_]->current_visible_rect(), | |
353 (*tilings_)[tiling_index_]->current_visible_rect()); | |
354 if (!iterator_) { | |
355 ++tiling_index_; | |
356 continue; | |
357 } | |
358 break; | |
359 } | |
360 if (tiling_index_ >= tilings_->size()) | |
361 return; | |
362 if (!GetFirstTileAndCheckIfValid(&iterator_)) | |
363 ++(*this); | |
364 } | |
365 | |
366 TilingSetEvictionQueue::SkewportTilingIterator& | |
367 TilingSetEvictionQueue::SkewportTilingIterator:: | |
368 operator++() { | |
369 bool found_tile = AdvanceToNextTile(&iterator_); | |
370 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { | |
371 ++tiling_index_; | |
372 if (!(*tilings_)[tiling_index_]->has_skewport_rect_tiles()) | |
373 continue; | |
374 iterator_ = TilingData::ReverseSpiralDifferenceIterator( | |
375 (*tilings_)[tiling_index_]->tiling_data(), | |
376 (*tilings_)[tiling_index_]->current_skewport_rect(), | |
377 (*tilings_)[tiling_index_]->current_visible_rect(), | |
378 (*tilings_)[tiling_index_]->current_visible_rect()); | |
379 if (!iterator_) | |
380 continue; | |
381 found_tile = GetFirstTileAndCheckIfValid(&iterator_); | |
382 if (!found_tile) | |
383 found_tile = AdvanceToNextTile(&iterator_); | |
384 } | |
385 return *this; | |
386 } | |
387 | |
388 // PendingVisibleIterator | |
389 TilingSetEvictionQueue::PendingVisibleTilingIterator:: | |
390 PendingVisibleTilingIterator(std::vector<PictureLayerTiling*>* tilings, | |
391 WhichTree tree, | |
392 bool return_required_for_activation_tiles) | |
393 : EvictionRectIterator(tilings, | |
394 tree, | |
395 PictureLayerTiling::PENDING_VISIBLE_RECT), | |
396 return_required_for_activation_tiles_( | |
397 return_required_for_activation_tiles) { | |
398 // Find the first tiling with a tile. | |
399 while (tiling_index_ < tilings_->size()) { | |
400 iterator_ = TilingData::DifferenceIterator( | |
401 (*tilings_)[tiling_index_]->tiling_data(), | |
402 (*tilings_)[tiling_index_]->pending_visible_rect(), | |
403 (*tilings_)[tiling_index_]->current_visible_rect()); | |
404 if (!iterator_) { | |
405 ++tiling_index_; | |
406 continue; | |
407 } | |
408 break; | |
409 } | |
410 if (tiling_index_ >= tilings_->size()) | |
411 return; | |
412 if (!GetFirstTileAndCheckIfValid(&iterator_)) { | |
413 ++(*this); | |
414 return; | |
415 } | |
416 if (!TileMatchesRequiredFlags(prioritized_tile_)) { | |
417 ++(*this); | |
418 return; | |
419 } | |
420 } | |
421 | |
422 TilingSetEvictionQueue::PendingVisibleTilingIterator& | |
423 TilingSetEvictionQueue::PendingVisibleTilingIterator:: | |
424 operator++() { | |
425 bool found_tile = AdvanceToNextTile(&iterator_); | |
426 while (found_tile && !TileMatchesRequiredFlags(prioritized_tile_)) | |
427 found_tile = AdvanceToNextTile(&iterator_); | |
428 | |
429 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { | |
430 ++tiling_index_; | |
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 continue; | |
437 found_tile = GetFirstTileAndCheckIfValid(&iterator_); | |
438 if (!found_tile) | |
439 found_tile = AdvanceToNextTile(&iterator_); | |
440 while (found_tile && !TileMatchesRequiredFlags(prioritized_tile_)) | |
441 found_tile = AdvanceToNextTile(&iterator_); | |
442 } | |
443 return *this; | |
444 } | |
445 | |
446 bool TilingSetEvictionQueue::PendingVisibleTilingIterator:: | |
447 TileMatchesRequiredFlags(const PrioritizedTile& tile) const { | |
448 bool activation_flag_matches = tile.tile()->required_for_activation() == | |
449 return_required_for_activation_tiles_; | |
450 return activation_flag_matches; | |
451 } | |
452 | |
453 // VisibleTilingIterator | |
454 TilingSetEvictionQueue::VisibleTilingIterator::VisibleTilingIterator( | |
455 std::vector<PictureLayerTiling*>* tilings, | |
456 WhichTree tree, | |
457 bool return_occluded_tiles, | |
458 bool return_required_for_activation_tiles) | |
459 : EvictionRectIterator(tilings, tree, PictureLayerTiling::VISIBLE_RECT), | |
460 return_occluded_tiles_(return_occluded_tiles), | |
461 return_required_for_activation_tiles_( | |
462 return_required_for_activation_tiles) { | |
463 // Find the first tiling with a tile. | |
464 while (tiling_index_ < tilings_->size()) { | |
465 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) { | |
466 ++tiling_index_; | |
467 continue; | |
468 } | |
469 iterator_ = TilingData::Iterator( | |
470 (*tilings_)[tiling_index_]->tiling_data(), | |
471 (*tilings_)[tiling_index_]->current_visible_rect(), false); | |
472 if (!iterator_) { | |
473 ++tiling_index_; | |
474 continue; | |
475 } | |
476 break; | |
477 } | |
478 if (tiling_index_ >= tilings_->size()) | |
479 return; | |
480 if (!GetFirstTileAndCheckIfValid(&iterator_)) { | |
481 ++(*this); | |
482 return; | |
483 } | |
484 if (!TileMatchesRequiredFlags(prioritized_tile_)) { | |
485 ++(*this); | |
486 return; | |
487 } | |
488 } | |
489 | |
490 TilingSetEvictionQueue::VisibleTilingIterator& | |
491 TilingSetEvictionQueue::VisibleTilingIterator:: | |
492 operator++() { | |
493 bool found_tile = AdvanceToNextTile(&iterator_); | |
494 while (found_tile && !TileMatchesRequiredFlags(prioritized_tile_)) | |
495 found_tile = AdvanceToNextTile(&iterator_); | |
496 | |
497 while (!found_tile && (tiling_index_ + 1) < tilings_->size()) { | |
498 ++tiling_index_; | |
499 if (!(*tilings_)[tiling_index_]->has_visible_rect_tiles()) | |
500 continue; | |
501 iterator_ = TilingData::Iterator( | |
502 (*tilings_)[tiling_index_]->tiling_data(), | |
503 (*tilings_)[tiling_index_]->current_visible_rect(), false); | |
504 if (!iterator_) | |
505 continue; | |
506 found_tile = GetFirstTileAndCheckIfValid(&iterator_); | |
507 if (!found_tile) | |
508 found_tile = AdvanceToNextTile(&iterator_); | |
509 while (found_tile && !TileMatchesRequiredFlags(prioritized_tile_)) | |
510 found_tile = AdvanceToNextTile(&iterator_); | |
511 } | |
512 return *this; | |
513 } | |
514 | |
515 bool TilingSetEvictionQueue::VisibleTilingIterator::TileMatchesRequiredFlags( | |
516 const PrioritizedTile& tile) const { | |
517 bool activation_flag_matches = tile.tile()->required_for_activation() == | |
518 return_required_for_activation_tiles_; | |
519 bool occluded_flag_matches = tile.is_occluded() == return_occluded_tiles_; | |
520 return activation_flag_matches && occluded_flag_matches; | |
521 } | |
522 | |
523 } // namespace cc | |
OLD | NEW |