| 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 |