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/debug/trace_event_argument.h" | 10 #include "base/debug/trace_event_argument.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
102 // there are now tiles in this layer's tilings that were unref'd and replaced | 102 // there are now tiles in this layer's tilings that were unref'd and replaced |
103 // with new tiles (due to invalidation). This resets all active priorities on | 103 // with new tiles (due to invalidation). This resets all active priorities on |
104 // the to-be-recycled tiling to ensure replaced tiles don't linger and take | 104 // the to-be-recycled tiling to ensure replaced tiles don't linger and take |
105 // memory (due to a stale 'active' priority). | 105 // memory (due to a stale 'active' priority). |
106 if (layer_impl->tilings_) | 106 if (layer_impl->tilings_) |
107 layer_impl->tilings_->DidBecomeRecycled(); | 107 layer_impl->tilings_->DidBecomeRecycled(); |
108 | 108 |
109 LayerImpl::PushPropertiesTo(base_layer); | 109 LayerImpl::PushPropertiesTo(base_layer); |
110 | 110 |
111 // When the pending tree pushes to the active tree, the pending twin | 111 // When the pending tree pushes to the active tree, the pending twin |
112 // disappears. | 112 // becomes recycled. |
113 layer_impl->twin_layer_ = NULL; | 113 layer_impl->twin_layer_ = NULL; |
114 twin_layer_ = NULL; | 114 twin_layer_ = NULL; |
115 | 115 |
116 layer_impl->SetIsMask(is_mask_); | 116 layer_impl->SetIsMask(is_mask_); |
117 layer_impl->pile_ = pile_; | 117 layer_impl->pile_ = pile_; |
118 | 118 |
119 // Tilings would be expensive to push, so we swap. | 119 // Tilings would be expensive to push, so we swap. |
120 layer_impl->tilings_.swap(tilings_); | 120 layer_impl->tilings_.swap(tilings_); |
121 | 121 |
122 // Remove invalidated tiles from what will become a recycle tree. | 122 // Remove invalidated tiles from what will become a recycle tree. |
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
534 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( | 534 gfx::ToEnclosingRect(MathUtil::ProjectClippedRect( |
535 view_to_layer, viewport_rect_for_tile_priority_)); | 535 view_to_layer, viewport_rect_for_tile_priority_)); |
536 | 536 |
537 visible_rect_in_content_space.Intersect(gfx::Rect(content_bounds())); | 537 visible_rect_in_content_space.Intersect(gfx::Rect(content_bounds())); |
538 } | 538 } |
539 } | 539 } |
540 | 540 |
541 return visible_rect_in_content_space; | 541 return visible_rect_in_content_space; |
542 } | 542 } |
543 | 543 |
| 544 PictureLayerImpl* PictureLayerImpl::GetRecycledTwinLayer() { |
| 545 // TODO(vmpstr): Maintain recycled twin as a member. crbug.com/407418 |
| 546 return static_cast<PictureLayerImpl*>( |
| 547 layer_tree_impl()->FindRecycleTreeLayerById(id())); |
| 548 } |
| 549 |
544 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) { | 550 void PictureLayerImpl::NotifyTileStateChanged(const Tile* tile) { |
545 if (layer_tree_impl()->IsActiveTree()) { | 551 if (layer_tree_impl()->IsActiveTree()) { |
546 gfx::RectF layer_damage_rect = | 552 gfx::RectF layer_damage_rect = |
547 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); | 553 gfx::ScaleRect(tile->content_rect(), 1.f / tile->contents_scale()); |
548 AddDamageRect(layer_damage_rect); | 554 AddDamageRect(layer_damage_rect); |
549 } | 555 } |
550 } | 556 } |
551 | 557 |
552 void PictureLayerImpl::DidBecomeActive() { | 558 void PictureLayerImpl::DidBecomeActive() { |
553 LayerImpl::DidBecomeActive(); | 559 LayerImpl::DidBecomeActive(); |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
606 return &invalidation_; | 612 return &invalidation_; |
607 } | 613 } |
608 | 614 |
609 const PictureLayerTiling* PictureLayerImpl::GetTwinTiling( | 615 const PictureLayerTiling* PictureLayerImpl::GetTwinTiling( |
610 const PictureLayerTiling* tiling) const { | 616 const PictureLayerTiling* tiling) const { |
611 if (!twin_layer_) | 617 if (!twin_layer_) |
612 return NULL; | 618 return NULL; |
613 return twin_layer_->tilings_->TilingAtScale(tiling->contents_scale()); | 619 return twin_layer_->tilings_->TilingAtScale(tiling->contents_scale()); |
614 } | 620 } |
615 | 621 |
| 622 PictureLayerTiling* PictureLayerImpl::GetRecycledTwinTiling( |
| 623 const PictureLayerTiling* tiling) { |
| 624 PictureLayerImpl* recycled_twin = GetRecycledTwinLayer(); |
| 625 if (!recycled_twin || !recycled_twin->tilings_) |
| 626 return NULL; |
| 627 return recycled_twin->tilings_->TilingAtScale(tiling->contents_scale()); |
| 628 } |
| 629 |
616 size_t PictureLayerImpl::GetMaxTilesForInterestArea() const { | 630 size_t PictureLayerImpl::GetMaxTilesForInterestArea() const { |
617 return layer_tree_impl()->settings().max_tiles_for_interest_area; | 631 return layer_tree_impl()->settings().max_tiles_for_interest_area; |
618 } | 632 } |
619 | 633 |
620 float PictureLayerImpl::GetSkewportTargetTimeInSeconds() const { | 634 float PictureLayerImpl::GetSkewportTargetTimeInSeconds() const { |
621 float skewport_target_time_in_frames = | 635 float skewport_target_time_in_frames = |
622 layer_tree_impl()->use_gpu_rasterization() | 636 layer_tree_impl()->use_gpu_rasterization() |
623 ? kGpuSkewportTargetTimeInFrames | 637 ? kGpuSkewportTargetTimeInFrames |
624 : kCpuSkewportTargetTimeInFrames; | 638 : kCpuSkewportTargetTimeInFrames; |
625 return skewport_target_time_in_frames * | 639 return skewport_target_time_in_frames * |
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1246 if (std::find(used_tilings.begin(), used_tilings.end(), tiling) != | 1260 if (std::find(used_tilings.begin(), used_tilings.end(), tiling) != |
1247 used_tilings.end()) | 1261 used_tilings.end()) |
1248 continue; | 1262 continue; |
1249 | 1263 |
1250 to_remove.push_back(tiling); | 1264 to_remove.push_back(tiling); |
1251 } | 1265 } |
1252 | 1266 |
1253 if (to_remove.empty()) | 1267 if (to_remove.empty()) |
1254 return; | 1268 return; |
1255 | 1269 |
1256 PictureLayerImpl* recycled_twin = static_cast<PictureLayerImpl*>( | 1270 PictureLayerImpl* recycled_twin = GetRecycledTwinLayer(); |
1257 layer_tree_impl()->FindRecycleTreeLayerById(id())); | |
1258 // Remove tilings on this tree and the twin tree. | 1271 // Remove tilings on this tree and the twin tree. |
1259 for (size_t i = 0; i < to_remove.size(); ++i) { | 1272 for (size_t i = 0; i < to_remove.size(); ++i) { |
1260 const PictureLayerTiling* twin_tiling = GetTwinTiling(to_remove[i]); | 1273 const PictureLayerTiling* twin_tiling = GetTwinTiling(to_remove[i]); |
1261 // Only remove tilings from the twin layer if they have | 1274 // Only remove tilings from the twin layer if they have |
1262 // NON_IDEAL_RESOLUTION. | 1275 // NON_IDEAL_RESOLUTION. |
1263 if (twin_tiling && twin_tiling->resolution() == NON_IDEAL_RESOLUTION) | 1276 if (twin_tiling && twin_tiling->resolution() == NON_IDEAL_RESOLUTION) |
1264 twin->RemoveTiling(to_remove[i]->contents_scale()); | 1277 twin->RemoveTiling(to_remove[i]->contents_scale()); |
1265 // Remove the tiling from the recycle tree. Note that we ignore resolution, | 1278 // Remove the tiling from the recycle tree. Note that we ignore resolution, |
1266 // since we don't need to maintain high/low res on the recycle tree. | 1279 // since we don't need to maintain high/low res on the recycle tree. |
1267 if (recycled_twin) | 1280 if (recycled_twin) |
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1751 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); | 1764 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); |
1752 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; | 1765 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; |
1753 return tiling_range.end - 1 - current_tiling_range_offset; | 1766 return tiling_range.end - 1 - current_tiling_range_offset; |
1754 } | 1767 } |
1755 } | 1768 } |
1756 NOTREACHED(); | 1769 NOTREACHED(); |
1757 return 0; | 1770 return 0; |
1758 } | 1771 } |
1759 | 1772 |
1760 } // namespace cc | 1773 } // namespace cc |
OLD | NEW |