OLD | NEW |
---|---|
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/layers/picture_layer_impl.h" | 5 #include "cc/layers/picture_layer_impl.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <limits> | 8 #include <limits> |
9 | 9 |
10 #include "base/time/time.h" | 10 #include "base/time/time.h" |
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
646 int round_up_to = avoid_pow2 ? 56 : 64; | 646 int round_up_to = avoid_pow2 ? 56 : 64; |
647 width = RoundUp(width, round_up_to); | 647 width = RoundUp(width, round_up_to); |
648 height = RoundUp(height, round_up_to); | 648 height = RoundUp(height, round_up_to); |
649 return gfx::Size(width, height); | 649 return gfx::Size(width, height); |
650 } | 650 } |
651 | 651 |
652 return default_tile_size; | 652 return default_tile_size; |
653 } | 653 } |
654 | 654 |
655 void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) { | 655 void PictureLayerImpl::SyncFromActiveLayer(const PictureLayerImpl* other) { |
656 TRACE_EVENT0("cc", "SyncFromActiveLayer"); | |
656 DCHECK(!other->needs_post_commit_initialization_); | 657 DCHECK(!other->needs_post_commit_initialization_); |
657 DCHECK(other->tilings_); | 658 DCHECK(other->tilings_); |
658 | 659 |
659 UpdateLCDTextStatus(other->is_using_lcd_text_); | 660 UpdateLCDTextStatus(other->is_using_lcd_text_); |
660 | 661 |
661 if (!DrawsContent()) { | 662 if (!DrawsContent()) { |
662 RemoveAllTilings(); | 663 RemoveAllTilings(); |
663 return; | 664 return; |
664 } | 665 } |
665 | 666 |
666 raster_page_scale_ = other->raster_page_scale_; | 667 raster_page_scale_ = other->raster_page_scale_; |
667 raster_device_scale_ = other->raster_device_scale_; | 668 raster_device_scale_ = other->raster_device_scale_; |
668 raster_source_scale_ = other->raster_source_scale_; | 669 raster_source_scale_ = other->raster_source_scale_; |
669 raster_contents_scale_ = other->raster_contents_scale_; | 670 raster_contents_scale_ = other->raster_contents_scale_; |
670 low_res_raster_contents_scale_ = other->low_res_raster_contents_scale_; | 671 low_res_raster_contents_scale_ = other->low_res_raster_contents_scale_; |
671 | 672 |
672 // Add synthetic invalidations for any recordings that were dropped. As | 673 // Add synthetic invalidations to drop tiles from the active twin's tiling |
673 // tiles are updated to point to this new pile, this will force the dropping | 674 // that we may not have recordings for. As tiles are updated to point to this |
674 // of tiles that can no longer be rastered. This is not ideal, but is a | 675 // new pile, this will force the dropping of tiles that can no longer be |
675 // trade-off for memory (use the same pile as much as possible, by switching | 676 // rastered. |
676 // during DidBecomeActive) and for time (don't bother checking every tile | 677 // This is not ideal, as our pile may be able to raster the tiles, but |
677 // during activation to see if the new pile can still raster it). | 678 // checking this is expensive. |
678 for (int x = 0; x < pile_->num_tiles_x(); ++x) { | 679 // 1. To find all the recorded pile tiles and build a region is more costly |
679 for (int y = 0; y < pile_->num_tiles_y(); ++y) { | 680 // (up to 5-6x more costly in some experiments). |
680 bool previously_had = other->pile_->HasRecordingAt(x, y); | 681 // 2. To check every raster tile and verify that the pile can record it before |
681 bool now_has = pile_->HasRecordingAt(x, y); | 682 // we activate and drop the active pile is much more expensive. |
682 if (now_has || !previously_had) | 683 // 3. But we want to use the same pile for all of the tilings to avoid having |
683 continue; | 684 // to keep around old piles of recordings. |
684 gfx::Rect layer_rect = pile_->tile_bounds(x, y); | 685 // This causes tiles outside the recorded viewport to be always dropped, but |
685 invalidation_.Union(layer_rect); | 686 // we expect these to be far from the viewport, since they were outside of the |
686 } | 687 // recording interest rect, so re-rastering those tiles is the tradeoff for |
687 } | 688 // speed here. |
689 Region outside_recorded_viewport = Region(pile_->tiling_rect()); | |
690 outside_recorded_viewport.Subtract(pile_->recorded_viewport()); | |
691 invalidation_.Union(outside_recorded_viewport); | |
enne (OOO)
2014/05/27 21:09:22
There's a performance bug here. As the comment on
| |
688 | 692 |
689 // Union in the other newly exposed regions as invalid. | 693 // Union in the other newly exposed regions as invalid. |
690 Region difference_region = Region(gfx::Rect(bounds())); | 694 Region difference_region = Region(gfx::Rect(bounds())); |
691 difference_region.Subtract(gfx::Rect(other->bounds())); | 695 difference_region.Subtract(gfx::Rect(other->bounds())); |
692 invalidation_.Union(difference_region); | 696 invalidation_.Union(difference_region); |
693 | 697 |
694 bool synced_high_res_tiling = false; | 698 bool synced_high_res_tiling = false; |
695 if (CanHaveTilings()) { | 699 if (CanHaveTilings()) { |
696 synced_high_res_tiling = tilings_->SyncTilings( | 700 synced_high_res_tiling = tilings_->SyncTilings( |
697 *other->tilings_, bounds(), invalidation_, MinimumContentsScale()); | 701 *other->tilings_, bounds(), invalidation_, MinimumContentsScale()); |
(...skipping 872 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1570 return iterator_index_ < iterators_.size(); | 1574 return iterator_index_ < iterators_.size(); |
1571 } | 1575 } |
1572 | 1576 |
1573 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( | 1577 bool PictureLayerImpl::LayerEvictionTileIterator::IsCorrectType( |
1574 PictureLayerTiling::TilingEvictionTileIterator* it) const { | 1578 PictureLayerTiling::TilingEvictionTileIterator* it) const { |
1575 return it->get_type() == iteration_stage_ && | 1579 return it->get_type() == iteration_stage_ && |
1576 (**it)->required_for_activation() == required_for_activation_; | 1580 (**it)->required_for_activation() == required_for_activation_; |
1577 } | 1581 } |
1578 | 1582 |
1579 } // namespace cc | 1583 } // namespace cc |
OLD | NEW |