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

Side by Side Diff: cc/trees/property_tree_builder.cc

Issue 2130053002: cc: Clean up Layer and LayerTreeHost. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@start_minor_layer_cleanup
Patch Set: Rebase Created 4 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
« no previous file with comments | « cc/trees/property_tree.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/trees/property_tree_builder.h" 5 #include "cc/trees/property_tree_builder.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <set> 10 #include <set>
11 11
12 #include "cc/animation/animation_host.h"
12 #include "cc/base/math_util.h" 13 #include "cc/base/math_util.h"
13 #include "cc/layers/layer.h" 14 #include "cc/layers/layer.h"
14 #include "cc/layers/layer_impl.h" 15 #include "cc/layers/layer_impl.h"
15 #include "cc/output/copy_output_request.h" 16 #include "cc/output/copy_output_request.h"
16 #include "cc/trees/clip_node.h" 17 #include "cc/trees/clip_node.h"
17 #include "cc/trees/draw_property_utils.h" 18 #include "cc/trees/draw_property_utils.h"
18 #include "cc/trees/effect_node.h" 19 #include "cc/trees/effect_node.h"
19 #include "cc/trees/layer_tree_host.h" 20 #include "cc/trees/layer_tree_host.h"
20 #include "cc/trees/layer_tree_impl.h" 21 #include "cc/trees/layer_tree_impl.h"
21 #include "cc/trees/scroll_node.h" 22 #include "cc/trees/scroll_node.h"
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 } 227 }
227 228
228 static Layer* ReplicaLayer(Layer* layer) { 229 static Layer* ReplicaLayer(Layer* layer) {
229 return layer->replica_layer(); 230 return layer->replica_layer();
230 } 231 }
231 232
232 static LayerImpl* ReplicaLayer(LayerImpl* layer) { 233 static LayerImpl* ReplicaLayer(LayerImpl* layer) {
233 return layer->test_properties()->replica_layer; 234 return layer->test_properties()->replica_layer;
234 } 235 }
235 236
237 // Methods to query state from the AnimationHost ----------------------
238 template <typename LayerType>
239 bool OpacityIsAnimating(LayerType* layer) {
240 return layer->GetAnimationHost()->IsAnimatingOpacityProperty(
241 layer->element_id(), layer->GetElementTypeForAnimation());
242 }
243
244 template <typename LayerType>
245 bool HasPotentiallyRunningOpacityAnimation(LayerType* layer) {
246 return layer->GetAnimationHost()->HasPotentiallyRunningOpacityAnimation(
247 layer->element_id(), layer->GetElementTypeForAnimation());
248 }
249
250 template <typename LayerType>
251 bool FilterIsAnimating(LayerType* layer) {
252 return layer->GetAnimationHost()->IsAnimatingFilterProperty(
253 layer->element_id(), layer->GetElementTypeForAnimation());
254 }
255
256 template <typename LayerType>
257 bool HasPotentiallyRunningFilterAnimation(LayerType* layer) {
258 return layer->GetAnimationHost()->HasPotentiallyRunningFilterAnimation(
259 layer->element_id(), layer->GetElementTypeForAnimation());
260 }
261
262 template <typename LayerType>
263 bool TransformIsAnimating(LayerType* layer) {
264 return layer->GetAnimationHost()->IsAnimatingTransformProperty(
265 layer->element_id(), layer->GetElementTypeForAnimation());
266 }
267
268 template <typename LayerType>
269 bool HasPotentiallyRunningTransformAnimation(LayerType* layer) {
270 return layer->GetAnimationHost()->HasPotentiallyRunningTransformAnimation(
271 layer->element_id(), layer->GetElementTypeForAnimation());
272 }
273
274 template <typename LayerType>
275 bool HasOnlyTranslationTransforms(LayerType* layer) {
276 return layer->GetAnimationHost()->HasOnlyTranslationTransforms(
277 layer->element_id(), layer->GetElementTypeForAnimation());
278 }
279
280 template <typename LayerType>
281 bool AnimationsPreserveAxisAlignment(LayerType* layer) {
282 return layer->GetAnimationHost()->AnimationsPreserveAxisAlignment(
283 layer->element_id());
284 }
285
286 template <typename LayerType>
287 bool HasAnyAnimationTargetingProperty(LayerType* layer,
288 TargetProperty::Type property) {
289 return layer->GetAnimationHost()->HasAnyAnimationTargetingProperty(
290 layer->element_id(), property);
291 }
292
293 // -------------------------------------------------------------------
294
236 template <typename LayerType> 295 template <typename LayerType>
237 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data, 296 static LayerType* GetTransformParent(const DataForRecursion<LayerType>& data,
238 LayerType* layer) { 297 LayerType* layer) {
239 return PositionConstraint(layer).is_fixed_position() 298 return PositionConstraint(layer).is_fixed_position()
240 ? data.transform_fixed_parent 299 ? data.transform_fixed_parent
241 : data.transform_tree_parent; 300 : data.transform_tree_parent;
242 } 301 }
243 302
244 template <typename LayerType> 303 template <typename LayerType>
245 static ClipNode* GetClipParent(const DataForRecursion<LayerType>& data, 304 static ClipNode* GetClipParent(const DataForRecursion<LayerType>& data,
(...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after
423 const bool is_page_scale_layer = layer == data_from_ancestor.page_scale_layer; 482 const bool is_page_scale_layer = layer == data_from_ancestor.page_scale_layer;
424 const bool is_overscroll_elasticity_layer = 483 const bool is_overscroll_elasticity_layer =
425 layer == data_from_ancestor.overscroll_elasticity_layer; 484 layer == data_from_ancestor.overscroll_elasticity_layer;
426 const bool is_scrollable = layer->scrollable(); 485 const bool is_scrollable = layer->scrollable();
427 const bool is_fixed = PositionConstraint(layer).is_fixed_position(); 486 const bool is_fixed = PositionConstraint(layer).is_fixed_position();
428 487
429 const bool has_significant_transform = 488 const bool has_significant_transform =
430 !layer->transform().IsIdentityOr2DTranslation(); 489 !layer->transform().IsIdentityOr2DTranslation();
431 490
432 const bool has_potentially_animated_transform = 491 const bool has_potentially_animated_transform =
433 layer->HasPotentiallyRunningTransformAnimation(); 492 HasPotentiallyRunningTransformAnimation(layer);
434 493
435 // A transform node is needed even for a finished animation, since differences 494 // A transform node is needed even for a finished animation, since differences
436 // in the timing of animation state updates can mean that an animation that's 495 // in the timing of animation state updates can mean that an animation that's
437 // in the Finished state at tree-building time on the main thread is still in 496 // in the Finished state at tree-building time on the main thread is still in
438 // the Running state right after commit on the compositor thread. 497 // the Running state right after commit on the compositor thread.
439 const bool has_any_transform_animation = 498 const bool has_any_transform_animation =
440 layer->HasAnyAnimationTargetingProperty(TargetProperty::TRANSFORM); 499 HasAnyAnimationTargetingProperty(layer, TargetProperty::TRANSFORM);
441 500
442 const bool has_surface = created_render_surface; 501 const bool has_surface = created_render_surface;
443 502
444 // A transform node is needed to change the render target for subtree when 503 // A transform node is needed to change the render target for subtree when
445 // a scroll child's render target is different from the scroll parent's render 504 // a scroll child's render target is different from the scroll parent's render
446 // target. 505 // target.
447 const bool scroll_child_has_different_target = 506 const bool scroll_child_has_different_target =
448 ScrollParent(layer) && 507 ScrollParent(layer) &&
449 Parent(layer)->effect_tree_index() != 508 Parent(layer)->effect_tree_index() !=
450 ScrollParent(layer)->effect_tree_index(); 509 ScrollParent(layer)->effect_tree_index();
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 ->transform_id); 610 ->transform_id);
552 data_for_children->property_trees->transform_tree.SetContentTargetId( 611 data_for_children->property_trees->transform_tree.SetContentTargetId(
553 node->id, data_for_children->property_trees->effect_tree 612 node->id, data_for_children->property_trees->effect_tree
554 .Node(data_for_children->render_target) 613 .Node(data_for_children->render_target)
555 ->transform_id); 614 ->transform_id);
556 DCHECK_NE( 615 DCHECK_NE(
557 data_for_children->property_trees->transform_tree.TargetId(node->id), 616 data_for_children->property_trees->transform_tree.TargetId(node->id),
558 kInvalidPropertyTreeNodeId); 617 kInvalidPropertyTreeNodeId);
559 618
560 node->has_potential_animation = has_potentially_animated_transform; 619 node->has_potential_animation = has_potentially_animated_transform;
561 node->is_currently_animating = layer->TransformIsAnimating(); 620 node->is_currently_animating = TransformIsAnimating(layer);
562 if (has_potentially_animated_transform) { 621 if (has_potentially_animated_transform) {
563 node->has_only_translation_animations = 622 node->has_only_translation_animations =
564 layer->HasOnlyTranslationTransforms(); 623 HasOnlyTranslationTransforms(layer);
565 } 624 }
566 625
567 float post_local_scale_factor = 1.0f; 626 float post_local_scale_factor = 1.0f;
568 if (is_root) 627 if (is_root)
569 post_local_scale_factor = 628 post_local_scale_factor =
570 data_for_children->property_trees->transform_tree.device_scale_factor(); 629 data_for_children->property_trees->transform_tree.device_scale_factor();
571 630
572 if (is_page_scale_layer) { 631 if (is_page_scale_layer) {
573 post_local_scale_factor *= data_from_ancestor.page_scale_factor; 632 post_local_scale_factor *= data_from_ancestor.page_scale_factor;
574 data_for_children->property_trees->transform_tree.set_page_scale_factor( 633 data_for_children->property_trees->transform_tree.set_page_scale_factor(
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 layer->set_should_flatten_transform_from_property_tree(false); 694 layer->set_should_flatten_transform_from_property_tree(false);
636 695
637 data_for_children->scroll_snap += node->scroll_snap; 696 data_for_children->scroll_snap += node->scroll_snap;
638 697
639 node->owner_id = layer->id(); 698 node->owner_id = layer->id();
640 699
641 return true; 700 return true;
642 } 701 }
643 702
644 static inline bool HasPotentialOpacityAnimation(Layer* layer) { 703 static inline bool HasPotentialOpacityAnimation(Layer* layer) {
645 return layer->HasPotentiallyRunningOpacityAnimation() || 704 return HasPotentiallyRunningOpacityAnimation(layer) ||
646 layer->OpacityCanAnimateOnImplThread(); 705 layer->OpacityCanAnimateOnImplThread();
647 } 706 }
648 707
649 static inline bool HasPotentialOpacityAnimation(LayerImpl* layer) { 708 static inline bool HasPotentialOpacityAnimation(LayerImpl* layer) {
650 return layer->HasPotentiallyRunningOpacityAnimation() || 709 return HasPotentiallyRunningOpacityAnimation(layer) ||
651 layer->test_properties()->opacity_can_animate; 710 layer->test_properties()->opacity_can_animate;
652 } 711 }
653 712
654 static inline bool DoubleSided(Layer* layer) { 713 static inline bool DoubleSided(Layer* layer) {
655 return layer->double_sided(); 714 return layer->double_sided();
656 } 715 }
657 716
658 static inline bool DoubleSided(LayerImpl* layer) { 717 static inline bool DoubleSided(LayerImpl* layer) {
659 return layer->test_properties()->double_sided; 718 return layer->test_properties()->double_sided;
660 } 719 }
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
738 static inline bool HasCopyRequest(LayerImpl* layer) { 797 static inline bool HasCopyRequest(LayerImpl* layer) {
739 return !layer->test_properties()->copy_requests.empty(); 798 return !layer->test_properties()->copy_requests.empty();
740 } 799 }
741 800
742 template <typename LayerType> 801 template <typename LayerType>
743 bool ShouldCreateRenderSurface(LayerType* layer, 802 bool ShouldCreateRenderSurface(LayerType* layer,
744 gfx::Transform current_transform, 803 gfx::Transform current_transform,
745 bool axis_aligned) { 804 bool axis_aligned) {
746 const bool preserves_2d_axis_alignment = 805 const bool preserves_2d_axis_alignment =
747 (current_transform * layer->transform()).Preserves2dAxisAlignment() && 806 (current_transform * layer->transform()).Preserves2dAxisAlignment() &&
748 axis_aligned && layer->AnimationsPreserveAxisAlignment(); 807 axis_aligned && AnimationsPreserveAxisAlignment(layer);
749 const bool is_root = !Parent(layer); 808 const bool is_root = !Parent(layer);
750 if (is_root) 809 if (is_root)
751 return true; 810 return true;
752 811
753 // If the layer uses a mask and the layer is not a replica layer. 812 // If the layer uses a mask and the layer is not a replica layer.
754 // TODO(weiliangc): After slimming paint there won't be replica layers. 813 // TODO(weiliangc): After slimming paint there won't be replica layers.
755 if (MaskLayer(layer) && ReplicaLayer(Parent(layer)) != layer) { 814 if (MaskLayer(layer) && ReplicaLayer(Parent(layer)) != layer) {
756 return true; 815 return true;
757 } 816 }
758 817
759 // If the layer has a reflection. 818 // If the layer has a reflection.
760 if (ReplicaLayer(layer)) { 819 if (ReplicaLayer(layer)) {
761 return true; 820 return true;
762 } 821 }
763 822
764 // If the layer uses a CSS filter. 823 // If the layer uses a CSS filter.
765 if (!layer->filters().IsEmpty() || !BackgroundFilters(layer).IsEmpty()) { 824 if (!layer->filters().IsEmpty() || !BackgroundFilters(layer).IsEmpty()) {
766 return true; 825 return true;
767 } 826 }
768 827
769 // If the layer will use a CSS filter. In this case, the animation 828 // If the layer will use a CSS filter. In this case, the animation
770 // will start and add a filter to this layer, so it needs a surface. 829 // will start and add a filter to this layer, so it needs a surface.
771 if (layer->HasPotentiallyRunningFilterAnimation()) { 830 if (HasPotentiallyRunningFilterAnimation(layer)) {
772 return true; 831 return true;
773 } 832 }
774 833
775 int num_descendants_that_draw_content = NumDescendantsThatDrawContent(layer); 834 int num_descendants_that_draw_content = NumDescendantsThatDrawContent(layer);
776 835
777 // If the layer flattens its subtree, but it is treated as a 3D object by its 836 // If the layer flattens its subtree, but it is treated as a 3D object by its
778 // parent (i.e. parent participates in a 3D rendering context). 837 // parent (i.e. parent participates in a 3D rendering context).
779 if (LayerIsInExisting3DRenderingContext(layer) && 838 if (LayerIsInExisting3DRenderingContext(layer) &&
780 ShouldFlattenTransform(layer) && num_descendants_that_draw_content > 0) { 839 ShouldFlattenTransform(layer) && num_descendants_that_draw_content > 0) {
781 TRACE_EVENT_INSTANT0( 840 TRACE_EVENT_INSTANT0(
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
865 LayerType* layer, 924 LayerType* layer,
866 DataForRecursion<LayerType>* data_for_children) { 925 DataForRecursion<LayerType>* data_for_children) {
867 const bool is_root = !Parent(layer); 926 const bool is_root = !Parent(layer);
868 const bool has_transparency = EffectiveOpacity(layer) != 1.f; 927 const bool has_transparency = EffectiveOpacity(layer) != 1.f;
869 const bool has_potential_opacity_animation = 928 const bool has_potential_opacity_animation =
870 HasPotentialOpacityAnimation(layer); 929 HasPotentialOpacityAnimation(layer);
871 const bool should_create_render_surface = ShouldCreateRenderSurface( 930 const bool should_create_render_surface = ShouldCreateRenderSurface(
872 layer, data_from_ancestor.compound_transform_since_render_target, 931 layer, data_from_ancestor.compound_transform_since_render_target,
873 data_from_ancestor.axis_align_since_render_target); 932 data_from_ancestor.axis_align_since_render_target);
874 data_for_children->axis_align_since_render_target &= 933 data_for_children->axis_align_since_render_target &=
875 layer->AnimationsPreserveAxisAlignment(); 934 AnimationsPreserveAxisAlignment(layer);
876 935
877 bool requires_node = is_root || has_transparency || 936 bool requires_node = is_root || has_transparency ||
878 has_potential_opacity_animation || 937 has_potential_opacity_animation ||
879 should_create_render_surface; 938 should_create_render_surface;
880 939
881 int parent_id = data_from_ancestor.effect_tree_parent; 940 int parent_id = data_from_ancestor.effect_tree_parent;
882 941
883 if (!requires_node) { 942 if (!requires_node) {
884 layer->SetEffectTreeIndex(parent_id); 943 layer->SetEffectTreeIndex(parent_id);
885 data_for_children->effect_tree_parent = parent_id; 944 data_for_children->effect_tree_parent = parent_id;
886 data_for_children->compound_transform_since_render_target *= 945 data_for_children->compound_transform_since_render_target *=
887 layer->transform(); 946 layer->transform();
888 return false; 947 return false;
889 } 948 }
890 949
891 EffectNode node; 950 EffectNode node;
892 node.owner_id = layer->id(); 951 node.owner_id = layer->id();
893 if (AlwaysUseActiveTreeOpacity(layer)) { 952 if (AlwaysUseActiveTreeOpacity(layer)) {
894 data_for_children->property_trees->always_use_active_tree_opacity_effect_ids 953 data_for_children->property_trees->always_use_active_tree_opacity_effect_ids
895 .push_back(node.owner_id); 954 .push_back(node.owner_id);
896 } 955 }
897 956
898 node.opacity = Opacity(layer); 957 node.opacity = Opacity(layer);
899 node.has_render_surface = should_create_render_surface; 958 node.has_render_surface = should_create_render_surface;
900 node.has_copy_request = HasCopyRequest(layer); 959 node.has_copy_request = HasCopyRequest(layer);
901 node.background_filters = BackgroundFilters(layer); 960 node.background_filters = BackgroundFilters(layer);
902 node.has_potential_opacity_animation = has_potential_opacity_animation; 961 node.has_potential_opacity_animation = has_potential_opacity_animation;
903 node.double_sided = DoubleSided(layer); 962 node.double_sided = DoubleSided(layer);
904 node.subtree_hidden = HideLayerAndSubtree(layer); 963 node.subtree_hidden = HideLayerAndSubtree(layer);
905 node.is_currently_animating_opacity = layer->OpacityIsAnimating(); 964 node.is_currently_animating_opacity = OpacityIsAnimating(layer);
906 965
907 EffectTree& effect_tree = data_for_children->property_trees->effect_tree; 966 EffectTree& effect_tree = data_for_children->property_trees->effect_tree;
908 if (MaskLayer(layer)) { 967 if (MaskLayer(layer)) {
909 node.mask_layer_id = MaskLayer(layer)->id(); 968 node.mask_layer_id = MaskLayer(layer)->id();
910 effect_tree.AddMaskOrReplicaLayerId(node.mask_layer_id); 969 effect_tree.AddMaskOrReplicaLayerId(node.mask_layer_id);
911 } 970 }
912 if (ReplicaLayer(layer)) { 971 if (ReplicaLayer(layer)) {
913 node.replica_layer_id = ReplicaLayer(layer)->id(); 972 node.replica_layer_id = ReplicaLayer(layer)->id();
914 effect_tree.AddMaskOrReplicaLayerId(node.replica_layer_id); 973 effect_tree.AddMaskOrReplicaLayerId(node.replica_layer_id);
915 if (MaskLayer(ReplicaLayer(layer))) { 974 if (MaskLayer(ReplicaLayer(layer))) {
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 color = SkColorSetA(color, 255); 1438 color = SkColorSetA(color, 255);
1380 BuildPropertyTreesTopLevelInternal( 1439 BuildPropertyTreesTopLevelInternal(
1381 root_layer, page_scale_layer, inner_viewport_scroll_layer, 1440 root_layer, page_scale_layer, inner_viewport_scroll_layer,
1382 outer_viewport_scroll_layer, overscroll_elasticity_layer, 1441 outer_viewport_scroll_layer, overscroll_elasticity_layer,
1383 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 1442 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
1384 device_transform, property_trees, color); 1443 device_transform, property_trees, color);
1385 property_trees->ResetCachedData(); 1444 property_trees->ResetCachedData();
1386 } 1445 }
1387 1446
1388 } // namespace cc 1447 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698