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

Side by Side Diff: cc/layers/picture_layer_impl.cc

Issue 519583003: Use the solid color detection to create solid layers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 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/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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 ideal_source_scale_(0.f), 68 ideal_source_scale_(0.f),
69 ideal_contents_scale_(0.f), 69 ideal_contents_scale_(0.f),
70 raster_page_scale_(0.f), 70 raster_page_scale_(0.f),
71 raster_device_scale_(0.f), 71 raster_device_scale_(0.f),
72 raster_source_scale_(0.f), 72 raster_source_scale_(0.f),
73 raster_contents_scale_(0.f), 73 raster_contents_scale_(0.f),
74 low_res_raster_contents_scale_(0.f), 74 low_res_raster_contents_scale_(0.f),
75 raster_source_scale_is_fixed_(false), 75 raster_source_scale_is_fixed_(false),
76 was_screen_space_transform_animating_(false), 76 was_screen_space_transform_animating_(false),
77 needs_post_commit_initialization_(true), 77 needs_post_commit_initialization_(true),
78 should_update_tile_priorities_(false) { 78 should_update_tile_priorities_(false),
79 is_solid_color_(false),
80 solid_color_(SK_ColorBLACK) {
79 layer_tree_impl()->RegisterPictureLayerImpl(this); 81 layer_tree_impl()->RegisterPictureLayerImpl(this);
80 } 82 }
81 83
82 PictureLayerImpl::~PictureLayerImpl() { 84 PictureLayerImpl::~PictureLayerImpl() {
83 layer_tree_impl()->UnregisterPictureLayerImpl(this); 85 layer_tree_impl()->UnregisterPictureLayerImpl(this);
84 } 86 }
85 87
86 const char* PictureLayerImpl::LayerTypeAsString() const { 88 const char* PictureLayerImpl::LayerTypeAsString() const {
87 return "cc::PictureLayerImpl"; 89 return "cc::PictureLayerImpl";
88 } 90 }
89 91
90 scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl( 92 scoped_ptr<LayerImpl> PictureLayerImpl::CreateLayerImpl(
91 LayerTreeImpl* tree_impl) { 93 LayerTreeImpl* tree_impl) {
92 return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>(); 94 return PictureLayerImpl::Create(tree_impl, id()).PassAs<LayerImpl>();
93 } 95 }
94 96
95 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) { 97 void PictureLayerImpl::PushPropertiesTo(LayerImpl* base_layer) {
96 // It's possible this layer was never drawn or updated (e.g. because it was 98 // It's possible this layer was never drawn or updated (e.g. because it was
97 // a descendant of an opacity 0 layer). 99 // a descendant of an opacity 0 layer).
98 DoPostCommitInitializationIfNeeded(); 100 DoPostCommitInitializationIfNeeded();
101
99 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer); 102 PictureLayerImpl* layer_impl = static_cast<PictureLayerImpl*>(base_layer);
100 103
101 // We have already synced the important bits from the the active layer, and 104 // We have already synced the important bits from the the active layer, and
102 // we will soon swap out its tilings and use them for recycling. However, 105 // we will soon swap out its tilings and use them for recycling. However,
103 // there are now tiles in this layer's tilings that were unref'd and replaced 106 // there are now tiles in this layer's tilings that were unref'd and replaced
104 // with new tiles (due to invalidation). This resets all active priorities on 107 // with new tiles (due to invalidation). This resets all active priorities on
105 // the to-be-recycled tiling to ensure replaced tiles don't linger and take 108 // the to-be-recycled tiling to ensure replaced tiles don't linger and take
106 // memory (due to a stale 'active' priority). 109 // memory (due to a stale 'active' priority).
107 if (layer_impl->tilings_) 110 if (layer_impl->tilings_)
108 layer_impl->tilings_->DidBecomeRecycled(); 111 layer_impl->tilings_->DidBecomeRecycled();
109 112
110 LayerImpl::PushPropertiesTo(base_layer); 113 LayerImpl::PushPropertiesTo(base_layer);
111 114
112 // When the pending tree pushes to the active tree, the pending twin 115 // When the pending tree pushes to the active tree, the pending twin
113 // becomes recycled. 116 // becomes recycled.
114 layer_impl->twin_layer_ = NULL; 117 layer_impl->twin_layer_ = NULL;
115 twin_layer_ = NULL; 118 twin_layer_ = NULL;
116 119
117 layer_impl->SetIsMask(is_mask_); 120 layer_impl->SetIsMask(is_mask_);
118 layer_impl->pile_ = pile_; 121 layer_impl->pile_ = pile_;
119 122
123 layer_impl->is_solid_color_ = is_solid_color_;
124 layer_impl->solid_color_ = solid_color_;
125
120 // Tilings would be expensive to push, so we swap. 126 // Tilings would be expensive to push, so we swap.
121 layer_impl->tilings_.swap(tilings_); 127 layer_impl->tilings_.swap(tilings_);
122 128
123 // Remove invalidated tiles from what will become a recycle tree. 129 // Remove invalidated tiles from what will become a recycle tree.
124 if (tilings_) 130 if (tilings_)
125 tilings_->RemoveTilesInRegion(invalidation_); 131 tilings_->RemoveTilesInRegion(invalidation_);
126 132
127 layer_impl->tilings_->SetClient(layer_impl); 133 layer_impl->tilings_->SetClient(layer_impl);
vmpstr 2014/08/29 06:49:15 If you push solid color == true, it shouldn't have
hendrikw 2014/08/29 14:03:21 We always create tilings_, but it's empty, so it s
vmpstr 2014/08/29 14:20:44 No, I guess not having tilings but having a tiling
hendrikw 2014/09/02 14:19:17 Acknowledged.
128 if (tilings_) 134 if (tilings_)
129 tilings_->SetClient(this); 135 tilings_->SetClient(this);
130 136
131 layer_impl->raster_page_scale_ = raster_page_scale_; 137 layer_impl->raster_page_scale_ = raster_page_scale_;
132 layer_impl->raster_device_scale_ = raster_device_scale_; 138 layer_impl->raster_device_scale_ = raster_device_scale_;
133 layer_impl->raster_source_scale_ = raster_source_scale_; 139 layer_impl->raster_source_scale_ = raster_source_scale_;
134 layer_impl->raster_contents_scale_ = raster_contents_scale_; 140 layer_impl->raster_contents_scale_ = raster_contents_scale_;
135 layer_impl->low_res_raster_contents_scale_ = low_res_raster_contents_scale_; 141 layer_impl->low_res_raster_contents_scale_ = low_res_raster_contents_scale_;
136 layer_impl->needs_post_commit_initialization_ = false; 142 layer_impl->needs_post_commit_initialization_ = false;
137 143
138 // The invalidation on this soon-to-be-recycled layer must be cleared to 144 // The invalidation on this soon-to-be-recycled layer must be cleared to
139 // mirror clearing the invalidation in PictureLayer's version of this function 145 // mirror clearing the invalidation in PictureLayer's version of this function
140 // in case push properties is skipped. 146 // in case push properties is skipped.
141 layer_impl->invalidation_.Swap(&invalidation_); 147 layer_impl->invalidation_.Swap(&invalidation_);
142 invalidation_.Clear(); 148 invalidation_.Clear();
143 needs_post_commit_initialization_ = true; 149 needs_post_commit_initialization_ = true;
144 150
145 // We always need to push properties. 151 // We always need to push properties.
146 // See http://crbug.com/303943 152 // See http://crbug.com/303943
147 needs_push_properties_ = true; 153 needs_push_properties_ = true;
148 } 154 }
149 155
150 void PictureLayerImpl::AppendQuads( 156 void PictureLayerImpl::AppendQuads(
151 RenderPass* render_pass, 157 RenderPass* render_pass,
152 const OcclusionTracker<LayerImpl>& occlusion_tracker, 158 const OcclusionTracker<LayerImpl>& occlusion_tracker,
153 AppendQuadsData* append_quads_data) { 159 AppendQuadsData* append_quads_data) {
160 if (IsSolidColor()) {
vmpstr 2014/08/29 06:49:15 Can you put this code in a helper and do if (IsSo
hendrikw 2014/08/29 14:03:21 As I mentioned in the post above, I will need to d
vmpstr 2014/08/29 14:20:45 Can you have a SolidColorLayerImpl as a member ins
enne (OOO) 2014/08/29 16:53:43 Please, no to either deriving from PictureLayerImp
hendrikw 2014/09/02 14:19:17 I already tried that. It calls AppendDebugBorderQ
vmpstr 2014/09/02 19:02:25 I feel that LayerImpl should really move more towa
161 // TODO(hendrikw) code sharing
162 const int tile_size_ = 256; // this comes from solidcolorlayerimpl
vmpstr 2014/08/29 06:49:15 trailing _ is for member variables. This should be
hendrikw 2014/08/29 14:03:21 This will go away when I derive from solid color.
vmpstr 2014/08/29 14:20:44 Acknowledged.
163 SharedQuadState* shared_quad_state =
164 render_pass->CreateAndAppendSharedQuadState();
165 PopulateSharedQuadState(shared_quad_state);
166
167 AppendDebugBorderQuad(
vmpstr 2014/08/29 06:49:15 Should each of the solid color quads also have a d
hendrikw 2014/08/29 14:03:21 This functionality will exist in solid color when
vmpstr 2014/08/29 14:20:44 Acknowledged.
168 render_pass, content_bounds(), shared_quad_state, append_quads_data);
169
170 // We create a series of smaller quads instead of just one large one so that
enne (OOO) 2014/08/29 16:53:43 This code is not your fault, but we shouldn't do t
hendrikw 2014/09/02 14:19:17 Acknowledged.
171 // the culler can reduce the total pixels drawn.
172 int width = content_bounds().width();
173 int height = content_bounds().height();
174 for (int x = 0; x < width; x += tile_size_) {
175 for (int y = 0; y < height; y += tile_size_) {
176 gfx::Rect quad_rect(x,
177 y,
178 std::min(width - x, tile_size_),
179 std::min(height - y, tile_size_));
180 gfx::Rect visible_quad_rect = occlusion_tracker.UnoccludedContentRect(
181 quad_rect, draw_properties().target_space_transform);
182 if (visible_quad_rect.IsEmpty())
183 continue;
184
185 SolidColorDrawQuad* quad =
186 render_pass->CreateAndAppendDrawQuad<SolidColorDrawQuad>();
187 quad->SetNew(shared_quad_state,
188 quad_rect,
189 visible_quad_rect,
190 solid_color_,
191 false);
192 }
193 }
194 return;
195 }
196
154 DCHECK(!needs_post_commit_initialization_); 197 DCHECK(!needs_post_commit_initialization_);
155 198
156 float max_contents_scale = MaximumTilingContentsScale(); 199 float max_contents_scale = MaximumTilingContentsScale();
157 gfx::Transform scaled_draw_transform = draw_transform(); 200 gfx::Transform scaled_draw_transform = draw_transform();
158 scaled_draw_transform.Scale(SK_MScalar1 / max_contents_scale, 201 scaled_draw_transform.Scale(SK_MScalar1 / max_contents_scale,
159 SK_MScalar1 / max_contents_scale); 202 SK_MScalar1 / max_contents_scale);
160 gfx::Size scaled_content_bounds = 203 gfx::Size scaled_content_bounds =
161 gfx::ToCeiledSize(gfx::ScaleSize(content_bounds(), max_contents_scale)); 204 gfx::ToCeiledSize(gfx::ScaleSize(content_bounds(), max_contents_scale));
162 205
163 gfx::Rect scaled_visible_content_rect = 206 gfx::Rect scaled_visible_content_rect =
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 // to force tilings to get managed. 620 // to force tilings to get managed.
578 layer_tree_impl()->set_needs_update_draw_properties(); 621 layer_tree_impl()->set_needs_update_draw_properties();
579 } 622 }
580 623
581 skia::RefPtr<SkPicture> PictureLayerImpl::GetPicture() { 624 skia::RefPtr<SkPicture> PictureLayerImpl::GetPicture() {
582 return pile_->GetFlattenedPicture(); 625 return pile_->GetFlattenedPicture();
583 } 626 }
584 627
585 scoped_refptr<Tile> PictureLayerImpl::CreateTile(PictureLayerTiling* tiling, 628 scoped_refptr<Tile> PictureLayerImpl::CreateTile(PictureLayerTiling* tiling,
586 const gfx::Rect& content_rect) { 629 const gfx::Rect& content_rect) {
587 if (!pile_->CanRaster(tiling->contents_scale(), content_rect)) 630 if (!pile_->CanRaster(tiling->contents_scale(), content_rect) ||
vmpstr 2014/08/29 06:49:15 Hmm, I was hoping to avoid creating tilings at all
hendrikw 2014/08/29 14:03:21 If there are no tiles in the tiling, why would upd
vmpstr 2014/08/29 14:20:45 If we don't create tilings, then this function sho
631 IsSolidColor())
588 return scoped_refptr<Tile>(); 632 return scoped_refptr<Tile>();
589 633
590 // TODO(vmpstr): Revisit this. For now, enabling analysis means that we get as 634 // TODO(vmpstr): Revisit this. For now, enabling analysis means that we get as
591 // much savings on memory as we can. However, for some cases like ganesh or 635 // much savings on memory as we can. However, for some cases like ganesh or
592 // small layers, the amount of time we spend analyzing might not justify 636 // small layers, the amount of time we spend analyzing might not justify
593 // memory savings that we can get. 637 // memory savings that we can get.
594 // Bugs: crbug.com/397198, crbug.com/396908 638 // Bugs: crbug.com/397198, crbug.com/396908
595 int flags = Tile::USE_PICTURE_ANALYSIS; 639 int flags = Tile::USE_PICTURE_ANALYSIS;
596 640
597 return layer_tree_impl()->tile_manager()->CreateTile( 641 return layer_tree_impl()->tile_manager()->CreateTile(
(...skipping 1175 matching lines...) Expand 10 before | Expand all | Expand 10 after
1773 case PictureLayerTilingSet::LOWER_THAN_LOW_RES: { 1817 case PictureLayerTilingSet::LOWER_THAN_LOW_RES: {
1774 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange(); 1818 PictureLayerTilingSet::TilingRange tiling_range = CurrentTilingRange();
1775 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start; 1819 size_t current_tiling_range_offset = current_tiling_ - tiling_range.start;
1776 return tiling_range.end - 1 - current_tiling_range_offset; 1820 return tiling_range.end - 1 - current_tiling_range_offset;
1777 } 1821 }
1778 } 1822 }
1779 NOTREACHED(); 1823 NOTREACHED();
1780 return 0; 1824 return 0;
1781 } 1825 }
1782 1826
1827 void PictureLayerImpl::SetSolidColorState(bool is_solid_color,
1828 SkColor solid_color) {
1829 is_solid_color_ = is_solid_color;
1830 solid_color_ = solid_color;
1831 }
1832
1783 } // namespace cc 1833 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698