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