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_host.h" | 5 #include "cc/trees/layer_tree_host.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 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
165 LayerTreeHost::~LayerTreeHost() { | 165 LayerTreeHost::~LayerTreeHost() { |
166 // Track when we're inside a main frame to see if compositor is being | 166 // Track when we're inside a main frame to see if compositor is being |
167 // destroyed midway which causes a crash. crbug.com/654672 | 167 // destroyed midway which causes a crash. crbug.com/654672 |
168 DCHECK(!inside_main_frame_); | 168 DCHECK(!inside_main_frame_); |
169 TRACE_EVENT0("cc", "LayerTreeHostInProcess::~LayerTreeHostInProcess"); | 169 TRACE_EVENT0("cc", "LayerTreeHostInProcess::~LayerTreeHostInProcess"); |
170 | 170 |
171 // Clear any references into the LayerTreeHost. | 171 // Clear any references into the LayerTreeHost. |
172 mutator_host_->SetMutatorHostClient(nullptr); | 172 mutator_host_->SetMutatorHostClient(nullptr); |
173 | 173 |
174 // We must clear any pointers into the layer tree prior to destroying it. | 174 // We must clear any pointers into the layer tree prior to destroying it. |
175 RegisterViewportLayers(nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); | 175 RegisterViewportLayers(ViewportLayers()); |
176 | 176 |
177 if (root_layer_) { | 177 if (root_layer_) { |
178 root_layer_->SetLayerTreeHost(nullptr); | 178 root_layer_->SetLayerTreeHost(nullptr); |
179 | 179 |
180 // The root layer must be destroyed before the layer tree. We've made a | 180 // The root layer must be destroyed before the layer tree. We've made a |
181 // contract with our animation controllers that the animation_host will | 181 // contract with our animation controllers that the animation_host will |
182 // outlive them, and we must make good. | 182 // outlive them, and we must make good. |
183 root_layer_ = nullptr; | 183 root_layer_ = nullptr; |
184 } | 184 } |
185 | 185 |
(...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 } | 672 } |
673 | 673 |
674 bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) { | 674 bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) { |
675 TRACE_EVENT1("cc", "LayerTreeHostInProcess::DoUpdateLayers", | 675 TRACE_EVENT1("cc", "LayerTreeHostInProcess::DoUpdateLayers", |
676 "source_frame_number", SourceFrameNumber()); | 676 "source_frame_number", SourceFrameNumber()); |
677 | 677 |
678 UpdateHudLayer(debug_state_.ShowHudInfo()); | 678 UpdateHudLayer(debug_state_.ShowHudInfo()); |
679 | 679 |
680 Layer* root_scroll = | 680 Layer* root_scroll = |
681 PropertyTreeBuilder::FindFirstScrollableLayer(root_layer); | 681 PropertyTreeBuilder::FindFirstScrollableLayer(root_layer); |
682 Layer* page_scale_layer = page_scale_layer_.get(); | 682 Layer* page_scale_layer = viewport_layers_.page_scale.get(); |
683 if (!page_scale_layer && root_scroll) | 683 if (!page_scale_layer && root_scroll) |
684 page_scale_layer = root_scroll->parent(); | 684 page_scale_layer = root_scroll->parent(); |
685 | 685 |
686 if (hud_layer_) { | 686 if (hud_layer_) { |
687 hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size_, | 687 hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size_, |
688 device_scale_factor_); | 688 device_scale_factor_); |
689 // The HUD layer is managed outside the layer list sent to LayerTreeHost | 689 // The HUD layer is managed outside the layer list sent to LayerTreeHost |
690 // and needs to have its property tree state set. | 690 // and needs to have its property tree state set. |
691 if (settings_.use_layer_lists && root_layer_.get()) { | 691 if (settings_.use_layer_lists && root_layer_.get()) { |
692 hud_layer_->SetTransformTreeIndex(root_layer_->transform_tree_index()); | 692 hud_layer_->SetTransformTreeIndex(root_layer_->transform_tree_index()); |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
755 if (info->inner_viewport_scroll.layer_id != Layer::INVALID_ID) | 755 if (info->inner_viewport_scroll.layer_id != Layer::INVALID_ID) |
756 inner_viewport_scroll_delta = info->inner_viewport_scroll.scroll_delta; | 756 inner_viewport_scroll_delta = info->inner_viewport_scroll.scroll_delta; |
757 | 757 |
758 if (inner_viewport_scroll_delta.IsZero() && info->page_scale_delta == 1.f && | 758 if (inner_viewport_scroll_delta.IsZero() && info->page_scale_delta == 1.f && |
759 info->elastic_overscroll_delta.IsZero() && !info->top_controls_delta) | 759 info->elastic_overscroll_delta.IsZero() && !info->top_controls_delta) |
760 return; | 760 return; |
761 | 761 |
762 // Preemptively apply the scroll offset and scale delta here before sending | 762 // Preemptively apply the scroll offset and scale delta here before sending |
763 // it to the client. If the client comes back and sets it to the same | 763 // it to the client. If the client comes back and sets it to the same |
764 // value, then the layer can early out without needing a full commit. | 764 // value, then the layer can early out without needing a full commit. |
765 if (inner_viewport_scroll_layer_) { | 765 if (viewport_layers_.inner_viewport_scroll) { |
766 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | 766 viewport_layers_.inner_viewport_scroll->SetScrollOffsetFromImplSide( |
767 gfx::ScrollOffsetWithDelta( | 767 gfx::ScrollOffsetWithDelta( |
768 inner_viewport_scroll_layer_->scroll_offset(), | 768 viewport_layers_.inner_viewport_scroll->scroll_offset(), |
769 inner_viewport_scroll_delta)); | 769 inner_viewport_scroll_delta)); |
770 } | 770 } |
771 | 771 |
772 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); | 772 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); |
773 SetElasticOverscrollFromImplSide(elastic_overscroll_ + | 773 SetElasticOverscrollFromImplSide(elastic_overscroll_ + |
774 info->elastic_overscroll_delta); | 774 info->elastic_overscroll_delta); |
775 // TODO(ccameron): pass the elastic overscroll here so that input events | 775 // TODO(ccameron): pass the elastic overscroll here so that input events |
776 // may be translated appropriately. | 776 // may be translated appropriately. |
777 client_->ApplyViewportDeltas(inner_viewport_scroll_delta, gfx::Vector2dF(), | 777 client_->ApplyViewportDeltas(inner_viewport_scroll_delta, gfx::Vector2dF(), |
778 info->elastic_overscroll_delta, | 778 info->elastic_overscroll_delta, |
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
895 if (hud_layer_.get()) | 895 if (hud_layer_.get()) |
896 hud_layer_->RemoveFromParent(); | 896 hud_layer_->RemoveFromParent(); |
897 | 897 |
898 // Reset gpu rasterization tracking. | 898 // Reset gpu rasterization tracking. |
899 // This flag is sticky until a new tree comes along. | 899 // This flag is sticky until a new tree comes along. |
900 ResetGpuRasterizationTracking(); | 900 ResetGpuRasterizationTracking(); |
901 | 901 |
902 SetNeedsFullTreeSync(); | 902 SetNeedsFullTreeSync(); |
903 } | 903 } |
904 | 904 |
905 void LayerTreeHost::RegisterViewportLayers( | 905 LayerTreeHost::ViewportLayers::ViewportLayers() {} |
906 scoped_refptr<Layer> overscroll_elasticity_layer, | 906 |
907 scoped_refptr<Layer> page_scale_layer, | 907 LayerTreeHost::ViewportLayers::~ViewportLayers() {} |
908 scoped_refptr<Layer> inner_viewport_container_layer, | 908 |
909 scoped_refptr<Layer> outer_viewport_container_layer, | 909 void LayerTreeHost::RegisterViewportLayers(const ViewportLayers& layers) { |
910 scoped_refptr<Layer> inner_viewport_scroll_layer, | 910 DCHECK(!layers.inner_viewport_scroll || |
911 scoped_refptr<Layer> outer_viewport_scroll_layer) { | 911 layers.inner_viewport_scroll != layers.outer_viewport_scroll); |
912 DCHECK(!inner_viewport_scroll_layer || | 912 viewport_layers_.overscroll_elasticity = layers.overscroll_elasticity; |
913 inner_viewport_scroll_layer != outer_viewport_scroll_layer); | 913 viewport_layers_.page_scale = layers.page_scale; |
914 overscroll_elasticity_layer_ = overscroll_elasticity_layer; | 914 viewport_layers_.inner_viewport_container = layers.inner_viewport_container; |
915 page_scale_layer_ = page_scale_layer; | 915 viewport_layers_.outer_viewport_container = layers.outer_viewport_container; |
916 inner_viewport_container_layer_ = inner_viewport_container_layer; | 916 viewport_layers_.inner_viewport_scroll = layers.inner_viewport_scroll; |
917 outer_viewport_container_layer_ = outer_viewport_container_layer; | 917 viewport_layers_.outer_viewport_scroll = layers.outer_viewport_scroll; |
918 inner_viewport_scroll_layer_ = inner_viewport_scroll_layer; | |
919 outer_viewport_scroll_layer_ = outer_viewport_scroll_layer; | |
920 } | 918 } |
921 | 919 |
922 void LayerTreeHost::RegisterSelection(const LayerSelection& selection) { | 920 void LayerTreeHost::RegisterSelection(const LayerSelection& selection) { |
923 if (selection_ == selection) | 921 if (selection_ == selection) |
924 return; | 922 return; |
925 | 923 |
926 selection_ = selection; | 924 selection_ = selection; |
927 SetNeedsCommit(); | 925 SetNeedsCommit(); |
928 } | 926 } |
929 | 927 |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1165 tree_impl->set_event_listener_properties( | 1163 tree_impl->set_event_listener_properties( |
1166 EventListenerClass::kTouchStartOrMove, | 1164 EventListenerClass::kTouchStartOrMove, |
1167 event_listener_properties(EventListenerClass::kTouchStartOrMove)); | 1165 event_listener_properties(EventListenerClass::kTouchStartOrMove)); |
1168 tree_impl->set_event_listener_properties( | 1166 tree_impl->set_event_listener_properties( |
1169 EventListenerClass::kMouseWheel, | 1167 EventListenerClass::kMouseWheel, |
1170 event_listener_properties(EventListenerClass::kMouseWheel)); | 1168 event_listener_properties(EventListenerClass::kMouseWheel)); |
1171 tree_impl->set_event_listener_properties( | 1169 tree_impl->set_event_listener_properties( |
1172 EventListenerClass::kTouchEndOrCancel, | 1170 EventListenerClass::kTouchEndOrCancel, |
1173 event_listener_properties(EventListenerClass::kTouchEndOrCancel)); | 1171 event_listener_properties(EventListenerClass::kTouchEndOrCancel)); |
1174 | 1172 |
1175 if (page_scale_layer_ && inner_viewport_scroll_layer_) { | 1173 if (viewport_layers_.page_scale && viewport_layers_.inner_viewport_scroll) { |
1176 LayerTreeImpl::ViewportLayerIds ids; | 1174 LayerTreeImpl::ViewportLayerIds ids; |
1177 if (overscroll_elasticity_layer_) | 1175 if (viewport_layers_.overscroll_elasticity) |
1178 ids.overscroll_elasticity = overscroll_elasticity_layer_->id(); | 1176 ids.overscroll_elasticity = viewport_layers_.overscroll_elasticity->id(); |
1179 ids.page_scale = page_scale_layer_->id(); | 1177 ids.page_scale = viewport_layers_.page_scale->id(); |
1180 if (inner_viewport_container_layer_) | 1178 if (viewport_layers_.inner_viewport_container) |
1181 ids.inner_viewport_container = inner_viewport_container_layer_->id(); | 1179 ids.inner_viewport_container = |
1182 if (outer_viewport_container_layer_) | 1180 viewport_layers_.inner_viewport_container->id(); |
1183 ids.outer_viewport_container = outer_viewport_container_layer_->id(); | 1181 if (viewport_layers_.outer_viewport_container) |
1184 ids.inner_viewport_scroll = inner_viewport_scroll_layer_->id(); | 1182 ids.outer_viewport_container = |
1185 if (outer_viewport_scroll_layer_) | 1183 viewport_layers_.outer_viewport_container->id(); |
1186 ids.outer_viewport_scroll = outer_viewport_scroll_layer_->id(); | 1184 ids.inner_viewport_scroll = viewport_layers_.inner_viewport_scroll->id(); |
| 1185 if (viewport_layers_.outer_viewport_scroll) |
| 1186 ids.outer_viewport_scroll = viewport_layers_.outer_viewport_scroll->id(); |
1187 tree_impl->SetViewportLayersFromIds(ids); | 1187 tree_impl->SetViewportLayersFromIds(ids); |
1188 DCHECK(inner_viewport_scroll_layer_->IsContainerForFixedPositionLayers()); | 1188 DCHECK(viewport_layers_.inner_viewport_scroll |
| 1189 ->IsContainerForFixedPositionLayers()); |
1189 } else { | 1190 } else { |
1190 tree_impl->ClearViewportLayers(); | 1191 tree_impl->ClearViewportLayers(); |
1191 } | 1192 } |
1192 | 1193 |
1193 tree_impl->RegisterSelection(selection_); | 1194 tree_impl->RegisterSelection(selection_); |
1194 | 1195 |
1195 tree_impl->PushPageScaleFromMainThread( | 1196 tree_impl->PushPageScaleFromMainThread( |
1196 page_scale_factor_, min_page_scale_factor_, max_page_scale_factor_); | 1197 page_scale_factor_, min_page_scale_factor_, max_page_scale_factor_); |
1197 | 1198 |
1198 tree_impl->set_browser_controls_shrink_blink_size( | 1199 tree_impl->set_browser_controls_shrink_blink_size( |
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1484 void LayerTreeHost::SetNeedsDisplayOnAllLayers() { | 1485 void LayerTreeHost::SetNeedsDisplayOnAllLayers() { |
1485 for (auto* layer : *this) | 1486 for (auto* layer : *this) |
1486 layer->SetNeedsDisplay(); | 1487 layer->SetNeedsDisplay(); |
1487 } | 1488 } |
1488 | 1489 |
1489 void LayerTreeHost::SetHasCopyRequest(bool has_copy_request) { | 1490 void LayerTreeHost::SetHasCopyRequest(bool has_copy_request) { |
1490 has_copy_request_ = has_copy_request; | 1491 has_copy_request_ = has_copy_request; |
1491 } | 1492 } |
1492 | 1493 |
1493 } // namespace cc | 1494 } // namespace cc |
OLD | NEW |