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

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

Issue 643363002: cc: Make full-pile invalidations cheap. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 2 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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/picture_pile.h" 5 #include "cc/resources/picture_pile.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <limits> 8 #include <limits>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after
371 exposed_right - exposed_left, 371 exposed_right - exposed_left,
372 exposed_top_until - exposed_top); 372 exposed_top_until - exposed_top);
373 resize_invalidation.Union(left_rect); 373 resize_invalidation.Union(left_rect);
374 resize_invalidation.Union(right_rect); 374 resize_invalidation.Union(right_rect);
375 resize_invalidation.Union(top_rect); 375 resize_invalidation.Union(top_rect);
376 resize_invalidation.Union(bottom_rect); 376 resize_invalidation.Union(bottom_rect);
377 resize_invalidation.Union(exposed_rect); 377 resize_invalidation.Union(exposed_rect);
378 } 378 }
379 } 379 }
380 380
381 Region invalidation_expanded_to_full_tiles; 381 // Detect cases where the full pile is invalidated, in this situation we
382 for (Region::Iterator i(*invalidation); i.has_rect(); i.next()) { 382 // can just drop/invalidate everything.
383 gfx::Rect invalid_rect = i.rect(); 383 if (invalidation->Contains(gfx::Rect(old_tiling_size)) ||
384 384 invalidation->Contains(gfx::Rect(tiling_size()))) {
385 for (auto& it : picture_map_)
386 updated = it.second.Invalidate(frame_number) || updated;
enne (OOO) 2014/10/11 00:26:33 Oh, right. I forgot can't just drop tiles because
387 } else {
385 // Expand invalidation that is outside tiles that intersect the interest 388 // Expand invalidation that is outside tiles that intersect the interest
386 // rect. These tiles are no longer valid and should be considerered fully 389 // rect. These tiles are no longer valid and should be considerered fully
387 // invalid, so we can know to not keep around raster tiles that intersect 390 // invalid, so we can know to not keep around raster tiles that intersect
388 // with these recording tiles. 391 // with these recording tiles.
389 gfx::Rect invalid_rect_outside_interest_rect_tiles = invalid_rect; 392 Region invalidation_expanded_to_full_tiles;
390 // TODO(danakj): We should have a Rect-subtract-Rect-to-2-rects operator
391 // instead of using Rect::Subtract which gives you the bounding box of the
392 // subtraction.
393 invalid_rect_outside_interest_rect_tiles.Subtract(interest_rect_over_tiles);
394 invalidation_expanded_to_full_tiles.Union(tiling_.ExpandRectToTileBounds(
395 invalid_rect_outside_interest_rect_tiles));
396 393
397 // Split this inflated invalidation across tile boundaries and apply it 394 for (Region::Iterator i(*invalidation); i.has_rect(); i.next()) {
398 // to all tiles that it touches. 395 gfx::Rect invalid_rect = i.rect();
399 bool include_borders = true;
400 for (TilingData::Iterator iter(&tiling_, invalid_rect, include_borders);
401 iter;
402 ++iter) {
403 const PictureMapKey& key = iter.index();
404 396
405 PictureMap::iterator picture_it = picture_map_.find(key); 397 gfx::Rect invalid_rect_outside_interest_rect_tiles = invalid_rect;
406 if (picture_it == picture_map_.end()) 398 // TODO(danakj): We should have a Rect-subtract-Rect-to-2-rects operator
407 continue; 399 // instead of using Rect::Subtract which gives you the bounding box of the
400 // subtraction.
401 invalid_rect_outside_interest_rect_tiles.Subtract(
402 interest_rect_over_tiles);
403 invalidation_expanded_to_full_tiles.Union(tiling_.ExpandRectToTileBounds(
404 invalid_rect_outside_interest_rect_tiles));
408 405
409 // Inform the grid cell that it has been invalidated in this frame. 406 // Split this inflated invalidation across tile boundaries and apply it
410 updated = picture_it->second.Invalidate(frame_number) || updated; 407 // to all tiles that it touches.
411 // Invalidate drops the picture so the whole tile better be invalidated if 408 bool include_borders = true;
412 // it won't be re-recorded below. 409 for (TilingData::Iterator iter(&tiling_, invalid_rect, include_borders);
413 DCHECK_IMPLIES(!tiling_.TileBounds(key.first, key.second) 410 iter;
414 .Intersects(interest_rect_over_tiles), 411 ++iter) {
415 invalidation_expanded_to_full_tiles.Contains( 412 const PictureMapKey& key = iter.index();
416 tiling_.TileBounds(key.first, key.second))); 413
414 PictureMap::iterator picture_it = picture_map_.find(key);
415 if (picture_it == picture_map_.end())
416 continue;
417
418 // Inform the grid cell that it has been invalidated in this frame.
419 updated = picture_it->second.Invalidate(frame_number) || updated;
420 // Invalidate drops the picture so the whole tile better be invalidated
421 // if it won't be re-recorded below.
422 DCHECK_IMPLIES(!tiling_.TileBounds(key.first, key.second)
423 .Intersects(interest_rect_over_tiles),
424 invalidation_expanded_to_full_tiles.Contains(
425 tiling_.TileBounds(key.first, key.second)));
426 }
417 } 427 }
428 invalidation->Union(invalidation_expanded_to_full_tiles);
418 } 429 }
419 430
420 invalidation->Union(invalidation_expanded_to_full_tiles);
421 invalidation->Union(resize_invalidation); 431 invalidation->Union(resize_invalidation);
422 432
423 // Make a list of all invalid tiles; we will attempt to 433 // Make a list of all invalid tiles; we will attempt to
424 // cluster these into multiple invalidation regions. 434 // cluster these into multiple invalidation regions.
425 std::vector<gfx::Rect> invalid_tiles; 435 std::vector<gfx::Rect> invalid_tiles;
426 bool include_borders = true; 436 bool include_borders = true;
427 for (TilingData::Iterator it(&tiling_, interest_rect, include_borders); it; 437 for (TilingData::Iterator it(&tiling_, interest_rect, include_borders); it;
428 ++it) { 438 ++it) {
429 const PictureMapKey& key = it.index(); 439 const PictureMapKey& key = it.index();
430 PictureInfo& info = picture_map_[key]; 440 PictureInfo& info = picture_map_[key];
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 if (it->second.GetPicture() != picture) 564 if (it->second.GetPicture() != picture)
555 return; 565 return;
556 } 566 }
557 skia::AnalysisCanvas canvas(recorded_viewport_.width(), 567 skia::AnalysisCanvas canvas(recorded_viewport_.width(),
558 recorded_viewport_.height()); 568 recorded_viewport_.height());
559 picture->Raster(&canvas, NULL, Region(), 1.0f); 569 picture->Raster(&canvas, NULL, Region(), 1.0f);
560 is_solid_color_ = canvas.GetColorIfSolid(&solid_color_); 570 is_solid_color_ = canvas.GetColorIfSolid(&solid_color_);
561 } 571 }
562 572
563 } // namespace cc 573 } // namespace cc
OLDNEW
« no previous file with comments | « no previous file | cc/resources/picture_pile_unittest.cc » ('j') | cc/resources/picture_pile_unittest.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698