| OLD | NEW |
| 1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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/layer_tree_impl.h" | 5 #include "cc/trees/layer_tree_impl.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 #include "cc/trees/scroll_node.h" | 44 #include "cc/trees/scroll_node.h" |
| 45 #include "cc/trees/transform_node.h" | 45 #include "cc/trees/transform_node.h" |
| 46 #include "ui/gfx/geometry/box_f.h" | 46 #include "ui/gfx/geometry/box_f.h" |
| 47 #include "ui/gfx/geometry/point_conversions.h" | 47 #include "ui/gfx/geometry/point_conversions.h" |
| 48 #include "ui/gfx/geometry/rect_conversions.h" | 48 #include "ui/gfx/geometry/rect_conversions.h" |
| 49 #include "ui/gfx/geometry/size_conversions.h" | 49 #include "ui/gfx/geometry/size_conversions.h" |
| 50 #include "ui/gfx/geometry/vector2d_conversions.h" | 50 #include "ui/gfx/geometry/vector2d_conversions.h" |
| 51 | 51 |
| 52 namespace cc { | 52 namespace cc { |
| 53 | 53 |
| 54 void LayerTreeLifecycle::AdvanceTo(LifecycleState next_state) { |
| 55 switch (next_state) { |
| 56 case (kNotSyncing): |
| 57 DCHECK_EQ(state_, kLastSyncState); |
| 58 break; |
| 59 case (kBeginningSync): |
| 60 case (kSyncedPropertyTrees): |
| 61 case (kSyncedLayerProperties): |
| 62 // Only allow tree synchronization states to be transitioned in order. |
| 63 DCHECK_EQ(state_ + 1, next_state); |
| 64 state_ = next_state; |
| 65 break; |
| 66 } |
| 67 state_ = next_state; |
| 68 } |
| 69 |
| 54 LayerTreeImpl::LayerTreeImpl( | 70 LayerTreeImpl::LayerTreeImpl( |
| 55 LayerTreeHostImpl* layer_tree_host_impl, | 71 LayerTreeHostImpl* layer_tree_host_impl, |
| 56 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, | 72 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, |
| 57 scoped_refptr<SyncedBrowserControls> top_controls_shown_ratio, | 73 scoped_refptr<SyncedBrowserControls> top_controls_shown_ratio, |
| 58 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) | 74 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) |
| 59 : layer_tree_host_impl_(layer_tree_host_impl), | 75 : layer_tree_host_impl_(layer_tree_host_impl), |
| 60 source_frame_number_(-1), | 76 source_frame_number_(-1), |
| 61 is_first_frame_after_commit_tracker_(-1), | 77 is_first_frame_after_commit_tracker_(-1), |
| 62 root_layer_for_testing_(nullptr), | 78 root_layer_for_testing_(nullptr), |
| 63 hud_layer_(nullptr), | 79 hud_layer_(nullptr), |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 DCHECK(OuterViewportContainerLayer()->viewport_layer_type() == | 171 DCHECK(OuterViewportContainerLayer()->viewport_layer_type() == |
| 156 OUTER_VIEWPORT_CONTAINER); | 172 OUTER_VIEWPORT_CONTAINER); |
| 157 #endif | 173 #endif |
| 158 if (auto* layer = LayerById(id)) | 174 if (auto* layer = LayerById(id)) |
| 159 return layer->viewport_layer_type() != NOT_VIEWPORT_LAYER; | 175 return layer->viewport_layer_type() != NOT_VIEWPORT_LAYER; |
| 160 return false; | 176 return false; |
| 161 } | 177 } |
| 162 | 178 |
| 163 void LayerTreeImpl::DidUpdateScrollOffset(int layer_id) { | 179 void LayerTreeImpl::DidUpdateScrollOffset(int layer_id) { |
| 164 DidUpdateScrollState(layer_id); | 180 DidUpdateScrollState(layer_id); |
| 181 DCHECK(lifecycle().AllowsPropertyTreeAccess()); |
| 165 TransformTree& transform_tree = property_trees()->transform_tree; | 182 TransformTree& transform_tree = property_trees()->transform_tree; |
| 166 ScrollTree& scroll_tree = property_trees()->scroll_tree; | 183 ScrollTree& scroll_tree = property_trees()->scroll_tree; |
| 167 int transform_id = TransformTree::kInvalidNodeId; | 184 int transform_id = TransformTree::kInvalidNodeId; |
| 168 | 185 |
| 169 // If pending tree topology changed and we still want to notify the pending | 186 // If pending tree topology changed and we still want to notify the pending |
| 170 // tree about scroll offset in the active tree, we may not find the | 187 // tree about scroll offset in the active tree, we may not find the |
| 171 // corresponding pending layer. | 188 // corresponding pending layer. |
| 172 if (LayerById(layer_id)) { | 189 if (LayerById(layer_id)) { |
| 173 // TODO(sunxd): when we have a layer_id to property_tree index map in | 190 // TODO(sunxd): when we have a layer_id to property_tree index map in |
| 174 // property trees, use the transform_id parameter instead of looking for | 191 // property trees, use the transform_id parameter instead of looking for |
| (...skipping 17 matching lines...) Expand all Loading... |
| 192 } | 209 } |
| 193 | 210 |
| 194 if (IsActiveTree() && layer_tree_host_impl_->pending_tree()) | 211 if (IsActiveTree() && layer_tree_host_impl_->pending_tree()) |
| 195 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id); | 212 layer_tree_host_impl_->pending_tree()->DidUpdateScrollOffset(layer_id); |
| 196 } | 213 } |
| 197 | 214 |
| 198 void LayerTreeImpl::DidUpdateScrollState(int layer_id) { | 215 void LayerTreeImpl::DidUpdateScrollState(int layer_id) { |
| 199 if (!IsActiveTree()) | 216 if (!IsActiveTree()) |
| 200 return; | 217 return; |
| 201 | 218 |
| 219 // The scroll_clip_layer Layer properties should be up-to-date. |
| 220 // TODO(pdr): This DCHECK fails on existing tests but should be enabled. |
| 221 // DCHECK(lifecycle().AllowsLayerPropertyAccess()); |
| 222 |
| 202 if (layer_id == Layer::INVALID_ID) | 223 if (layer_id == Layer::INVALID_ID) |
| 203 return; | 224 return; |
| 204 | 225 |
| 205 int scroll_layer_id, clip_layer_id; | 226 int scroll_layer_id, clip_layer_id; |
| 206 if (IsViewportLayerId(layer_id)) { | 227 if (IsViewportLayerId(layer_id)) { |
| 207 if (!InnerViewportContainerLayer()) | 228 if (!InnerViewportContainerLayer()) |
| 208 return; | 229 return; |
| 209 | 230 |
| 210 // For scrollbar purposes, a change to any of the four viewport layers | 231 // For scrollbar purposes, a change to any of the four viewport layers |
| 211 // should affect the scrollbars tied to the outermost layers, which express | 232 // should affect the scrollbars tied to the outermost layers, which express |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 375 property_trees_.effect_tree.CreateOrReuseRenderSurfaces( | 396 property_trees_.effect_tree.CreateOrReuseRenderSurfaces( |
| 376 &old_render_surfaces, this); | 397 &old_render_surfaces, this); |
| 377 if (render_surfaces_changed) | 398 if (render_surfaces_changed) |
| 378 set_needs_update_draw_properties(); | 399 set_needs_update_draw_properties(); |
| 379 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); | 400 property_trees->effect_tree.PushCopyRequestsTo(&property_trees_.effect_tree); |
| 380 property_trees_.is_main_thread = false; | 401 property_trees_.is_main_thread = false; |
| 381 property_trees_.is_active = IsActiveTree(); | 402 property_trees_.is_active = IsActiveTree(); |
| 382 property_trees_.transform_tree.set_source_to_parent_updates_allowed(false); | 403 property_trees_.transform_tree.set_source_to_parent_updates_allowed(false); |
| 383 } | 404 } |
| 384 | 405 |
| 385 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { | 406 void LayerTreeImpl::PushPropertyTreesTo(LayerTreeImpl* target_tree) { |
| 386 // The request queue should have been processed and does not require a push. | 407 // Property trees may store damage status. We preserve the active tree |
| 387 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); | 408 // damage status by pushing the damage status from active tree property |
| 409 // trees to pending tree property trees or by moving it onto the layers. |
| 410 if (target_tree->property_trees()->changed) { |
| 411 if (property_trees()->sequence_number == |
| 412 target_tree->property_trees()->sequence_number) |
| 413 target_tree->property_trees()->PushChangeTrackingTo(property_trees()); |
| 414 else |
| 415 target_tree->MoveChangeTrackingToLayers(); |
| 416 } |
| 388 | 417 |
| 389 // To maintain the current scrolling node we need to use element ids which | 418 // To maintain the current scrolling node we need to use element ids which |
| 390 // are stable across the property tree update in SetPropertyTrees. | 419 // are stable across the property tree update in SetPropertyTrees. |
| 391 ElementId scrolling_element_id; | 420 ElementId scrolling_element_id; |
| 392 if (ScrollNode* scrolling_node = target_tree->CurrentlyScrollingNode()) | 421 if (ScrollNode* scrolling_node = target_tree->CurrentlyScrollingNode()) |
| 393 scrolling_element_id = scrolling_node->element_id; | 422 scrolling_element_id = scrolling_node->element_id; |
| 394 | 423 |
| 395 target_tree->SetPropertyTrees(&property_trees_); | 424 target_tree->SetPropertyTrees(&property_trees_); |
| 396 | 425 |
| 397 ScrollNode* scrolling_node = nullptr; | 426 ScrollNode* scrolling_node = nullptr; |
| 398 if (scrolling_element_id) { | 427 if (scrolling_element_id) { |
| 399 auto& scroll_tree = target_tree->property_trees()->scroll_tree; | 428 auto& scroll_tree = target_tree->property_trees()->scroll_tree; |
| 400 scrolling_node = scroll_tree.FindNodeFromElementId(scrolling_element_id); | 429 scrolling_node = scroll_tree.FindNodeFromElementId(scrolling_element_id); |
| 401 } | 430 } |
| 402 target_tree->SetCurrentlyScrollingNode(scrolling_node); | 431 target_tree->SetCurrentlyScrollingNode(scrolling_node); |
| 432 } |
| 433 |
| 434 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { |
| 435 // The request queue should have been processed and does not require a push. |
| 436 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); |
| 403 | 437 |
| 404 target_tree->property_trees()->scroll_tree.PushScrollUpdatesFromPendingTree( | 438 target_tree->property_trees()->scroll_tree.PushScrollUpdatesFromPendingTree( |
| 405 &property_trees_, target_tree); | 439 &property_trees_, target_tree); |
| 406 | 440 |
| 407 if (next_activation_forces_redraw_) { | 441 if (next_activation_forces_redraw_) { |
| 408 target_tree->ForceRedrawNextActivation(); | 442 target_tree->ForceRedrawNextActivation(); |
| 409 next_activation_forces_redraw_ = false; | 443 next_activation_forces_redraw_ = false; |
| 410 } | 444 } |
| 411 | 445 |
| 412 target_tree->PassSwapPromises(std::move(swap_promise_list_)); | 446 target_tree->PassSwapPromises(std::move(swap_promise_list_)); |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 756 ++element_id_to_transform; | 790 ++element_id_to_transform; |
| 757 } | 791 } |
| 758 | 792 |
| 759 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { | 793 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [](LayerImpl* layer) { |
| 760 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); | 794 layer->UpdatePropertyTreeForScrollingAndAnimationIfNeeded(); |
| 761 }); | 795 }); |
| 762 } | 796 } |
| 763 | 797 |
| 764 void LayerTreeImpl::SetPageScaleOnActiveTree(float active_page_scale) { | 798 void LayerTreeImpl::SetPageScaleOnActiveTree(float active_page_scale) { |
| 765 DCHECK(IsActiveTree()); | 799 DCHECK(IsActiveTree()); |
| 800 DCHECK(lifecycle().AllowsPropertyTreeAccess()); |
| 766 if (page_scale_factor()->SetCurrent( | 801 if (page_scale_factor()->SetCurrent( |
| 767 ClampPageScaleFactorToLimits(active_page_scale))) { | 802 ClampPageScaleFactorToLimits(active_page_scale))) { |
| 768 DidUpdatePageScale(); | 803 DidUpdatePageScale(); |
| 769 if (PageScaleLayer()) { | 804 if (PageScaleLayer()) { |
| 770 draw_property_utils::UpdatePageScaleFactor( | 805 draw_property_utils::UpdatePageScaleFactor( |
| 771 property_trees(), PageScaleLayer(), current_page_scale_factor(), | 806 property_trees(), PageScaleLayer(), current_page_scale_factor(), |
| 772 device_scale_factor(), layer_tree_host_impl_->DrawTransform()); | 807 device_scale_factor(), layer_tree_host_impl_->DrawTransform()); |
| 773 } else { | 808 } else { |
| 774 DCHECK(layer_list_.empty() || active_page_scale == 1); | 809 DCHECK(layer_list_.empty() || active_page_scale == 1); |
| 775 } | 810 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 806 // TODO(enne): Pushing from pending to active should never require | 841 // TODO(enne): Pushing from pending to active should never require |
| 807 // DidUpdatePageScale. The values should already be set by the fully | 842 // DidUpdatePageScale. The values should already be set by the fully |
| 808 // computed property trees being synced from one tree to another. Remove | 843 // computed property trees being synced from one tree to another. Remove |
| 809 // this once CDP goes away. | 844 // this once CDP goes away. |
| 810 changed_page_scale |= page_scale_factor_->PushPendingToActive(); | 845 changed_page_scale |= page_scale_factor_->PushPendingToActive(); |
| 811 } | 846 } |
| 812 | 847 |
| 813 if (changed_page_scale) | 848 if (changed_page_scale) |
| 814 DidUpdatePageScale(); | 849 DidUpdatePageScale(); |
| 815 | 850 |
| 851 DCHECK(lifecycle().AllowsPropertyTreeAccess()); |
| 816 if (page_scale_factor) { | 852 if (page_scale_factor) { |
| 817 if (PageScaleLayer()) { | 853 if (PageScaleLayer()) { |
| 818 draw_property_utils::UpdatePageScaleFactor( | 854 draw_property_utils::UpdatePageScaleFactor( |
| 819 property_trees(), PageScaleLayer(), current_page_scale_factor(), | 855 property_trees(), PageScaleLayer(), current_page_scale_factor(), |
| 820 device_scale_factor(), layer_tree_host_impl_->DrawTransform()); | 856 device_scale_factor(), layer_tree_host_impl_->DrawTransform()); |
| 821 } else { | 857 } else { |
| 822 DCHECK(layer_list_.empty() || *page_scale_factor == 1); | 858 DCHECK(layer_list_.empty() || *page_scale_factor == 1); |
| 823 } | 859 } |
| 824 } | 860 } |
| 825 } | 861 } |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 973 void LayerTreeImpl::SetViewportLayersFromIds( | 1009 void LayerTreeImpl::SetViewportLayersFromIds( |
| 974 int overscroll_elasticity_layer_id, | 1010 int overscroll_elasticity_layer_id, |
| 975 int page_scale_layer_id, | 1011 int page_scale_layer_id, |
| 976 int inner_viewport_scroll_layer_id, | 1012 int inner_viewport_scroll_layer_id, |
| 977 int outer_viewport_scroll_layer_id) { | 1013 int outer_viewport_scroll_layer_id) { |
| 978 overscroll_elasticity_layer_id_ = overscroll_elasticity_layer_id; | 1014 overscroll_elasticity_layer_id_ = overscroll_elasticity_layer_id; |
| 979 page_scale_layer_id_ = page_scale_layer_id; | 1015 page_scale_layer_id_ = page_scale_layer_id; |
| 980 inner_viewport_scroll_layer_id_ = inner_viewport_scroll_layer_id; | 1016 inner_viewport_scroll_layer_id_ = inner_viewport_scroll_layer_id; |
| 981 outer_viewport_scroll_layer_id_ = outer_viewport_scroll_layer_id; | 1017 outer_viewport_scroll_layer_id_ = outer_viewport_scroll_layer_id; |
| 982 | 1018 |
| 983 UpdateViewportLayerTypes(); | 1019 // The scroll_clip_layer Layer properties should be up-to-date. |
| 984 } | 1020 DCHECK(lifecycle().AllowsLayerPropertyAccess()); |
| 985 | |
| 986 void LayerTreeImpl::ClearViewportLayers() { | |
| 987 SetViewportLayersFromIds(Layer::INVALID_ID, Layer::INVALID_ID, | |
| 988 Layer::INVALID_ID, Layer::INVALID_ID); | |
| 989 } | |
| 990 | |
| 991 void LayerTreeImpl::UpdateViewportLayerTypes() { | |
| 992 if (auto* inner_scroll = LayerById(inner_viewport_scroll_layer_id_)) { | 1021 if (auto* inner_scroll = LayerById(inner_viewport_scroll_layer_id_)) { |
| 993 inner_scroll->SetViewportLayerType(INNER_VIEWPORT_SCROLL); | 1022 inner_scroll->SetViewportLayerType(INNER_VIEWPORT_SCROLL); |
| 994 if (auto* inner_container = inner_scroll->scroll_clip_layer()) | 1023 if (auto* inner_container = inner_scroll->scroll_clip_layer()) |
| 995 inner_container->SetViewportLayerType(INNER_VIEWPORT_CONTAINER); | 1024 inner_container->SetViewportLayerType(INNER_VIEWPORT_CONTAINER); |
| 996 } | 1025 } |
| 997 if (auto* outer_scroll = LayerById(outer_viewport_scroll_layer_id_)) { | 1026 if (auto* outer_scroll = LayerById(outer_viewport_scroll_layer_id_)) { |
| 998 outer_scroll->SetViewportLayerType(OUTER_VIEWPORT_SCROLL); | 1027 outer_scroll->SetViewportLayerType(OUTER_VIEWPORT_SCROLL); |
| 999 if (auto* outer_container = outer_scroll->scroll_clip_layer()) | 1028 if (auto* outer_container = outer_scroll->scroll_clip_layer()) |
| 1000 outer_container->SetViewportLayerType(OUTER_VIEWPORT_CONTAINER); | 1029 outer_container->SetViewportLayerType(OUTER_VIEWPORT_CONTAINER); |
| 1001 } | 1030 } |
| 1002 } | 1031 } |
| 1003 | 1032 |
| 1033 void LayerTreeImpl::ClearViewportLayers() { |
| 1034 SetViewportLayersFromIds(Layer::INVALID_ID, Layer::INVALID_ID, |
| 1035 Layer::INVALID_ID, Layer::INVALID_ID); |
| 1036 } |
| 1037 |
| 1004 // For unit tests, we use the layer's id as its element id. | 1038 // For unit tests, we use the layer's id as its element id. |
| 1005 static void SetElementIdForTesting(LayerImpl* layer) { | 1039 static void SetElementIdForTesting(LayerImpl* layer) { |
| 1006 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); | 1040 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); |
| 1007 } | 1041 } |
| 1008 | 1042 |
| 1009 void LayerTreeImpl::SetElementIdsForTesting() { | 1043 void LayerTreeImpl::SetElementIdsForTesting() { |
| 1010 LayerListIterator<LayerImpl> it(root_layer_for_testing_); | 1044 LayerListIterator<LayerImpl> it(root_layer_for_testing_); |
| 1011 for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { | 1045 for (; it != LayerListIterator<LayerImpl>(nullptr); ++it) { |
| 1012 if (!it->element_id()) | 1046 if (!it->element_id()) |
| 1013 SetElementIdForTesting(*it); | 1047 SetElementIdForTesting(*it); |
| (...skipping 1091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2105 | 2139 |
| 2106 void LayerTreeImpl::ResetAllChangeTracking() { | 2140 void LayerTreeImpl::ResetAllChangeTracking() { |
| 2107 layers_that_should_push_properties_.clear(); | 2141 layers_that_should_push_properties_.clear(); |
| 2108 // Iterate over all layers, including masks. | 2142 // Iterate over all layers, including masks. |
| 2109 for (auto& layer : *layers_) | 2143 for (auto& layer : *layers_) |
| 2110 layer->ResetChangeTracking(); | 2144 layer->ResetChangeTracking(); |
| 2111 property_trees_.ResetAllChangeTracking(); | 2145 property_trees_.ResetAllChangeTracking(); |
| 2112 } | 2146 } |
| 2113 | 2147 |
| 2114 } // namespace cc | 2148 } // namespace cc |
| OLD | NEW |