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

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

Issue 373113003: Keeping track of descendants that draw content instead of recalcualting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 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 2010 The Chromium Authors. All rights reserved. 1 // Copyright 2010 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/layer.h" 5 #include "cc/layers/layer.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/atomic_sequence_num.h" 9 #include "base/atomic_sequence_num.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 29 matching lines...) Expand all
40 : needs_push_properties_(false), 40 : needs_push_properties_(false),
41 num_dependents_need_push_properties_(false), 41 num_dependents_need_push_properties_(false),
42 stacking_order_changed_(false), 42 stacking_order_changed_(false),
43 // Layer IDs start from 1. 43 // Layer IDs start from 1.
44 layer_id_(g_next_layer_id.GetNext() + 1), 44 layer_id_(g_next_layer_id.GetNext() + 1),
45 ignore_set_needs_commit_(false), 45 ignore_set_needs_commit_(false),
46 sorting_context_id_(0), 46 sorting_context_id_(0),
47 parent_(NULL), 47 parent_(NULL),
48 layer_tree_host_(NULL), 48 layer_tree_host_(NULL),
49 scroll_clip_layer_id_(INVALID_ID), 49 scroll_clip_layer_id_(INVALID_ID),
50 num_descendants_that_draw_content_(0),
50 should_scroll_on_main_thread_(false), 51 should_scroll_on_main_thread_(false),
51 have_wheel_event_handlers_(false), 52 have_wheel_event_handlers_(false),
52 have_scroll_event_handlers_(false), 53 have_scroll_event_handlers_(false),
53 user_scrollable_horizontal_(true), 54 user_scrollable_horizontal_(true),
54 user_scrollable_vertical_(true), 55 user_scrollable_vertical_(true),
55 is_root_for_isolated_group_(false), 56 is_root_for_isolated_group_(false),
56 is_container_for_fixed_position_layers_(false), 57 is_container_for_fixed_position_layers_(false),
57 is_drawable_(false), 58 is_drawable_(false),
59 draws_content_(false),
58 hide_layer_and_subtree_(false), 60 hide_layer_and_subtree_(false),
59 masks_to_bounds_(false), 61 masks_to_bounds_(false),
60 contents_opaque_(false), 62 contents_opaque_(false),
61 double_sided_(true), 63 double_sided_(true),
62 should_flatten_transform_(true), 64 should_flatten_transform_(true),
63 use_parent_backface_visibility_(false), 65 use_parent_backface_visibility_(false),
64 draw_checkerboard_for_missing_tiles_(false), 66 draw_checkerboard_for_missing_tiles_(false),
65 force_render_surface_(false), 67 force_render_surface_(false),
66 transform_is_invertible_(true), 68 transform_is_invertible_(true),
67 background_color_(0), 69 background_color_(0),
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 } 245 }
244 246
245 void Layer::InsertChild(scoped_refptr<Layer> child, size_t index) { 247 void Layer::InsertChild(scoped_refptr<Layer> child, size_t index) {
246 DCHECK(IsPropertyChangeAllowed()); 248 DCHECK(IsPropertyChangeAllowed());
247 child->RemoveFromParent(); 249 child->RemoveFromParent();
248 child->SetParent(this); 250 child->SetParent(this);
249 child->stacking_order_changed_ = true; 251 child->stacking_order_changed_ = true;
250 252
251 index = std::min(index, children_.size()); 253 index = std::min(index, children_.size());
252 children_.insert(children_.begin() + index, child); 254 children_.insert(children_.begin() + index, child);
255 AddDrawableDescendants(child->NumDescendantsThatDrawContent() +
256 (child->DrawsContent() ? 1 : 0) +
257 (child->HasDelegatedContent() ? 1000 : 0));
253 SetNeedsFullTreeSync(); 258 SetNeedsFullTreeSync();
254 } 259 }
255 260
256 void Layer::RemoveFromParent() { 261 void Layer::RemoveFromParent() {
257 DCHECK(IsPropertyChangeAllowed()); 262 DCHECK(IsPropertyChangeAllowed());
258 if (parent_) 263 if (parent_)
259 parent_->RemoveChildOrDependent(this); 264 parent_->RemoveChildOrDependent(this);
260 } 265 }
261 266
262 void Layer::RemoveChildOrDependent(Layer* child) { 267 void Layer::RemoveChildOrDependent(Layer* child) {
(...skipping 10 matching lines...) Expand all
273 return; 278 return;
274 } 279 }
275 280
276 for (LayerList::iterator iter = children_.begin(); 281 for (LayerList::iterator iter = children_.begin();
277 iter != children_.end(); 282 iter != children_.end();
278 ++iter) { 283 ++iter) {
279 if (iter->get() != child) 284 if (iter->get() != child)
280 continue; 285 continue;
281 286
282 child->SetParent(NULL); 287 child->SetParent(NULL);
288 AddDrawableDescendants(-child->NumDescendantsThatDrawContent() -
289 (child->DrawsContent() ? 1 : 0) -
290 (child->HasDelegatedContent() ? 1000 : 0));
danakj 2014/07/14 20:22:02 i don't think you need to do this here after you a
awoloszyn 2014/07/16 20:44:19 Done.
283 children_.erase(iter); 291 children_.erase(iter);
284 SetNeedsFullTreeSync(); 292 SetNeedsFullTreeSync();
285 return; 293 return;
286 } 294 }
287 } 295 }
288 296
289 void Layer::ReplaceChild(Layer* reference, scoped_refptr<Layer> new_layer) { 297 void Layer::ReplaceChild(Layer* reference, scoped_refptr<Layer> new_layer) {
290 DCHECK(reference); 298 DCHECK(reference);
291 DCHECK_EQ(reference->parent(), this); 299 DCHECK_EQ(reference->parent(), this);
292 DCHECK(IsPropertyChangeAllowed()); 300 DCHECK(IsPropertyChangeAllowed());
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
772 should_flatten_transform_ = should_flatten; 780 should_flatten_transform_ = should_flatten;
773 SetNeedsCommit(); 781 SetNeedsCommit();
774 } 782 }
775 783
776 void Layer::SetIsDrawable(bool is_drawable) { 784 void Layer::SetIsDrawable(bool is_drawable) {
777 DCHECK(IsPropertyChangeAllowed()); 785 DCHECK(IsPropertyChangeAllowed());
778 if (is_drawable_ == is_drawable) 786 if (is_drawable_ == is_drawable)
779 return; 787 return;
780 788
781 is_drawable_ = is_drawable; 789 is_drawable_ = is_drawable;
790 UpdateDrawsContent();
782 SetNeedsCommit(); 791 SetNeedsCommit();
783 } 792 }
784 793
785 void Layer::SetHideLayerAndSubtree(bool hide) { 794 void Layer::SetHideLayerAndSubtree(bool hide) {
786 DCHECK(IsPropertyChangeAllowed()); 795 DCHECK(IsPropertyChangeAllowed());
787 if (hide_layer_and_subtree_ == hide) 796 if (hide_layer_and_subtree_ == hide)
788 return; 797 return;
789 798
790 hide_layer_and_subtree_ = hide; 799 hide_layer_and_subtree_ = hide;
791 SetNeedsCommit(); 800 SetNeedsCommit();
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
893 layer->SetPosition(position_); 902 layer->SetPosition(position_);
894 layer->SetIsContainerForFixedPositionLayers( 903 layer->SetIsContainerForFixedPositionLayers(
895 IsContainerForFixedPositionLayers()); 904 IsContainerForFixedPositionLayers());
896 layer->SetPositionConstraint(position_constraint_); 905 layer->SetPositionConstraint(position_constraint_);
897 layer->SetShouldFlattenTransform(should_flatten_transform_); 906 layer->SetShouldFlattenTransform(should_flatten_transform_);
898 layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_); 907 layer->SetUseParentBackfaceVisibility(use_parent_backface_visibility_);
899 if (!layer->TransformIsAnimatingOnImplOnly() && !TransformIsAnimating()) 908 if (!layer->TransformIsAnimatingOnImplOnly() && !TransformIsAnimating())
900 layer->SetTransformAndInvertibility(transform_, transform_is_invertible_); 909 layer->SetTransformAndInvertibility(transform_, transform_is_invertible_);
901 DCHECK(!(TransformIsAnimating() && layer->TransformIsAnimatingOnImplOnly())); 910 DCHECK(!(TransformIsAnimating() && layer->TransformIsAnimatingOnImplOnly()));
902 layer->Set3dSortingContextId(sorting_context_id_); 911 layer->Set3dSortingContextId(sorting_context_id_);
912 layer->SetNumDescendantsThatDrawContent(num_descendants_that_draw_content_);
903 913
904 layer->SetScrollClipLayer(scroll_clip_layer_id_); 914 layer->SetScrollClipLayer(scroll_clip_layer_id_);
905 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_); 915 layer->set_user_scrollable_horizontal(user_scrollable_horizontal_);
906 layer->set_user_scrollable_vertical(user_scrollable_vertical_); 916 layer->set_user_scrollable_vertical(user_scrollable_vertical_);
907 917
908 LayerImpl* scroll_parent = NULL; 918 LayerImpl* scroll_parent = NULL;
909 if (scroll_parent_) { 919 if (scroll_parent_) {
910 scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id()); 920 scroll_parent = layer->layer_tree_impl()->LayerById(scroll_parent_->id());
911 DCHECK(scroll_parent); 921 DCHECK(scroll_parent);
912 } 922 }
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
999 1009
1000 needs_push_properties_ = false; 1010 needs_push_properties_ = false;
1001 num_dependents_need_push_properties_ = 0; 1011 num_dependents_need_push_properties_ = 0;
1002 } 1012 }
1003 1013
1004 scoped_ptr<LayerImpl> Layer::CreateLayerImpl(LayerTreeImpl* tree_impl) { 1014 scoped_ptr<LayerImpl> Layer::CreateLayerImpl(LayerTreeImpl* tree_impl) {
1005 return LayerImpl::Create(tree_impl, layer_id_); 1015 return LayerImpl::Create(tree_impl, layer_id_);
1006 } 1016 }
1007 1017
1008 bool Layer::DrawsContent() const { 1018 bool Layer::DrawsContent() const {
1009 return is_drawable_; 1019 return draws_content_;
1020 }
1021
1022 bool Layer::HasDrawableContent() const {
1023 return true;
1024 }
1025
1026 void Layer::UpdateDrawsContent() {
1027 bool draws_content = is_drawable_ && HasDrawableContent();
1028 if (draws_content == draws_content_)
1029 return;
1030 // As per the comment that was originally in
1031 // LayerTreeHost::PrecalculateMetaInformation:
1032 // Layers with delegated content need to be treated as if they have as
danakj 2014/07/14 20:22:02 This isn't quite what we're doing yet. Right now y
awoloszyn 2014/07/16 20:44:19 I moved this into NumDescendantsThatDrawContent().
1033 // many children as the number of layers they own delegated quads for.
1034 // Since we don't know this number right now, we choose one that acts like
1035 // infinity for our purposes.
1036
1037 if (parent()) {
1038 if (draws_content) {
1039 parent()->AddDrawableDescendants(1 + (HasDelegatedContent() ? 1000 : 0));
1040 } else {
1041 parent()->AddDrawableDescendants(-1 - (HasDelegatedContent() ? 1000 : 0));
1042 }
1043 }
1044 draws_content_ = draws_content;
danakj 2014/07/14 20:22:02 SetNeedsCommit in here, please add this to the tes
awoloszyn 2014/07/16 20:44:20 Done.
1045 }
1046
1047 int Layer::NumDescendantsThatDrawContent() const {
1048 return num_descendants_that_draw_content_;
1010 } 1049 }
1011 1050
1012 void Layer::SavePaintProperties() { 1051 void Layer::SavePaintProperties() {
1013 DCHECK(layer_tree_host_); 1052 DCHECK(layer_tree_host_);
1014 1053
1015 // TODO(reveman): Save all layer properties that we depend on not 1054 // TODO(reveman): Save all layer properties that we depend on not
1016 // changing until PushProperties() has been called. crbug.com/231016 1055 // changing until PushProperties() has been called. crbug.com/231016
1017 paint_properties_.bounds = bounds_; 1056 paint_properties_.bounds = bounds_;
1018 paint_properties_.source_frame_number = 1057 paint_properties_.source_frame_number =
1019 layer_tree_host_->source_frame_number(); 1058 layer_tree_host_->source_frame_number();
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 it != clip_children_->end(); ++it) 1221 it != clip_children_->end(); ++it)
1183 (*it)->clip_parent_ = NULL; 1222 (*it)->clip_parent_ = NULL;
1184 } 1223 }
1185 1224
1186 if (clip_parent_) 1225 if (clip_parent_)
1187 clip_parent_->RemoveClipChild(this); 1226 clip_parent_->RemoveClipChild(this);
1188 1227
1189 clip_parent_ = NULL; 1228 clip_parent_ = NULL;
1190 } 1229 }
1191 1230
1231 void Layer::AddDrawableDescendants(int num) {
1232 DCHECK_GE(num_descendants_that_draw_content_, 0);
1233 DCHECK_GE(num_descendants_that_draw_content_ + num, 0);
1234 if (num == 0)
1235 return;
1236 num_descendants_that_draw_content_ += num;
1237 SetNeedsCommit();
1238 if (parent())
1239 parent()->AddDrawableDescendants(num);
1240 }
1241
1192 void Layer::RunMicroBenchmark(MicroBenchmark* benchmark) { 1242 void Layer::RunMicroBenchmark(MicroBenchmark* benchmark) {
1193 benchmark->RunOnLayer(this); 1243 benchmark->RunOnLayer(this);
1194 } 1244 }
1245
1246 bool Layer::HasDelegatedContent() const {
1247 return false;
1248 }
1195 } // namespace cc 1249 } // namespace cc
danakj 2014/07/14 20:22:02 blank line above
awoloszyn 2014/07/16 20:44:20 Done.
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698