OLD | NEW |
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 "cc/resources/tiling_set_raster_queue_all.h" | 5 #include "cc/resources/tiling_set_raster_queue_all.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "cc/resources/picture_layer_tiling_set.h" | 9 #include "cc/resources/picture_layer_tiling_set.h" |
10 #include "cc/resources/tile.h" | 10 #include "cc/resources/tile.h" |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
111 | 111 |
112 // First advance the iterator. | 112 // First advance the iterator. |
113 DCHECK(!iterators_[index].done()); | 113 DCHECK(!iterators_[index].done()); |
114 DCHECK(iterators_[index].type() == tile_type); | 114 DCHECK(iterators_[index].type() == tile_type); |
115 ++iterators_[index]; | 115 ++iterators_[index]; |
116 | 116 |
117 if (iterators_[index].done() || iterators_[index].type() != tile_type) | 117 if (iterators_[index].done() || iterators_[index].type() != tile_type) |
118 AdvanceToNextStage(); | 118 AdvanceToNextStage(); |
119 } | 119 } |
120 | 120 |
121 Tile* TilingSetRasterQueueAll::Top() { | 121 const PrioritizedTile& TilingSetRasterQueueAll::Top() const { |
122 DCHECK(!IsEmpty()); | 122 DCHECK(!IsEmpty()); |
123 | 123 |
124 IteratorType index = stages_[current_stage_].iterator_type; | 124 IteratorType index = stages_[current_stage_].iterator_type; |
125 DCHECK(!iterators_[index].done()); | |
126 DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type); | |
127 | |
128 return *iterators_[index]; | |
129 } | |
130 | |
131 const Tile* TilingSetRasterQueueAll::Top() const { | |
132 DCHECK(!IsEmpty()); | |
133 | |
134 IteratorType index = stages_[current_stage_].iterator_type; | |
135 DCHECK(!iterators_[index].done()); | 125 DCHECK(!iterators_[index].done()); |
136 DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type); | 126 DCHECK(iterators_[index].type() == stages_[current_stage_].tile_type); |
137 | 127 |
138 return *iterators_[index]; | 128 return *iterators_[index]; |
139 } | 129 } |
140 | 130 |
141 void TilingSetRasterQueueAll::AdvanceToNextStage() { | 131 void TilingSetRasterQueueAll::AdvanceToNextStage() { |
142 DCHECK_LT(current_stage_, stages_->size()); | 132 DCHECK_LT(current_stage_, stages_->size()); |
143 ++current_stage_; | 133 ++current_stage_; |
144 while (current_stage_ < stages_->size()) { | 134 while (current_stage_ < stages_->size()) { |
145 IteratorType index = stages_[current_stage_].iterator_type; | 135 IteratorType index = stages_[current_stage_].iterator_type; |
146 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; | 136 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; |
147 | 137 |
148 if (!iterators_[index].done() && iterators_[index].type() == tile_type) | 138 if (!iterators_[index].done() && iterators_[index].type() == tile_type) |
149 break; | 139 break; |
150 ++current_stage_; | 140 ++current_stage_; |
151 } | 141 } |
152 } | 142 } |
153 | 143 |
154 // OnePriorityRectIterator | 144 // OnePriorityRectIterator |
155 TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator() | 145 TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator() |
156 : tile_(nullptr), tiling_(nullptr), tiling_data_(nullptr) { | 146 : tiling_(nullptr), tiling_data_(nullptr) { |
157 } | 147 } |
158 | 148 |
159 TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator( | 149 TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator( |
160 PictureLayerTiling* tiling, | 150 PictureLayerTiling* tiling, |
161 TilingData* tiling_data) | 151 TilingData* tiling_data) |
162 : tile_(nullptr), tiling_(tiling), tiling_data_(tiling_data) { | 152 : tiling_(tiling), tiling_data_(tiling_data) { |
163 } | 153 } |
164 | 154 |
165 template <typename TilingIteratorType> | 155 template <typename TilingIteratorType> |
166 void TilingSetRasterQueueAll::OnePriorityRectIterator::AdvanceToNextTile( | 156 void TilingSetRasterQueueAll::OnePriorityRectIterator::AdvanceToNextTile( |
167 TilingIteratorType* iterator) { | 157 TilingIteratorType* iterator) { |
168 tile_ = nullptr; | 158 current_tile_ = PrioritizedTile(); |
169 while (!tile_ || !TileNeedsRaster(tile_)) { | 159 Tile* tile = nullptr; |
| 160 while (!tile || !TileNeedsRaster(tile)) { |
170 ++(*iterator); | 161 ++(*iterator); |
171 if (!(*iterator)) { | 162 if (!(*iterator)) { |
172 tile_ = nullptr; | |
173 return; | 163 return; |
174 } | 164 } |
175 tile_ = tiling_->TileAt(iterator->index_x(), iterator->index_y()); | 165 tile = tiling_->TileAt(iterator->index_x(), iterator->index_y()); |
176 } | 166 } |
177 tiling_->UpdateTilePriority(tile_); | 167 tiling_->UpdateRequiredStatesOnTile(tile); |
| 168 current_tile_ = tiling_->MakePrioritizedTile(tile); |
178 } | 169 } |
179 | 170 |
180 template <typename TilingIteratorType> | 171 template <typename TilingIteratorType> |
181 bool TilingSetRasterQueueAll::OnePriorityRectIterator:: | 172 bool TilingSetRasterQueueAll::OnePriorityRectIterator:: |
182 GetFirstTileAndCheckIfValid(TilingIteratorType* iterator) { | 173 GetFirstTileAndCheckIfValid(TilingIteratorType* iterator) { |
183 tile_ = tiling_->TileAt(iterator->index_x(), iterator->index_y()); | 174 Tile* tile = tiling_->TileAt(iterator->index_x(), iterator->index_y()); |
184 if (!tile_ || !TileNeedsRaster(tile_)) { | 175 if (!tile || !TileNeedsRaster(tile)) { |
185 tile_ = nullptr; | 176 current_tile_ = PrioritizedTile(); |
186 return false; | 177 return false; |
187 } | 178 } |
188 tiling_->UpdateTilePriority(tile_); | 179 tiling_->UpdateRequiredStatesOnTile(tile); |
| 180 current_tile_ = tiling_->MakePrioritizedTile(tile); |
189 return true; | 181 return true; |
190 } | 182 } |
191 | 183 |
192 // VisibleTilingIterator. | 184 // VisibleTilingIterator. |
193 TilingSetRasterQueueAll::VisibleTilingIterator::VisibleTilingIterator( | 185 TilingSetRasterQueueAll::VisibleTilingIterator::VisibleTilingIterator( |
194 PictureLayerTiling* tiling, | 186 PictureLayerTiling* tiling, |
195 TilingData* tiling_data) | 187 TilingData* tiling_data) |
196 : OnePriorityRectIterator(tiling, tiling_data) { | 188 : OnePriorityRectIterator(tiling, tiling_data) { |
197 if (!tiling_->has_visible_rect_tiles()) | 189 if (!tiling_->has_visible_rect_tiles()) |
198 return; | 190 return; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 return; | 235 return; |
244 iterator_ = TilingData::SpiralDifferenceIterator( | 236 iterator_ = TilingData::SpiralDifferenceIterator( |
245 tiling_data_, tiling_->current_skewport_rect(), | 237 tiling_data_, tiling_->current_skewport_rect(), |
246 tiling_->current_visible_rect(), tiling_->current_visible_rect()); | 238 tiling_->current_visible_rect(), tiling_->current_visible_rect()); |
247 if (!iterator_) | 239 if (!iterator_) |
248 return; | 240 return; |
249 if (!GetFirstTileAndCheckIfValid(&iterator_)) { | 241 if (!GetFirstTileAndCheckIfValid(&iterator_)) { |
250 ++(*this); | 242 ++(*this); |
251 return; | 243 return; |
252 } | 244 } |
253 if (tile_->content_rect().Intersects(pending_visible_rect_)) | 245 if (current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
254 ++(*this); | 246 ++(*this); |
255 } | 247 } |
256 | 248 |
257 TilingSetRasterQueueAll::SkewportTilingIterator& | 249 TilingSetRasterQueueAll::SkewportTilingIterator& |
258 TilingSetRasterQueueAll::SkewportTilingIterator:: | 250 TilingSetRasterQueueAll::SkewportTilingIterator:: |
259 operator++() { | 251 operator++() { |
260 AdvanceToNextTile(&iterator_); | 252 AdvanceToNextTile(&iterator_); |
261 while (!done()) { | 253 while (!done()) { |
262 if (!tile_->content_rect().Intersects(pending_visible_rect_)) | 254 if (!current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
263 break; | 255 break; |
264 AdvanceToNextTile(&iterator_); | 256 AdvanceToNextTile(&iterator_); |
265 } | 257 } |
266 return *this; | 258 return *this; |
267 } | 259 } |
268 | 260 |
269 // SoonBorderTilingIterator. | 261 // SoonBorderTilingIterator. |
270 TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator( | 262 TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator( |
271 PictureLayerTiling* tiling, | 263 PictureLayerTiling* tiling, |
272 TilingData* tiling_data) | 264 TilingData* tiling_data) |
273 : OnePriorityRectIterator(tiling, tiling_data), | 265 : OnePriorityRectIterator(tiling, tiling_data), |
274 pending_visible_rect_(tiling->pending_visible_rect()) { | 266 pending_visible_rect_(tiling->pending_visible_rect()) { |
275 if (!tiling_->has_soon_border_rect_tiles()) | 267 if (!tiling_->has_soon_border_rect_tiles()) |
276 return; | 268 return; |
277 iterator_ = TilingData::SpiralDifferenceIterator( | 269 iterator_ = TilingData::SpiralDifferenceIterator( |
278 tiling_data_, tiling_->current_soon_border_rect(), | 270 tiling_data_, tiling_->current_soon_border_rect(), |
279 tiling_->current_skewport_rect(), tiling_->current_visible_rect()); | 271 tiling_->current_skewport_rect(), tiling_->current_visible_rect()); |
280 if (!iterator_) | 272 if (!iterator_) |
281 return; | 273 return; |
282 if (!GetFirstTileAndCheckIfValid(&iterator_)) { | 274 if (!GetFirstTileAndCheckIfValid(&iterator_)) { |
283 ++(*this); | 275 ++(*this); |
284 return; | 276 return; |
285 } | 277 } |
286 if (tile_->content_rect().Intersects(pending_visible_rect_)) | 278 if (current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
287 ++(*this); | 279 ++(*this); |
288 } | 280 } |
289 | 281 |
290 TilingSetRasterQueueAll::SoonBorderTilingIterator& | 282 TilingSetRasterQueueAll::SoonBorderTilingIterator& |
291 TilingSetRasterQueueAll::SoonBorderTilingIterator:: | 283 TilingSetRasterQueueAll::SoonBorderTilingIterator:: |
292 operator++() { | 284 operator++() { |
293 AdvanceToNextTile(&iterator_); | 285 AdvanceToNextTile(&iterator_); |
294 while (!done()) { | 286 while (!done()) { |
295 if (!tile_->content_rect().Intersects(pending_visible_rect_)) | 287 if (!current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
296 break; | 288 break; |
297 AdvanceToNextTile(&iterator_); | 289 AdvanceToNextTile(&iterator_); |
298 } | 290 } |
299 return *this; | 291 return *this; |
300 } | 292 } |
301 | 293 |
302 // EventuallyTilingIterator. | 294 // EventuallyTilingIterator. |
303 TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator( | 295 TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator( |
304 PictureLayerTiling* tiling, | 296 PictureLayerTiling* tiling, |
305 TilingData* tiling_data) | 297 TilingData* tiling_data) |
306 : OnePriorityRectIterator(tiling, tiling_data), | 298 : OnePriorityRectIterator(tiling, tiling_data), |
307 pending_visible_rect_(tiling->pending_visible_rect()) { | 299 pending_visible_rect_(tiling->pending_visible_rect()) { |
308 if (!tiling_->has_eventually_rect_tiles()) | 300 if (!tiling_->has_eventually_rect_tiles()) |
309 return; | 301 return; |
310 iterator_ = TilingData::SpiralDifferenceIterator( | 302 iterator_ = TilingData::SpiralDifferenceIterator( |
311 tiling_data_, tiling_->current_eventually_rect(), | 303 tiling_data_, tiling_->current_eventually_rect(), |
312 tiling_->current_skewport_rect(), tiling_->current_soon_border_rect()); | 304 tiling_->current_skewport_rect(), tiling_->current_soon_border_rect()); |
313 if (!iterator_) | 305 if (!iterator_) |
314 return; | 306 return; |
315 if (!GetFirstTileAndCheckIfValid(&iterator_)) { | 307 if (!GetFirstTileAndCheckIfValid(&iterator_)) { |
316 ++(*this); | 308 ++(*this); |
317 return; | 309 return; |
318 } | 310 } |
319 if (tile_->content_rect().Intersects(pending_visible_rect_)) | 311 if (current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
320 ++(*this); | 312 ++(*this); |
321 } | 313 } |
322 | 314 |
323 TilingSetRasterQueueAll::EventuallyTilingIterator& | 315 TilingSetRasterQueueAll::EventuallyTilingIterator& |
324 TilingSetRasterQueueAll::EventuallyTilingIterator:: | 316 TilingSetRasterQueueAll::EventuallyTilingIterator:: |
325 operator++() { | 317 operator++() { |
326 AdvanceToNextTile(&iterator_); | 318 AdvanceToNextTile(&iterator_); |
327 while (!done()) { | 319 while (!done()) { |
328 if (!tile_->content_rect().Intersects(pending_visible_rect_)) | 320 if (!current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
329 break; | 321 break; |
330 AdvanceToNextTile(&iterator_); | 322 AdvanceToNextTile(&iterator_); |
331 } | 323 } |
332 return *this; | 324 return *this; |
333 } | 325 } |
334 | 326 |
335 // TilingIterator | 327 // TilingIterator |
336 TilingSetRasterQueueAll::TilingIterator::TilingIterator() | 328 TilingSetRasterQueueAll::TilingIterator::TilingIterator() : tiling_(nullptr) { |
337 : tiling_(NULL), current_tile_(NULL) { | |
338 } | 329 } |
339 | 330 |
340 TilingSetRasterQueueAll::TilingIterator::TilingIterator( | 331 TilingSetRasterQueueAll::TilingIterator::TilingIterator( |
341 PictureLayerTiling* tiling, | 332 PictureLayerTiling* tiling, |
342 TilingData* tiling_data) | 333 TilingData* tiling_data) |
343 : tiling_(tiling), | 334 : tiling_(tiling), tiling_data_(tiling_data), phase_(VISIBLE_RECT) { |
344 tiling_data_(tiling_data), | |
345 phase_(VISIBLE_RECT), | |
346 current_tile_(NULL) { | |
347 visible_iterator_ = VisibleTilingIterator(tiling_, tiling_data_); | 335 visible_iterator_ = VisibleTilingIterator(tiling_, tiling_data_); |
348 if (visible_iterator_.done()) { | 336 if (visible_iterator_.done()) { |
349 AdvancePhase(); | 337 AdvancePhase(); |
350 return; | 338 return; |
351 } | 339 } |
352 current_tile_ = *visible_iterator_; | 340 current_tile_ = *visible_iterator_; |
353 } | 341 } |
354 | 342 |
355 TilingSetRasterQueueAll::TilingIterator::~TilingIterator() { | 343 TilingSetRasterQueueAll::TilingIterator::~TilingIterator() { |
356 } | 344 } |
357 | 345 |
358 void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() { | 346 void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() { |
359 DCHECK_LT(phase_, EVENTUALLY_RECT); | 347 DCHECK_LT(phase_, EVENTUALLY_RECT); |
360 | 348 |
361 current_tile_ = nullptr; | 349 current_tile_ = PrioritizedTile(); |
362 while (!current_tile_ && phase_ < EVENTUALLY_RECT) { | 350 while (!current_tile_.tile() && phase_ < EVENTUALLY_RECT) { |
363 phase_ = static_cast<Phase>(phase_ + 1); | 351 phase_ = static_cast<Phase>(phase_ + 1); |
364 switch (phase_) { | 352 switch (phase_) { |
365 case VISIBLE_RECT: | 353 case VISIBLE_RECT: |
366 NOTREACHED(); | 354 NOTREACHED(); |
367 return; | 355 return; |
368 case PENDING_VISIBLE_RECT: | 356 case PENDING_VISIBLE_RECT: |
369 pending_visible_iterator_ = | 357 pending_visible_iterator_ = |
370 PendingVisibleTilingIterator(tiling_, tiling_data_); | 358 PendingVisibleTilingIterator(tiling_, tiling_data_); |
371 if (!pending_visible_iterator_.done()) | 359 if (!pending_visible_iterator_.done()) |
372 current_tile_ = *pending_visible_iterator_; | 360 current_tile_ = *pending_visible_iterator_; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 ++soon_border_iterator_; | 410 ++soon_border_iterator_; |
423 if (soon_border_iterator_.done()) { | 411 if (soon_border_iterator_.done()) { |
424 AdvancePhase(); | 412 AdvancePhase(); |
425 return *this; | 413 return *this; |
426 } | 414 } |
427 current_tile_ = *soon_border_iterator_; | 415 current_tile_ = *soon_border_iterator_; |
428 break; | 416 break; |
429 case EVENTUALLY_RECT: | 417 case EVENTUALLY_RECT: |
430 ++eventually_iterator_; | 418 ++eventually_iterator_; |
431 if (eventually_iterator_.done()) { | 419 if (eventually_iterator_.done()) { |
432 current_tile_ = nullptr; | 420 current_tile_ = PrioritizedTile(); |
433 return *this; | 421 return *this; |
434 } | 422 } |
435 current_tile_ = *eventually_iterator_; | 423 current_tile_ = *eventually_iterator_; |
436 break; | 424 break; |
437 } | 425 } |
438 return *this; | 426 return *this; |
439 } | 427 } |
440 | 428 |
441 } // namespace cc | 429 } // namespace cc |
OLD | NEW |