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

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

Issue 2873313004: Harmonize LayerTreeHost/LayerTreeHostImpl synchronization steps (Closed)
Patch Set: Fix merge conflict with https://codereview.chromium.org/2877033002 Created 3 years, 7 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
« cc/layers/layer_impl.cc ('K') | « cc/trees/layer_tree_impl.h ('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 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
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
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
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
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
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
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
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
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
OLDNEW
« cc/layers/layer_impl.cc ('K') | « cc/trees/layer_tree_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698