Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(294)

Side by Side Diff: cc/resources/tiling_set_raster_queue_all.cc

Issue 1130123003: cc: Separate the priority from the tile and put in new PrioritizedTile (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tile too friendly, lets fix that Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698