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

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

Issue 1126813002: cc: Pass priority rect information from iterators to tilings. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: 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 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type; 146 TilePriority::PriorityBin tile_type = stages_[current_stage_].tile_type;
147 147
148 if (!iterators_[index].done() && iterators_[index].type() == tile_type) 148 if (!iterators_[index].done() && iterators_[index].type() == tile_type)
149 break; 149 break;
150 ++current_stage_; 150 ++current_stage_;
151 } 151 }
152 } 152 }
153 153
154 // OnePriorityRectIterator 154 // OnePriorityRectIterator
155 TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator() 155 TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator()
156 : tile_(nullptr), tiling_(nullptr), tiling_data_(nullptr) { 156 : tile_(nullptr),
157 tiling_(nullptr),
158 pending_twin_tiling_(nullptr),
159 tiling_data_(nullptr) {
157 } 160 }
158 161
159 TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator( 162 TilingSetRasterQueueAll::OnePriorityRectIterator::OnePriorityRectIterator(
160 PictureLayerTiling* tiling, 163 PictureLayerTiling* tiling,
161 TilingData* tiling_data) 164 TilingData* tiling_data,
162 : tile_(nullptr), tiling_(tiling), tiling_data_(tiling_data) { 165 PictureLayerTiling::PriorityRect priority_rect)
166 : tile_(nullptr),
167 tiling_(tiling),
168 pending_twin_tiling_(
vmpstr 2015/05/05 18:04:02 Why are you adding this here? Why is getting tilin
USE eero AT chromium.org 2015/05/06 12:05:20 As a premature (size) optimisation. I removed it.
169 tiling->tree() == ACTIVE_TREE
170 ? tiling->client()->GetPendingOrActiveTwinTiling(tiling)
171 : nullptr),
172 tiling_data_(tiling_data),
173 priority_rect_(priority_rect) {
163 } 174 }
164 175
165 template <typename TilingIteratorType> 176 template <typename TilingIteratorType>
166 void TilingSetRasterQueueAll::OnePriorityRectIterator::AdvanceToNextTile( 177 void TilingSetRasterQueueAll::OnePriorityRectIterator::AdvanceToNextTile(
167 TilingIteratorType* iterator) { 178 TilingIteratorType* iterator) {
168 tile_ = nullptr; 179 bool found_tile = false;
169 while (!tile_ || !TileNeedsRaster(tile_)) { 180 while (!found_tile) {
170 ++(*iterator); 181 ++(*iterator);
171 if (!(*iterator)) { 182 if (!(*iterator)) {
172 tile_ = nullptr; 183 tile_ = nullptr;
173 return; 184 break;
174 } 185 }
175 tile_ = tiling_->TileAt(iterator->index_x(), iterator->index_y()); 186 found_tile = GetFirstTileAndCheckIfValid(iterator);
176 } 187 }
177 tiling_->UpdateTilePriority(tile_);
178 } 188 }
179 189
180 template <typename TilingIteratorType> 190 template <typename TilingIteratorType>
181 bool TilingSetRasterQueueAll::OnePriorityRectIterator:: 191 bool TilingSetRasterQueueAll::OnePriorityRectIterator::
182 GetFirstTileAndCheckIfValid(TilingIteratorType* iterator) { 192 GetFirstTileAndCheckIfValid(TilingIteratorType* iterator) {
183 tile_ = tiling_->TileAt(iterator->index_x(), iterator->index_y()); 193 tile_ = tiling_->TileAt(iterator->index_x(), iterator->index_y());
184 if (!tile_ || !TileNeedsRaster(tile_)) { 194 if (!tile_ || !TileNeedsRaster(tile_)) {
185 tile_ = nullptr; 195 tile_ = nullptr;
186 return false; 196 return false;
187 } 197 }
188 tiling_->UpdateTilePriority(tile_); 198 if (priority_rect_ > PictureLayerTiling::PriorityRect::PENDING_VISIBLE_RECT &&
199 pending_twin_tiling_ &&
200 pending_twin_tiling_->current_visible_rect().Intersects(
201 tile_->content_rect())) {
202 return false;
203 }
204 tiling_->UpdateTilePriority(tile_, priority_rect_);
189 return true; 205 return true;
190 } 206 }
191 207
192 // VisibleTilingIterator. 208 // VisibleTilingIterator.
193 TilingSetRasterQueueAll::VisibleTilingIterator::VisibleTilingIterator( 209 TilingSetRasterQueueAll::VisibleTilingIterator::VisibleTilingIterator(
194 PictureLayerTiling* tiling, 210 PictureLayerTiling* tiling,
195 TilingData* tiling_data) 211 TilingData* tiling_data)
196 : OnePriorityRectIterator(tiling, tiling_data) { 212 : OnePriorityRectIterator(tiling,
213 tiling_data,
214 PictureLayerTiling::VISIBLE_RECT) {
197 if (!tiling_->has_visible_rect_tiles()) 215 if (!tiling_->has_visible_rect_tiles())
198 return; 216 return;
199 iterator_ = 217 iterator_ =
200 TilingData::Iterator(tiling_data_, tiling_->current_visible_rect(), 218 TilingData::Iterator(tiling_data_, tiling_->current_visible_rect(),
201 false /* include_borders */); 219 false /* include_borders */);
202 if (!iterator_) 220 if (!iterator_)
203 return; 221 return;
204 if (!GetFirstTileAndCheckIfValid(&iterator_)) 222 if (!GetFirstTileAndCheckIfValid(&iterator_))
205 ++(*this); 223 ++(*this);
206 } 224 }
207 225
208 TilingSetRasterQueueAll::VisibleTilingIterator& 226 TilingSetRasterQueueAll::VisibleTilingIterator&
209 TilingSetRasterQueueAll::VisibleTilingIterator:: 227 TilingSetRasterQueueAll::VisibleTilingIterator::
210 operator++() { 228 operator++() {
211 AdvanceToNextTile(&iterator_); 229 AdvanceToNextTile(&iterator_);
212 return *this; 230 return *this;
213 } 231 }
214 232
215 // PendingVisibleTilingIterator. 233 // PendingVisibleTilingIterator.
216 TilingSetRasterQueueAll::PendingVisibleTilingIterator:: 234 TilingSetRasterQueueAll::PendingVisibleTilingIterator::
217 PendingVisibleTilingIterator(PictureLayerTiling* tiling, 235 PendingVisibleTilingIterator(PictureLayerTiling* tiling,
218 TilingData* tiling_data) 236 TilingData* tiling_data)
219 : OnePriorityRectIterator(tiling, tiling_data) { 237 : OnePriorityRectIterator(tiling,
220 iterator_ = TilingData::DifferenceIterator(tiling_data_, 238 tiling_data,
221 tiling_->pending_visible_rect(), 239 PictureLayerTiling::PENDING_VISIBLE_RECT) {
222 tiling_->current_visible_rect()); 240 if (!pending_twin_tiling_ || !pending_twin_tiling_->has_visible_rect_tiles())
241 return;
242 iterator_ = TilingData::DifferenceIterator(
243 tiling_data_, pending_twin_tiling_->current_visible_rect(),
244 tiling_->current_visible_rect());
223 if (!iterator_) 245 if (!iterator_)
224 return; 246 return;
225 if (!GetFirstTileAndCheckIfValid(&iterator_)) 247 if (!GetFirstTileAndCheckIfValid(&iterator_))
226 ++(*this); 248 ++(*this);
227 } 249 }
228 250
229 TilingSetRasterQueueAll::PendingVisibleTilingIterator& 251 TilingSetRasterQueueAll::PendingVisibleTilingIterator&
230 TilingSetRasterQueueAll::PendingVisibleTilingIterator:: 252 TilingSetRasterQueueAll::PendingVisibleTilingIterator::
231 operator++() { 253 operator++() {
232 AdvanceToNextTile(&iterator_); 254 AdvanceToNextTile(&iterator_);
233 return *this; 255 return *this;
234 } 256 }
235 257
236 // SkewportTilingIterator. 258 // SkewportTilingIterator.
237 TilingSetRasterQueueAll::SkewportTilingIterator::SkewportTilingIterator( 259 TilingSetRasterQueueAll::SkewportTilingIterator::SkewportTilingIterator(
238 PictureLayerTiling* tiling, 260 PictureLayerTiling* tiling,
239 TilingData* tiling_data) 261 TilingData* tiling_data)
240 : OnePriorityRectIterator(tiling, tiling_data), 262 : OnePriorityRectIterator(tiling,
241 pending_visible_rect_(tiling->pending_visible_rect()) { 263 tiling_data,
264 PictureLayerTiling::SKEWPORT_RECT) {
242 if (!tiling_->has_skewport_rect_tiles()) 265 if (!tiling_->has_skewport_rect_tiles())
243 return; 266 return;
244 iterator_ = TilingData::SpiralDifferenceIterator( 267 iterator_ = TilingData::SpiralDifferenceIterator(
245 tiling_data_, tiling_->current_skewport_rect(), 268 tiling_data_, tiling_->current_skewport_rect(),
246 tiling_->current_visible_rect(), tiling_->current_visible_rect()); 269 tiling_->current_visible_rect(), tiling_->current_visible_rect());
247 if (!iterator_) 270 if (!iterator_)
248 return; 271 return;
249 if (!GetFirstTileAndCheckIfValid(&iterator_)) { 272 if (!GetFirstTileAndCheckIfValid(&iterator_))
250 ++(*this);
251 return;
252 }
253 if (tile_->content_rect().Intersects(pending_visible_rect_))
254 ++(*this); 273 ++(*this);
255 } 274 }
256 275
257 TilingSetRasterQueueAll::SkewportTilingIterator& 276 TilingSetRasterQueueAll::SkewportTilingIterator&
258 TilingSetRasterQueueAll::SkewportTilingIterator:: 277 TilingSetRasterQueueAll::SkewportTilingIterator::
259 operator++() { 278 operator++() {
260 AdvanceToNextTile(&iterator_); 279 AdvanceToNextTile(&iterator_);
261 while (!done()) {
262 if (!tile_->content_rect().Intersects(pending_visible_rect_))
263 break;
264 AdvanceToNextTile(&iterator_);
265 }
266 return *this; 280 return *this;
267 } 281 }
268 282
269 // SoonBorderTilingIterator. 283 // SoonBorderTilingIterator.
270 TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator( 284 TilingSetRasterQueueAll::SoonBorderTilingIterator::SoonBorderTilingIterator(
271 PictureLayerTiling* tiling, 285 PictureLayerTiling* tiling,
272 TilingData* tiling_data) 286 TilingData* tiling_data)
273 : OnePriorityRectIterator(tiling, tiling_data), 287 : OnePriorityRectIterator(tiling,
274 pending_visible_rect_(tiling->pending_visible_rect()) { 288 tiling_data,
289 PictureLayerTiling::SOON_BORDER_RECT) {
275 if (!tiling_->has_soon_border_rect_tiles()) 290 if (!tiling_->has_soon_border_rect_tiles())
276 return; 291 return;
277 iterator_ = TilingData::SpiralDifferenceIterator( 292 iterator_ = TilingData::SpiralDifferenceIterator(
278 tiling_data_, tiling_->current_soon_border_rect(), 293 tiling_data_, tiling_->current_soon_border_rect(),
279 tiling_->current_skewport_rect(), tiling_->current_visible_rect()); 294 tiling_->current_skewport_rect(), tiling_->current_visible_rect());
280 if (!iterator_) 295 if (!iterator_)
281 return; 296 return;
282 if (!GetFirstTileAndCheckIfValid(&iterator_)) { 297 if (!GetFirstTileAndCheckIfValid(&iterator_))
283 ++(*this);
284 return;
285 }
286 if (tile_->content_rect().Intersects(pending_visible_rect_))
287 ++(*this); 298 ++(*this);
288 } 299 }
289 300
290 TilingSetRasterQueueAll::SoonBorderTilingIterator& 301 TilingSetRasterQueueAll::SoonBorderTilingIterator&
291 TilingSetRasterQueueAll::SoonBorderTilingIterator:: 302 TilingSetRasterQueueAll::SoonBorderTilingIterator::
292 operator++() { 303 operator++() {
293 AdvanceToNextTile(&iterator_); 304 AdvanceToNextTile(&iterator_);
294 while (!done()) {
295 if (!tile_->content_rect().Intersects(pending_visible_rect_))
296 break;
297 AdvanceToNextTile(&iterator_);
298 }
299 return *this; 305 return *this;
300 } 306 }
301 307
302 // EventuallyTilingIterator. 308 // EventuallyTilingIterator.
303 TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator( 309 TilingSetRasterQueueAll::EventuallyTilingIterator::EventuallyTilingIterator(
304 PictureLayerTiling* tiling, 310 PictureLayerTiling* tiling,
305 TilingData* tiling_data) 311 TilingData* tiling_data)
306 : OnePriorityRectIterator(tiling, tiling_data), 312 : OnePriorityRectIterator(tiling,
307 pending_visible_rect_(tiling->pending_visible_rect()) { 313 tiling_data,
314 PictureLayerTiling::EVENTUALLY_RECT) {
308 if (!tiling_->has_eventually_rect_tiles()) 315 if (!tiling_->has_eventually_rect_tiles())
309 return; 316 return;
310 iterator_ = TilingData::SpiralDifferenceIterator( 317 iterator_ = TilingData::SpiralDifferenceIterator(
311 tiling_data_, tiling_->current_eventually_rect(), 318 tiling_data_, tiling_->current_eventually_rect(),
312 tiling_->current_skewport_rect(), tiling_->current_soon_border_rect()); 319 tiling_->current_skewport_rect(), tiling_->current_soon_border_rect());
313 if (!iterator_) 320 if (!iterator_)
314 return; 321 return;
315 if (!GetFirstTileAndCheckIfValid(&iterator_)) { 322 if (!GetFirstTileAndCheckIfValid(&iterator_))
316 ++(*this);
317 return;
318 }
319 if (tile_->content_rect().Intersects(pending_visible_rect_))
vmpstr 2015/05/05 18:04:02 I see that this is less code, but can you maybe do
USE eero AT chromium.org 2015/05/06 12:05:20 Yes, of course.
320 ++(*this); 323 ++(*this);
321 } 324 }
322 325
323 TilingSetRasterQueueAll::EventuallyTilingIterator& 326 TilingSetRasterQueueAll::EventuallyTilingIterator&
324 TilingSetRasterQueueAll::EventuallyTilingIterator:: 327 TilingSetRasterQueueAll::EventuallyTilingIterator::
325 operator++() { 328 operator++() {
326 AdvanceToNextTile(&iterator_); 329 AdvanceToNextTile(&iterator_);
327 while (!done()) {
328 if (!tile_->content_rect().Intersects(pending_visible_rect_))
329 break;
330 AdvanceToNextTile(&iterator_);
331 }
332 return *this; 330 return *this;
333 } 331 }
334 332
335 // TilingIterator 333 // TilingIterator
336 TilingSetRasterQueueAll::TilingIterator::TilingIterator() 334 TilingSetRasterQueueAll::TilingIterator::TilingIterator()
337 : tiling_(NULL), current_tile_(NULL) { 335 : tiling_(NULL), current_tile_(NULL) {
338 } 336 }
339 337
340 TilingSetRasterQueueAll::TilingIterator::TilingIterator( 338 TilingSetRasterQueueAll::TilingIterator::TilingIterator(
341 PictureLayerTiling* tiling, 339 PictureLayerTiling* tiling,
342 TilingData* tiling_data) 340 TilingData* tiling_data)
343 : tiling_(tiling), 341 : tiling_(tiling),
344 tiling_data_(tiling_data), 342 tiling_data_(tiling_data),
345 phase_(VISIBLE_RECT), 343 phase_(Phase::VISIBLE_RECT),
346 current_tile_(NULL) { 344 current_tile_(NULL) {
347 visible_iterator_ = VisibleTilingIterator(tiling_, tiling_data_); 345 visible_iterator_ = VisibleTilingIterator(tiling_, tiling_data_);
348 if (visible_iterator_.done()) { 346 if (visible_iterator_.done()) {
349 AdvancePhase(); 347 AdvancePhase();
350 return; 348 return;
351 } 349 }
352 current_tile_ = *visible_iterator_; 350 current_tile_ = *visible_iterator_;
353 } 351 }
354 352
355 TilingSetRasterQueueAll::TilingIterator::~TilingIterator() { 353 TilingSetRasterQueueAll::TilingIterator::~TilingIterator() {
356 } 354 }
357 355
358 void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() { 356 void TilingSetRasterQueueAll::TilingIterator::AdvancePhase() {
359 DCHECK_LT(phase_, EVENTUALLY_RECT); 357 DCHECK_LT(phase_, Phase::EVENTUALLY_RECT);
360 358
361 current_tile_ = nullptr; 359 current_tile_ = nullptr;
362 while (!current_tile_ && phase_ < EVENTUALLY_RECT) { 360 while (!current_tile_ && phase_ < Phase::EVENTUALLY_RECT) {
363 phase_ = static_cast<Phase>(phase_ + 1); 361 phase_ = static_cast<Phase>(phase_ + 1);
364 switch (phase_) { 362 switch (phase_) {
365 case VISIBLE_RECT: 363 case Phase::VISIBLE_RECT:
366 NOTREACHED(); 364 NOTREACHED();
367 return; 365 return;
368 case PENDING_VISIBLE_RECT: 366 case Phase::PENDING_VISIBLE_RECT:
369 pending_visible_iterator_ = 367 pending_visible_iterator_ =
370 PendingVisibleTilingIterator(tiling_, tiling_data_); 368 PendingVisibleTilingIterator(tiling_, tiling_data_);
371 if (!pending_visible_iterator_.done()) 369 if (!pending_visible_iterator_.done())
372 current_tile_ = *pending_visible_iterator_; 370 current_tile_ = *pending_visible_iterator_;
373 break; 371 break;
374 case SKEWPORT_RECT: 372 case Phase::SKEWPORT_RECT:
375 skewport_iterator_ = SkewportTilingIterator(tiling_, tiling_data_); 373 skewport_iterator_ = SkewportTilingIterator(tiling_, tiling_data_);
376 if (!skewport_iterator_.done()) 374 if (!skewport_iterator_.done())
377 current_tile_ = *skewport_iterator_; 375 current_tile_ = *skewport_iterator_;
378 break; 376 break;
379 case SOON_BORDER_RECT: 377 case Phase::SOON_BORDER_RECT:
380 soon_border_iterator_ = SoonBorderTilingIterator(tiling_, tiling_data_); 378 soon_border_iterator_ = SoonBorderTilingIterator(tiling_, tiling_data_);
381 if (!soon_border_iterator_.done()) 379 if (!soon_border_iterator_.done())
382 current_tile_ = *soon_border_iterator_; 380 current_tile_ = *soon_border_iterator_;
383 break; 381 break;
384 case EVENTUALLY_RECT: 382 case Phase::EVENTUALLY_RECT:
385 eventually_iterator_ = EventuallyTilingIterator(tiling_, tiling_data_); 383 eventually_iterator_ = EventuallyTilingIterator(tiling_, tiling_data_);
386 if (!eventually_iterator_.done()) 384 if (!eventually_iterator_.done())
387 current_tile_ = *eventually_iterator_; 385 current_tile_ = *eventually_iterator_;
388 break; 386 break;
389 } 387 }
390 } 388 }
391 } 389 }
392 390
393 TilingSetRasterQueueAll::TilingIterator& 391 TilingSetRasterQueueAll::TilingIterator&
394 TilingSetRasterQueueAll::TilingIterator:: 392 TilingSetRasterQueueAll::TilingIterator::
395 operator++() { 393 operator++() {
396 switch (phase_) { 394 switch (phase_) {
397 case VISIBLE_RECT: 395 case Phase::VISIBLE_RECT:
398 ++visible_iterator_; 396 ++visible_iterator_;
399 if (visible_iterator_.done()) { 397 if (visible_iterator_.done()) {
400 AdvancePhase(); 398 AdvancePhase();
401 return *this; 399 return *this;
402 } 400 }
403 current_tile_ = *visible_iterator_; 401 current_tile_ = *visible_iterator_;
404 break; 402 break;
405 case PENDING_VISIBLE_RECT: 403 case Phase::PENDING_VISIBLE_RECT:
406 ++pending_visible_iterator_; 404 ++pending_visible_iterator_;
407 if (pending_visible_iterator_.done()) { 405 if (pending_visible_iterator_.done()) {
408 AdvancePhase(); 406 AdvancePhase();
409 return *this; 407 return *this;
410 } 408 }
411 current_tile_ = *pending_visible_iterator_; 409 current_tile_ = *pending_visible_iterator_;
412 break; 410 break;
413 case SKEWPORT_RECT: 411 case Phase::SKEWPORT_RECT:
414 ++skewport_iterator_; 412 ++skewport_iterator_;
415 if (skewport_iterator_.done()) { 413 if (skewport_iterator_.done()) {
416 AdvancePhase(); 414 AdvancePhase();
417 return *this; 415 return *this;
418 } 416 }
419 current_tile_ = *skewport_iterator_; 417 current_tile_ = *skewport_iterator_;
420 break; 418 break;
421 case SOON_BORDER_RECT: 419 case Phase::SOON_BORDER_RECT:
422 ++soon_border_iterator_; 420 ++soon_border_iterator_;
423 if (soon_border_iterator_.done()) { 421 if (soon_border_iterator_.done()) {
424 AdvancePhase(); 422 AdvancePhase();
425 return *this; 423 return *this;
426 } 424 }
427 current_tile_ = *soon_border_iterator_; 425 current_tile_ = *soon_border_iterator_;
428 break; 426 break;
429 case EVENTUALLY_RECT: 427 case Phase::EVENTUALLY_RECT:
430 ++eventually_iterator_; 428 ++eventually_iterator_;
431 if (eventually_iterator_.done()) { 429 if (eventually_iterator_.done()) {
432 current_tile_ = nullptr; 430 current_tile_ = nullptr;
433 return *this; 431 return *this;
434 } 432 }
435 current_tile_ = *eventually_iterator_; 433 current_tile_ = *eventually_iterator_;
436 break; 434 break;
437 } 435 }
438 return *this; 436 return *this;
439 } 437 }
440 438
441 } // namespace cc 439 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698