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 #include <set> | 9 #include <set> |
10 | 10 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 : active(active_layer), pending(pending_layer) { | 55 : active(active_layer), pending(pending_layer) { |
56 } | 56 } |
57 | 57 |
58 PictureLayerImpl::Pair::~Pair() { | 58 PictureLayerImpl::Pair::~Pair() { |
59 } | 59 } |
60 | 60 |
61 PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, int id) | 61 PictureLayerImpl::PictureLayerImpl(LayerTreeImpl* tree_impl, int id) |
62 : LayerImpl(tree_impl, id), | 62 : LayerImpl(tree_impl, id), |
63 twin_layer_(NULL), | 63 twin_layer_(NULL), |
64 pile_(PicturePileImpl::Create()), | 64 pile_(PicturePileImpl::Create()), |
65 is_mask_(false), | |
66 ideal_page_scale_(0.f), | 65 ideal_page_scale_(0.f), |
67 ideal_device_scale_(0.f), | 66 ideal_device_scale_(0.f), |
68 ideal_source_scale_(0.f), | 67 ideal_source_scale_(0.f), |
69 ideal_contents_scale_(0.f), | 68 ideal_contents_scale_(0.f), |
70 raster_page_scale_(0.f), | 69 raster_page_scale_(0.f), |
71 raster_device_scale_(0.f), | 70 raster_device_scale_(0.f), |
72 raster_source_scale_(0.f), | 71 raster_source_scale_(0.f), |
73 raster_contents_scale_(0.f), | 72 raster_contents_scale_(0.f), |
74 low_res_raster_contents_scale_(0.f), | 73 low_res_raster_contents_scale_(0.f), |
75 raster_source_scale_is_fixed_(false), | 74 raster_source_scale_is_fixed_(false), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 if (layer_impl->tilings_) | 106 if (layer_impl->tilings_) |
108 layer_impl->tilings_->DidBecomeRecycled(); | 107 layer_impl->tilings_->DidBecomeRecycled(); |
109 | 108 |
110 LayerImpl::PushPropertiesTo(base_layer); | 109 LayerImpl::PushPropertiesTo(base_layer); |
111 | 110 |
112 // 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 |
113 // becomes recycled. | 112 // becomes recycled. |
114 layer_impl->twin_layer_ = NULL; | 113 layer_impl->twin_layer_ = NULL; |
115 twin_layer_ = NULL; | 114 twin_layer_ = NULL; |
116 | 115 |
117 layer_impl->SetIsMask(is_mask_); | |
118 layer_impl->pile_ = pile_; | 116 layer_impl->pile_ = pile_; |
119 | 117 |
120 // Tilings would be expensive to push, so we swap. | 118 // Tilings would be expensive to push, so we swap. |
121 layer_impl->tilings_.swap(tilings_); | 119 layer_impl->tilings_.swap(tilings_); |
122 layer_impl->tilings_->SetClient(layer_impl); | 120 layer_impl->tilings_->SetClient(layer_impl); |
123 if (tilings_) | 121 if (tilings_) |
124 tilings_->SetClient(this); | 122 tilings_->SetClient(this); |
125 | 123 |
126 // Remove invalidated tiles from what will become a recycle tree. | 124 // Remove invalidated tiles from what will become a recycle tree. |
127 if (tilings_) | 125 if (tilings_) |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
583 return scoped_refptr<Tile>(); | 581 return scoped_refptr<Tile>(); |
584 | 582 |
585 int flags = 0; | 583 int flags = 0; |
586 | 584 |
587 // TODO(vmpstr): Revisit this. For now, enabling analysis means that we get as | 585 // TODO(vmpstr): Revisit this. For now, enabling analysis means that we get as |
588 // much savings on memory as we can. However, for some cases like ganesh or | 586 // much savings on memory as we can. However, for some cases like ganesh or |
589 // small layers, the amount of time we spend analyzing might not justify | 587 // small layers, the amount of time we spend analyzing might not justify |
590 // memory savings that we can get. Note that we don't handle solid color | 588 // memory savings that we can get. Note that we don't handle solid color |
591 // masks, so we shouldn't bother analyzing those. | 589 // masks, so we shouldn't bother analyzing those. |
592 // Bugs: crbug.com/397198, crbug.com/396908 | 590 // Bugs: crbug.com/397198, crbug.com/396908 |
593 if (!is_mask_) | 591 if (!pile_->is_mask()) |
594 flags = Tile::USE_PICTURE_ANALYSIS; | 592 flags = Tile::USE_PICTURE_ANALYSIS; |
595 | 593 |
596 return layer_tree_impl()->tile_manager()->CreateTile( | 594 return layer_tree_impl()->tile_manager()->CreateTile( |
597 pile_.get(), | 595 pile_.get(), |
598 content_rect.size(), | 596 content_rect.size(), |
599 content_rect, | 597 content_rect, |
600 contents_opaque() ? content_rect : gfx::Rect(), | 598 contents_opaque() ? content_rect : gfx::Rect(), |
601 tiling->contents_scale(), | 599 tiling->contents_scale(), |
602 id(), | 600 id(), |
603 layer_tree_impl()->source_frame_number(), | 601 layer_tree_impl()->source_frame_number(), |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
642 } | 640 } |
643 | 641 |
644 int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const { | 642 int PictureLayerImpl::GetSkewportExtrapolationLimitInContentPixels() const { |
645 return layer_tree_impl() | 643 return layer_tree_impl() |
646 ->settings() | 644 ->settings() |
647 .skewport_extrapolation_limit_in_content_pixels; | 645 .skewport_extrapolation_limit_in_content_pixels; |
648 } | 646 } |
649 | 647 |
650 gfx::Size PictureLayerImpl::CalculateTileSize( | 648 gfx::Size PictureLayerImpl::CalculateTileSize( |
651 const gfx::Size& content_bounds) const { | 649 const gfx::Size& content_bounds) const { |
652 if (is_mask_) { | |
653 int max_size = layer_tree_impl()->MaxTextureSize(); | |
654 return gfx::Size( | |
655 std::min(max_size, content_bounds.width()), | |
656 std::min(max_size, content_bounds.height())); | |
657 } | |
658 | |
659 int max_texture_size = | 650 int max_texture_size = |
660 layer_tree_impl()->resource_provider()->max_texture_size(); | 651 layer_tree_impl()->resource_provider()->max_texture_size(); |
661 | 652 |
| 653 if (pile_->is_mask()) { |
| 654 // Masks are not tiled, so if we can't cover the whole mask with one tile, |
| 655 // don't make any tiles at all. Returning an empty size signals this. |
| 656 if (content_bounds.width() > max_texture_size || |
| 657 content_bounds.height() > max_texture_size) |
| 658 return gfx::Size(); |
| 659 return content_bounds; |
| 660 } |
| 661 |
662 gfx::Size default_tile_size = layer_tree_impl()->settings().default_tile_size; | 662 gfx::Size default_tile_size = layer_tree_impl()->settings().default_tile_size; |
663 if (layer_tree_impl()->use_gpu_rasterization()) { | 663 if (layer_tree_impl()->use_gpu_rasterization()) { |
664 // TODO(ernstm) crbug.com/365877: We need a unified way to override the | 664 // TODO(ernstm) crbug.com/365877: We need a unified way to override the |
665 // default-tile-size. | 665 // default-tile-size. |
666 default_tile_size = | 666 default_tile_size = |
667 gfx::Size(layer_tree_impl()->device_viewport_size().width(), | 667 gfx::Size(layer_tree_impl()->device_viewport_size().width(), |
668 layer_tree_impl()->device_viewport_size().height() / 4); | 668 layer_tree_impl()->device_viewport_size().height() / 4); |
669 } | 669 } |
670 default_tile_size.SetToMin(gfx::Size(max_texture_size, max_texture_size)); | 670 default_tile_size.SetToMin(gfx::Size(max_texture_size, max_texture_size)); |
671 | 671 |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 if (!layer_tree_impl()->needs_update_draw_properties() && | 753 if (!layer_tree_impl()->needs_update_draw_properties() && |
754 should_update_tile_priorities_) { | 754 should_update_tile_priorities_) { |
755 // TODO(danakj): Add a DCHECK() that we are not using occlusion tracking | 755 // TODO(danakj): Add a DCHECK() that we are not using occlusion tracking |
756 // when we stop using the pending tree in the browser compositor. If we want | 756 // when we stop using the pending tree in the browser compositor. If we want |
757 // to support occlusion tracking here, we need to dirty the draw properties | 757 // to support occlusion tracking here, we need to dirty the draw properties |
758 // or save occlusion as a draw property. | 758 // or save occlusion as a draw property. |
759 UpdateTilePriorities(NULL); | 759 UpdateTilePriorities(NULL); |
760 } | 760 } |
761 } | 761 } |
762 | 762 |
763 void PictureLayerImpl::SetIsMask(bool is_mask) { | |
764 if (is_mask_ == is_mask) | |
765 return; | |
766 is_mask_ = is_mask; | |
767 if (tilings_) | |
768 tilings_->RemoveAllTiles(); | |
769 } | |
770 | |
771 ResourceProvider::ResourceId PictureLayerImpl::ContentsResourceId() const { | 763 ResourceProvider::ResourceId PictureLayerImpl::ContentsResourceId() const { |
772 gfx::Rect content_rect(content_bounds()); | 764 gfx::Rect content_rect(content_bounds()); |
773 float scale = MaximumTilingContentsScale(); | 765 float scale = MaximumTilingContentsScale(); |
774 PictureLayerTilingSet::CoverageIterator iter( | 766 PictureLayerTilingSet::CoverageIterator iter( |
775 tilings_.get(), scale, content_rect, ideal_contents_scale_); | 767 tilings_.get(), scale, content_rect, ideal_contents_scale_); |
776 | 768 |
777 // Mask resource not ready yet. | 769 // Mask resource not ready yet. |
778 if (!iter || !*iter) | 770 if (!iter || !*iter) |
779 return 0; | 771 return 0; |
780 | 772 |
781 // Masks only supported if they fit on exactly one tile. | 773 // Masks only supported if they fit on exactly one tile. |
782 if (iter.geometry_rect() != content_rect) | 774 DCHECK(iter.geometry_rect() == content_rect) |
783 return 0; | 775 << "iter rect " << iter.geometry_rect().ToString() << " content rect " |
| 776 << content_rect.ToString(); |
784 | 777 |
785 const ManagedTileState::TileVersion& tile_version = | 778 const ManagedTileState::TileVersion& tile_version = |
786 iter->GetTileVersionForDrawing(); | 779 iter->GetTileVersionForDrawing(); |
787 if (!tile_version.IsReadyToDraw() || | 780 if (!tile_version.IsReadyToDraw() || |
788 tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE) | 781 tile_version.mode() != ManagedTileState::TileVersion::RESOURCE_MODE) |
789 return 0; | 782 return 0; |
790 | 783 |
791 return tile_version.get_resource_id(); | 784 return tile_version.get_resource_id(); |
792 } | 785 } |
793 | 786 |
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1189 raster_contents_scale_ = | 1182 raster_contents_scale_ = |
1190 std::max(raster_contents_scale_, | 1183 std::max(raster_contents_scale_, |
1191 draw_properties().maximum_animation_contents_scale); | 1184 draw_properties().maximum_animation_contents_scale); |
1192 } else { | 1185 } else { |
1193 raster_contents_scale_ = | 1186 raster_contents_scale_ = |
1194 std::max(raster_contents_scale_, | 1187 std::max(raster_contents_scale_, |
1195 1.f * ideal_page_scale_ * ideal_device_scale_); | 1188 1.f * ideal_page_scale_ * ideal_device_scale_); |
1196 } | 1189 } |
1197 } | 1190 } |
1198 | 1191 |
1199 // If this layer would only create one tile at this content scale, | 1192 // If this layer would create zero or one tiles at this content scale, |
1200 // don't create a low res tiling. | 1193 // don't create a low res tiling. |
1201 gfx::Size content_bounds = | 1194 gfx::Size content_bounds = |
1202 gfx::ToCeiledSize(gfx::ScaleSize(bounds(), raster_contents_scale_)); | 1195 gfx::ToCeiledSize(gfx::ScaleSize(bounds(), raster_contents_scale_)); |
1203 gfx::Size tile_size = CalculateTileSize(content_bounds); | 1196 gfx::Size tile_size = CalculateTileSize(content_bounds); |
1204 if (tile_size.width() >= content_bounds.width() && | 1197 bool tile_covers_bounds = tile_size.width() >= content_bounds.width() && |
1205 tile_size.height() >= content_bounds.height()) { | 1198 tile_size.height() >= content_bounds.height(); |
| 1199 if (tile_size.IsEmpty() || tile_covers_bounds) { |
1206 low_res_raster_contents_scale_ = raster_contents_scale_; | 1200 low_res_raster_contents_scale_ = raster_contents_scale_; |
1207 return; | 1201 return; |
1208 } | 1202 } |
1209 | 1203 |
1210 float low_res_factor = | 1204 float low_res_factor = |
1211 layer_tree_impl()->settings().low_res_contents_scale_factor; | 1205 layer_tree_impl()->settings().low_res_contents_scale_factor; |
1212 low_res_raster_contents_scale_ = std::max( | 1206 low_res_raster_contents_scale_ = std::max( |
1213 raster_contents_scale_ * low_res_factor, | 1207 raster_contents_scale_ * low_res_factor, |
1214 MinimumContentsScale()); | 1208 MinimumContentsScale()); |
1215 } | 1209 } |
(...skipping 560 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1776 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); | 1770 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); |
1777 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; | 1771 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; |
1778 return tiling_range.end - 1 - current_tiling_range_offset; | 1772 return tiling_range.end - 1 - current_tiling_range_offset; |
1779 } | 1773 } |
1780 } | 1774 } |
1781 NOTREACHED(); | 1775 NOTREACHED(); |
1782 return 0; | 1776 return 0; |
1783 } | 1777 } |
1784 | 1778 |
1785 } // namespace cc | 1779 } // namespace cc |
OLD | NEW |