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_.Invalidate(); |
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 current_tile_.UpdateTile(tile, tiling_); |
178 } | 168 } |
179 | 169 |
180 template <typename TilingIteratorType> | 170 template <typename TilingIteratorType> |
181 bool TilingSetRasterQueueAll::OnePriorityRectIterator:: | 171 bool TilingSetRasterQueueAll::OnePriorityRectIterator:: |
182 GetFirstTileAndCheckIfValid(TilingIteratorType* iterator) { | 172 GetFirstTileAndCheckIfValid(TilingIteratorType* iterator) { |
183 tile_ = tiling_->TileAt(iterator->index_x(), iterator->index_y()); | 173 Tile* tile = tiling_->TileAt(iterator->index_x(), iterator->index_y()); |
184 if (!tile_ || !TileNeedsRaster(tile_)) { | 174 if (!tile || !TileNeedsRaster(tile)) { |
185 tile_ = nullptr; | 175 current_tile_.Invalidate(); |
186 return false; | 176 return false; |
187 } | 177 } |
188 tiling_->UpdateTilePriority(tile_); | 178 current_tile_.UpdateTile(tile, tiling_); |
189 return true; | 179 return true; |
190 } | 180 } |
191 | 181 |
192 // VisibleTilingIterator. | 182 // VisibleTilingIterator. |
193 TilingSetRasterQueueAll::VisibleTilingIterator::VisibleTilingIterator( | 183 TilingSetRasterQueueAll::VisibleTilingIterator::VisibleTilingIterator( |
194 PictureLayerTiling* tiling, | 184 PictureLayerTiling* tiling, |
195 TilingData* tiling_data) | 185 TilingData* tiling_data) |
196 : OnePriorityRectIterator(tiling, tiling_data) { | 186 : OnePriorityRectIterator(tiling, tiling_data) { |
197 if (!tiling_->has_visible_rect_tiles()) | 187 if (!tiling_->has_visible_rect_tiles()) |
198 return; | 188 return; |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
243 return; | 233 return; |
244 iterator_ = TilingData::SpiralDifferenceIterator( | 234 iterator_ = TilingData::SpiralDifferenceIterator( |
245 tiling_data_, tiling_->current_skewport_rect(), | 235 tiling_data_, tiling_->current_skewport_rect(), |
246 tiling_->current_visible_rect(), tiling_->current_visible_rect()); | 236 tiling_->current_visible_rect(), tiling_->current_visible_rect()); |
247 if (!iterator_) | 237 if (!iterator_) |
248 return; | 238 return; |
249 if (!GetFirstTileAndCheckIfValid(&iterator_)) { | 239 if (!GetFirstTileAndCheckIfValid(&iterator_)) { |
250 ++(*this); | 240 ++(*this); |
251 return; | 241 return; |
252 } | 242 } |
253 if (tile_->content_rect().Intersects(pending_visible_rect_)) | 243 if (current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
254 ++(*this); | 244 ++(*this); |
255 } | 245 } |
256 | 246 |
257 TilingSetRasterQueueAll::SkewportTilingIterator& | 247 TilingSetRasterQueueAll::SkewportTilingIterator& |
258 TilingSetRasterQueueAll::SkewportTilingIterator:: | 248 TilingSetRasterQueueAll::SkewportTilingIterator:: |
259 operator++() { | 249 operator++() { |
260 AdvanceToNextTile(&iterator_); | 250 AdvanceToNextTile(&iterator_); |
261 while (!done()) { | 251 while (!done()) { |
262 if (!tile_->content_rect().Intersects(pending_visible_rect_)) | 252 if (!current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
263 break; | 253 break; |
264 AdvanceToNextTile(&iterator_); | 254 AdvanceToNextTile(&iterator_); |
265 } | 255 } |
266 return *this; | 256 return *this; |
267 } | 257 } |
268 | 258 |
269 // SoonBorderTilingIterator. | 259 // SoonBorderTilingIterator. |
270 TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator( | 260 TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator( |
271 PictureLayerTiling* tiling, | 261 PictureLayerTiling* tiling, |
272 TilingData* tiling_data) | 262 TilingData* tiling_data) |
273 : OnePriorityRectIterator(tiling, tiling_data), | 263 : OnePriorityRectIterator(tiling, tiling_data), |
274 pending_visible_rect_(tiling->pending_visible_rect()) { | 264 pending_visible_rect_(tiling->pending_visible_rect()) { |
275 if (!tiling_->has_soon_border_rect_tiles()) | 265 if (!tiling_->has_soon_border_rect_tiles()) |
276 return; | 266 return; |
277 iterator_ = TilingData::SpiralDifferenceIterator( | 267 iterator_ = TilingData::SpiralDifferenceIterator( |
278 tiling_data_, tiling_->current_soon_border_rect(), | 268 tiling_data_, tiling_->current_soon_border_rect(), |
279 tiling_->current_skewport_rect(), tiling_->current_visible_rect()); | 269 tiling_->current_skewport_rect(), tiling_->current_visible_rect()); |
280 if (!iterator_) | 270 if (!iterator_) |
281 return; | 271 return; |
282 if (!GetFirstTileAndCheckIfValid(&iterator_)) { | 272 if (!GetFirstTileAndCheckIfValid(&iterator_)) { |
283 ++(*this); | 273 ++(*this); |
284 return; | 274 return; |
285 } | 275 } |
286 if (tile_->content_rect().Intersects(pending_visible_rect_)) | 276 if (current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
287 ++(*this); | 277 ++(*this); |
288 } | 278 } |
289 | 279 |
290 TilingSetRasterQueueAll::SoonBorderTilingIterator& | 280 TilingSetRasterQueueAll::SoonBorderTilingIterator& |
291 TilingSetRasterQueueAll::SoonBorderTilingIterator:: | 281 TilingSetRasterQueueAll::SoonBorderTilingIterator:: |
292 operator++() { | 282 operator++() { |
293 AdvanceToNextTile(&iterator_); | 283 AdvanceToNextTile(&iterator_); |
294 while (!done()) { | 284 while (!done()) { |
295 if (!tile_->content_rect().Intersects(pending_visible_rect_)) | 285 if (!current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
296 break; | 286 break; |
297 AdvanceToNextTile(&iterator_); | 287 AdvanceToNextTile(&iterator_); |
298 } | 288 } |
299 return *this; | 289 return *this; |
300 } | 290 } |
301 | 291 |
302 // EventuallyTilingIterator. | 292 // EventuallyTilingIterator. |
303 TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator( | 293 TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator( |
304 PictureLayerTiling* tiling, | 294 PictureLayerTiling* tiling, |
305 TilingData* tiling_data) | 295 TilingData* tiling_data) |
306 : OnePriorityRectIterator(tiling, tiling_data), | 296 : OnePriorityRectIterator(tiling, tiling_data), |
307 pending_visible_rect_(tiling->pending_visible_rect()) { | 297 pending_visible_rect_(tiling->pending_visible_rect()) { |
308 if (!tiling_->has_eventually_rect_tiles()) | 298 if (!tiling_->has_eventually_rect_tiles()) |
309 return; | 299 return; |
310 iterator_ = TilingData::SpiralDifferenceIterator( | 300 iterator_ = TilingData::SpiralDifferenceIterator( |
311 tiling_data_, tiling_->current_eventually_rect(), | 301 tiling_data_, tiling_->current_eventually_rect(), |
312 tiling_->current_skewport_rect(), tiling_->current_soon_border_rect()); | 302 tiling_->current_skewport_rect(), tiling_->current_soon_border_rect()); |
313 if (!iterator_) | 303 if (!iterator_) |
314 return; | 304 return; |
315 if (!GetFirstTileAndCheckIfValid(&iterator_)) { | 305 if (!GetFirstTileAndCheckIfValid(&iterator_)) { |
316 ++(*this); | 306 ++(*this); |
317 return; | 307 return; |
318 } | 308 } |
319 if (tile_->content_rect().Intersects(pending_visible_rect_)) | 309 if (current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
320 ++(*this); | 310 ++(*this); |
321 } | 311 } |
322 | 312 |
323 TilingSetRasterQueueAll::EventuallyTilingIterator& | 313 TilingSetRasterQueueAll::EventuallyTilingIterator& |
324 TilingSetRasterQueueAll::EventuallyTilingIterator:: | 314 TilingSetRasterQueueAll::EventuallyTilingIterator:: |
325 operator++() { | 315 operator++() { |
326 AdvanceToNextTile(&iterator_); | 316 AdvanceToNextTile(&iterator_); |
327 while (!done()) { | 317 while (!done()) { |
328 if (!tile_->content_rect().Intersects(pending_visible_rect_)) | 318 if (!current_tile_.tile()->content_rect().Intersects(pending_visible_rect_)) |
329 break; | 319 break; |
330 AdvanceToNextTile(&iterator_); | 320 AdvanceToNextTile(&iterator_); |
331 } | 321 } |
332 return *this; | 322 return *this; |
333 } | 323 } |
334 | 324 |
335 // TilingIterator | 325 // TilingIterator |
336 TilingSetRasterQueueAll::TilingIterator::TilingIterator() | 326 TilingSetRasterQueueAll::TilingIterator::TilingIterator() : tiling_(nullptr) { |
337 : tiling_(NULL), current_tile_(NULL) { | |
338 } | 327 } |
339 | 328 |
340 TilingSetRasterQueueAll::TilingIterator::TilingIterator( | 329 TilingSetRasterQueueAll::TilingIterator::TilingIterator( |
341 PictureLayerTiling* tiling, | 330 PictureLayerTiling* tiling, |
342 TilingData* tiling_data) | 331 TilingData* tiling_data) |
343 : tiling_(tiling), | 332 : 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_); | 333 visible_iterator_ = VisibleTilingIterator(tiling_, tiling_data_); |
348 if (visible_iterator_.done()) { | 334 if (visible_iterator_.done()) { |
349 AdvancePhase(); | 335 AdvancePhase(); |
350 return; | 336 return; |
351 } | 337 } |
352 current_tile_ = *visible_iterator_; | 338 current_tile_ = *visible_iterator_; |
353 } | 339 } |
354 | 340 |
355 TilingSetRasterQueueAll::TilingIterator::~TilingIterator() { | 341 TilingSetRasterQueueAll::TilingIterator::~TilingIterator() { |
356 } | 342 } |
357 | 343 |
358 void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() { | 344 void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() { |
359 DCHECK_LT(phase_, EVENTUALLY_RECT); | 345 DCHECK_LT(phase_, EVENTUALLY_RECT); |
360 | 346 |
361 current_tile_ = nullptr; | 347 current_tile_.Invalidate(); |
362 while (!current_tile_ && phase_ < EVENTUALLY_RECT) { | 348 while (!current_tile_.tile() && phase_ < EVENTUALLY_RECT) { |
363 phase_ = static_cast<Phase>(phase_ + 1); | 349 phase_ = static_cast<Phase>(phase_ + 1); |
364 switch (phase_) { | 350 switch (phase_) { |
365 case VISIBLE_RECT: | 351 case VISIBLE_RECT: |
366 NOTREACHED(); | 352 NOTREACHED(); |
367 return; | 353 return; |
368 case PENDING_VISIBLE_RECT: | 354 case PENDING_VISIBLE_RECT: |
369 pending_visible_iterator_ = | 355 pending_visible_iterator_ = |
370 PendingVisibleTilingIterator(tiling_, tiling_data_); | 356 PendingVisibleTilingIterator(tiling_, tiling_data_); |
371 if (!pending_visible_iterator_.done()) | 357 if (!pending_visible_iterator_.done()) |
372 current_tile_ = *pending_visible_iterator_; | 358 current_tile_ = *pending_visible_iterator_; |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
422 ++soon_border_iterator_; | 408 ++soon_border_iterator_; |
423 if (soon_border_iterator_.done()) { | 409 if (soon_border_iterator_.done()) { |
424 AdvancePhase(); | 410 AdvancePhase(); |
425 return *this; | 411 return *this; |
426 } | 412 } |
427 current_tile_ = *soon_border_iterator_; | 413 current_tile_ = *soon_border_iterator_; |
428 break; | 414 break; |
429 case EVENTUALLY_RECT: | 415 case EVENTUALLY_RECT: |
430 ++eventually_iterator_; | 416 ++eventually_iterator_; |
431 if (eventually_iterator_.done()) { | 417 if (eventually_iterator_.done()) { |
432 current_tile_ = nullptr; | 418 current_tile_.Invalidate(); |
433 return *this; | 419 return *this; |
434 } | 420 } |
435 current_tile_ = *eventually_iterator_; | 421 current_tile_ = *eventually_iterator_; |
436 break; | 422 break; |
437 } | 423 } |
438 return *this; | 424 return *this; |
439 } | 425 } |
440 | 426 |
441 } // namespace cc | 427 } // namespace cc |
OLD | NEW |