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

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

Issue 1626513003: Add ScrollTree builder and unit test (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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 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>
(...skipping 13 matching lines...) Expand all
24 namespace { 24 namespace {
25 25
26 static const int kInvalidPropertyTreeNodeId = -1; 26 static const int kInvalidPropertyTreeNodeId = -1;
27 static const int kRootPropertyTreeNodeId = 0; 27 static const int kRootPropertyTreeNodeId = 0;
28 28
29 template <typename LayerType> 29 template <typename LayerType>
30 struct DataForRecursion { 30 struct DataForRecursion {
31 TransformTree* transform_tree; 31 TransformTree* transform_tree;
32 ClipTree* clip_tree; 32 ClipTree* clip_tree;
33 EffectTree* effect_tree; 33 EffectTree* effect_tree;
34 ScrollTree* scroll_tree;
34 LayerType* transform_tree_parent; 35 LayerType* transform_tree_parent;
35 LayerType* transform_fixed_parent; 36 LayerType* transform_fixed_parent;
36 int render_target; 37 int render_target;
37 int clip_tree_parent; 38 int clip_tree_parent;
38 int effect_tree_parent; 39 int effect_tree_parent;
40 int scroll_tree_parent;
39 const LayerType* page_scale_layer; 41 const LayerType* page_scale_layer;
40 const LayerType* inner_viewport_scroll_layer; 42 const LayerType* inner_viewport_scroll_layer;
41 const LayerType* outer_viewport_scroll_layer; 43 const LayerType* outer_viewport_scroll_layer;
42 const LayerType* overscroll_elasticity_layer; 44 const LayerType* overscroll_elasticity_layer;
43 gfx::Vector2dF elastic_overscroll; 45 gfx::Vector2dF elastic_overscroll;
44 float page_scale_factor; 46 float page_scale_factor;
45 bool in_subtree_of_page_scale_layer; 47 bool in_subtree_of_page_scale_layer;
46 bool affected_by_inner_viewport_bounds_delta; 48 bool affected_by_inner_viewport_bounds_delta;
47 bool affected_by_outer_viewport_bounds_delta; 49 bool affected_by_outer_viewport_bounds_delta;
48 bool should_flatten; 50 bool should_flatten;
49 bool target_is_clipped; 51 bool target_is_clipped;
50 bool is_hidden; 52 bool is_hidden;
53 bool scroll_other_criteria;
54 ScrollBlocksOn accumulated_scroll_blocks_on;
51 const gfx::Transform* device_transform; 55 const gfx::Transform* device_transform;
52 gfx::Vector2dF scroll_compensation_adjustment; 56 gfx::Vector2dF scroll_compensation_adjustment;
53 gfx::Transform compound_transform_since_render_target; 57 gfx::Transform compound_transform_since_render_target;
54 bool axis_align_since_render_target; 58 bool axis_align_since_render_target;
55 int sequence_number; 59 int sequence_number;
56 }; 60 };
57 61
58 template <typename LayerType> 62 template <typename LayerType>
59 struct DataForRecursionFromChild { 63 struct DataForRecursionFromChild {
60 int num_copy_requests_in_subtree; 64 int num_copy_requests_in_subtree;
(...skipping 21 matching lines...) Expand all
82 : layer->clip_parent()->clip_tree_index(); 86 : layer->clip_parent()->clip_tree_index();
83 return data.clip_tree->Node(id); 87 return data.clip_tree->Node(id);
84 } 88 }
85 89
86 template <typename LayerType> 90 template <typename LayerType>
87 static bool LayerClipsSubtree(LayerType* layer) { 91 static bool LayerClipsSubtree(LayerType* layer) {
88 return layer->masks_to_bounds() || layer->mask_layer(); 92 return layer->masks_to_bounds() || layer->mask_layer();
89 } 93 }
90 94
91 template <typename LayerType> 95 template <typename LayerType>
96 static int GetScrollParentId(const DataForRecursion<LayerType>& data,
97 LayerType* layer) {
98 const bool inherits_scroll = !layer->parent() || !layer->scroll_parent();
jaydasika 2016/01/22 22:28:28 Why do we need !layer->parent() here ? (The only c
sunxd 2016/01/25 15:37:21 I made this identical to GetClipParentId, is it th
99 const int id = inherits_scroll ? data.scroll_tree_parent
100 : layer->scroll_parent()->scroll_tree_index();
101 return id;
102 }
103
104 template <typename LayerType>
92 void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor, 105 void AddClipNodeIfNeeded(const DataForRecursion<LayerType>& data_from_ancestor,
93 LayerType* layer, 106 LayerType* layer,
94 bool created_render_surface, 107 bool created_render_surface,
95 bool created_transform_node, 108 bool created_transform_node,
96 DataForRecursion<LayerType>* data_for_children) { 109 DataForRecursion<LayerType>* data_for_children) {
97 ClipNode* parent = GetClipParent(data_from_ancestor, layer); 110 ClipNode* parent = GetClipParent(data_from_ancestor, layer);
98 int parent_id = parent->id; 111 int parent_id = parent->id;
99 112
100 bool is_root = !layer->parent(); 113 bool is_root = !layer->parent();
101 114
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after
613 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent); 626 layer->SetEffectTreeIndex(data_for_children->effect_tree_parent);
614 if (should_create_render_surface) { 627 if (should_create_render_surface) {
615 data_for_children->compound_transform_since_render_target = 628 data_for_children->compound_transform_since_render_target =
616 gfx::Transform(); 629 gfx::Transform();
617 data_for_children->axis_align_since_render_target = true; 630 data_for_children->axis_align_since_render_target = true;
618 } 631 }
619 return should_create_render_surface; 632 return should_create_render_surface;
620 } 633 }
621 634
622 template <typename LayerType> 635 template <typename LayerType>
636 void AddScrollNodeIfNeeded(
637 const DataForRecursion<LayerType>& data_from_ancestor,
638 LayerType* layer,
639 DataForRecursion<LayerType>* data_for_children) {
640 int parent_id = GetScrollParentId(data_from_ancestor, layer);
641
642 bool is_root = !layer->parent();
643 bool scrollable = layer->scrollable();
644 ScrollBlocksOn scroll_blocks_on = layer->scroll_blocks_on();
645 ScrollBlocksOn accumulated_scroll_blocks_on =
646 data_from_ancestor.accumulated_scroll_blocks_on;
647 bool contains_non_fast_scrollable_region =
648 !layer->non_fast_scrollable_region().IsEmpty();
649 bool should_scroll_on_main_thread = layer->should_scroll_on_main_thread();
650
651 bool other_criteria = is_root || scrollable ||
652 (scroll_blocks_on | accumulated_scroll_blocks_on) !=
653 accumulated_scroll_blocks_on ||
654 contains_non_fast_scrollable_region;
655 bool requires_node =
656 other_criteria || (should_scroll_on_main_thread &&
657 data_from_ancestor.scroll_other_criteria);
ajuma 2016/01/25 15:19:54 What's the intuition behind passing scroll_other_c
sunxd 2016/01/25 15:37:21 The idea is that we do not create scroll nodes for
ajuma 2016/01/25 16:21:59 Thanks, those names sound clearer. Please also add
658
659 if (!requires_node) {
660 data_for_children->scroll_tree_parent = parent_id;
661 } else {
662 ScrollNode node;
663 node.owner_id = layer->id();
664 node.data.scrollable = scrollable;
665 node.data.should_scroll_on_main_thread = should_scroll_on_main_thread;
666 node.data.scroll_blocks_on =
667 scroll_blocks_on | accumulated_scroll_blocks_on;
668 node.data.contains_non_fast_scrollable_region =
669 contains_non_fast_scrollable_region;
670 node.data.transform_id =
671 data_for_children->transform_tree_parent->transform_tree_index();
672 data_for_children->scroll_tree_parent =
673 data_for_children->scroll_tree->Insert(node, parent_id);
674 data_for_children->scroll_other_criteria = other_criteria;
675 data_for_children->accumulated_scroll_blocks_on =
676 node.data.scroll_blocks_on;
677 }
678
679 layer->SetScrollTreeIndex(data_for_children->scroll_tree_parent);
680 }
681
682 template <typename LayerType>
623 void BuildPropertyTreesInternal( 683 void BuildPropertyTreesInternal(
624 LayerType* layer, 684 LayerType* layer,
625 const DataForRecursion<LayerType>& data_from_parent, 685 const DataForRecursion<LayerType>& data_from_parent,
626 DataForRecursionFromChild<LayerType>* data_to_parent) { 686 DataForRecursionFromChild<LayerType>* data_to_parent) {
627 layer->set_property_tree_sequence_number(data_from_parent.sequence_number); 687 layer->set_property_tree_sequence_number(data_from_parent.sequence_number);
628 if (layer->mask_layer()) 688 if (layer->mask_layer())
629 layer->mask_layer()->set_property_tree_sequence_number( 689 layer->mask_layer()->set_property_tree_sequence_number(
630 data_from_parent.sequence_number); 690 data_from_parent.sequence_number);
631 691
632 DataForRecursion<LayerType> data_for_children(data_from_parent); 692 DataForRecursion<LayerType> data_for_children(data_from_parent);
633 693
634 bool created_render_surface = 694 bool created_render_surface =
635 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children); 695 AddEffectNodeIfNeeded(data_from_parent, layer, &data_for_children);
636 696
637 if (created_render_surface) { 697 if (created_render_surface) {
638 data_for_children.render_target = data_for_children.effect_tree_parent; 698 data_for_children.render_target = data_for_children.effect_tree_parent;
639 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode); 699 layer->set_draw_blend_mode(SkXfermode::kSrcOver_Mode);
640 } else { 700 } else {
641 layer->set_draw_blend_mode(layer->blend_mode()); 701 layer->set_draw_blend_mode(layer->blend_mode());
642 } 702 }
643 703
644 bool created_transform_node = AddTransformNodeIfNeeded( 704 bool created_transform_node = AddTransformNodeIfNeeded(
645 data_from_parent, layer, created_render_surface, &data_for_children); 705 data_from_parent, layer, created_render_surface, &data_for_children);
646 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface, 706 AddClipNodeIfNeeded(data_from_parent, layer, created_render_surface,
647 created_transform_node, &data_for_children); 707 created_transform_node, &data_for_children);
648 708
709 AddScrollNodeIfNeeded(data_from_parent, layer, &data_for_children);
710
649 data_for_children.is_hidden = 711 data_for_children.is_hidden =
650 layer->hide_layer_and_subtree() || data_from_parent.is_hidden; 712 layer->hide_layer_and_subtree() || data_from_parent.is_hidden;
651 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden); 713 layer->set_is_hidden_from_property_trees(data_for_children.is_hidden);
652 714
653 for (size_t i = 0; i < layer->children().size(); ++i) { 715 for (size_t i = 0; i < layer->children().size(); ++i) {
654 if (!layer->child_at(i)->scroll_parent()) { 716 if (!layer->child_at(i)->scroll_parent()) {
655 DataForRecursionFromChild<LayerType> data_from_child; 717 DataForRecursionFromChild<LayerType> data_from_child;
656 BuildPropertyTreesInternal(layer->child_at(i), data_for_children, 718 BuildPropertyTreesInternal(layer->child_at(i), data_for_children,
657 &data_from_child); 719 &data_from_child);
658 data_to_parent->Merge(data_from_child); 720 data_to_parent->Merge(data_from_child);
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 root_layer->position()); 782 root_layer->position());
721 return; 783 return;
722 } 784 }
723 785
724 property_trees->sequence_number++; 786 property_trees->sequence_number++;
725 787
726 DataForRecursion<LayerType> data_for_recursion; 788 DataForRecursion<LayerType> data_for_recursion;
727 data_for_recursion.transform_tree = &property_trees->transform_tree; 789 data_for_recursion.transform_tree = &property_trees->transform_tree;
728 data_for_recursion.clip_tree = &property_trees->clip_tree; 790 data_for_recursion.clip_tree = &property_trees->clip_tree;
729 data_for_recursion.effect_tree = &property_trees->effect_tree; 791 data_for_recursion.effect_tree = &property_trees->effect_tree;
792 data_for_recursion.scroll_tree = &property_trees->scroll_tree;
730 data_for_recursion.transform_tree_parent = nullptr; 793 data_for_recursion.transform_tree_parent = nullptr;
731 data_for_recursion.transform_fixed_parent = nullptr; 794 data_for_recursion.transform_fixed_parent = nullptr;
732 data_for_recursion.render_target = kRootPropertyTreeNodeId; 795 data_for_recursion.render_target = kRootPropertyTreeNodeId;
733 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId; 796 data_for_recursion.clip_tree_parent = kRootPropertyTreeNodeId;
734 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId; 797 data_for_recursion.effect_tree_parent = kInvalidPropertyTreeNodeId;
798 data_for_recursion.scroll_tree_parent = kRootPropertyTreeNodeId;
735 data_for_recursion.page_scale_layer = page_scale_layer; 799 data_for_recursion.page_scale_layer = page_scale_layer;
736 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer; 800 data_for_recursion.inner_viewport_scroll_layer = inner_viewport_scroll_layer;
737 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer; 801 data_for_recursion.outer_viewport_scroll_layer = outer_viewport_scroll_layer;
738 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer; 802 data_for_recursion.overscroll_elasticity_layer = overscroll_elasticity_layer;
739 data_for_recursion.elastic_overscroll = elastic_overscroll; 803 data_for_recursion.elastic_overscroll = elastic_overscroll;
740 data_for_recursion.page_scale_factor = page_scale_factor; 804 data_for_recursion.page_scale_factor = page_scale_factor;
741 data_for_recursion.in_subtree_of_page_scale_layer = false; 805 data_for_recursion.in_subtree_of_page_scale_layer = false;
742 data_for_recursion.affected_by_inner_viewport_bounds_delta = false; 806 data_for_recursion.affected_by_inner_viewport_bounds_delta = false;
743 data_for_recursion.affected_by_outer_viewport_bounds_delta = false; 807 data_for_recursion.affected_by_outer_viewport_bounds_delta = false;
744 data_for_recursion.should_flatten = false; 808 data_for_recursion.should_flatten = false;
745 data_for_recursion.target_is_clipped = false; 809 data_for_recursion.target_is_clipped = false;
746 data_for_recursion.is_hidden = false; 810 data_for_recursion.is_hidden = false;
811 data_for_recursion.scroll_other_criteria = true;
812 data_for_recursion.accumulated_scroll_blocks_on = SCROLL_BLOCKS_ON_NONE;
747 data_for_recursion.device_transform = &device_transform; 813 data_for_recursion.device_transform = &device_transform;
748 814
749 data_for_recursion.transform_tree->clear(); 815 data_for_recursion.transform_tree->clear();
750 data_for_recursion.clip_tree->clear(); 816 data_for_recursion.clip_tree->clear();
751 data_for_recursion.effect_tree->clear(); 817 data_for_recursion.effect_tree->clear();
818 data_for_recursion.scroll_tree->clear();
752 data_for_recursion.compound_transform_since_render_target = gfx::Transform(); 819 data_for_recursion.compound_transform_since_render_target = gfx::Transform();
753 data_for_recursion.axis_align_since_render_target = true; 820 data_for_recursion.axis_align_since_render_target = true;
754 data_for_recursion.sequence_number = property_trees->sequence_number; 821 data_for_recursion.sequence_number = property_trees->sequence_number;
755 data_for_recursion.transform_tree->set_device_scale_factor( 822 data_for_recursion.transform_tree->set_device_scale_factor(
756 device_scale_factor); 823 device_scale_factor);
757 824
758 ClipNode root_clip; 825 ClipNode root_clip;
759 root_clip.data.resets_clip = true; 826 root_clip.data.resets_clip = true;
760 root_clip.data.applies_local_clip = true; 827 root_clip.data.applies_local_clip = true;
761 root_clip.data.clip = gfx::RectF(viewport); 828 root_clip.data.clip = gfx::RectF(viewport);
762 root_clip.data.transform_id = kRootPropertyTreeNodeId; 829 root_clip.data.transform_id = kRootPropertyTreeNodeId;
763 data_for_recursion.clip_tree_parent = 830 data_for_recursion.clip_tree_parent =
764 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId); 831 data_for_recursion.clip_tree->Insert(root_clip, kRootPropertyTreeNodeId);
765 832
766 DataForRecursionFromChild<LayerType> data_from_child; 833 DataForRecursionFromChild<LayerType> data_from_child;
767 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child); 834 BuildPropertyTreesInternal(root_layer, data_for_recursion, &data_from_child);
768 property_trees->needs_rebuild = false; 835 property_trees->needs_rebuild = false;
769 836
770 // The transform tree is kept up-to-date as it is built, but the 837 // The transform tree is kept up-to-date as it is built, but the
771 // combined_clips stored in the clip tree aren't computed during tree 838 // combined_clips stored in the clip tree aren't computed during tree
772 // building. 839 // building.
773 property_trees->transform_tree.set_needs_update(false); 840 property_trees->transform_tree.set_needs_update(false);
774 property_trees->clip_tree.set_needs_update(true); 841 property_trees->clip_tree.set_needs_update(true);
775 property_trees->effect_tree.set_needs_update(false); 842 property_trees->effect_tree.set_needs_update(false);
843 property_trees->scroll_tree.set_needs_update(false);
776 } 844 }
777 845
778 void PropertyTreeBuilder::BuildPropertyTrees( 846 void PropertyTreeBuilder::BuildPropertyTrees(
779 Layer* root_layer, 847 Layer* root_layer,
780 const Layer* page_scale_layer, 848 const Layer* page_scale_layer,
781 const Layer* inner_viewport_scroll_layer, 849 const Layer* inner_viewport_scroll_layer,
782 const Layer* outer_viewport_scroll_layer, 850 const Layer* outer_viewport_scroll_layer,
783 const Layer* overscroll_elasticity_layer, 851 const Layer* overscroll_elasticity_layer,
784 const gfx::Vector2dF& elastic_overscroll, 852 const gfx::Vector2dF& elastic_overscroll,
785 float page_scale_factor, 853 float page_scale_factor,
(...skipping 21 matching lines...) Expand all
807 const gfx::Transform& device_transform, 875 const gfx::Transform& device_transform,
808 PropertyTrees* property_trees) { 876 PropertyTrees* property_trees) {
809 BuildPropertyTreesTopLevelInternal( 877 BuildPropertyTreesTopLevelInternal(
810 root_layer, page_scale_layer, inner_viewport_scroll_layer, 878 root_layer, page_scale_layer, inner_viewport_scroll_layer,
811 outer_viewport_scroll_layer, overscroll_elasticity_layer, 879 outer_viewport_scroll_layer, overscroll_elasticity_layer,
812 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 880 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
813 device_transform, property_trees); 881 device_transform, property_trees);
814 } 882 }
815 883
816 } // namespace cc 884 } // namespace cc
OLDNEW
« cc/trees/layer_tree_host_common_unittest.cc ('K') | « cc/trees/layer_tree_host_common_unittest.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698