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 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1062 kNumFramesToConsiderBeforeGpuRasterization) { | 1062 kNumFramesToConsiderBeforeGpuRasterization) { |
1063 content_is_suitable_for_gpu_rasterization_ = true; | 1063 content_is_suitable_for_gpu_rasterization_ = true; |
1064 } | 1064 } |
1065 } else { | 1065 } else { |
1066 num_consecutive_frames_suitable_for_gpu_ = 0; | 1066 num_consecutive_frames_suitable_for_gpu_ = 0; |
1067 content_is_suitable_for_gpu_rasterization_ = false; | 1067 content_is_suitable_for_gpu_rasterization_ = false; |
1068 } | 1068 } |
1069 return did_paint_content; | 1069 return did_paint_content; |
1070 } | 1070 } |
1071 | 1071 |
| 1072 void LayerTreeHost::ApplyViewportDeltas(ScrollAndScaleSet* info) { |
| 1073 gfx::Vector2dF inner_viewport_scroll_delta; |
| 1074 if (info->inner_viewport_scroll.layer_id != Layer::INVALID_ID) |
| 1075 inner_viewport_scroll_delta = info->inner_viewport_scroll.scroll_delta; |
| 1076 |
| 1077 if (inner_viewport_scroll_delta.IsZero() && info->page_scale_delta == 1.f && |
| 1078 info->elastic_overscroll_delta.IsZero() && !info->top_controls_delta) |
| 1079 return; |
| 1080 |
| 1081 // Preemptively apply the scroll offset and scale delta here before sending |
| 1082 // it to the client. If the client comes back and sets it to the same |
| 1083 // value, then the layer can early out without needing a full commit. |
| 1084 if (inner_viewport_scroll_layer_.get()) { |
| 1085 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
| 1086 gfx::ScrollOffsetWithDelta( |
| 1087 inner_viewport_scroll_layer_->scroll_offset(), |
| 1088 inner_viewport_scroll_delta)); |
| 1089 } |
| 1090 |
| 1091 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); |
| 1092 elastic_overscroll_ += info->elastic_overscroll_delta; |
| 1093 // TODO(ccameron): pass the elastic overscroll here so that input events |
| 1094 // may be translated appropriately. |
| 1095 client_->ApplyViewportDeltas(inner_viewport_scroll_delta, gfx::Vector2dF(), |
| 1096 info->elastic_overscroll_delta, |
| 1097 info->page_scale_delta, |
| 1098 info->top_controls_delta); |
| 1099 SetNeedsUpdateLayers(); |
| 1100 } |
| 1101 |
1072 void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) { | 1102 void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) { |
1073 for (auto& swap_promise : info->swap_promises) { | 1103 for (auto& swap_promise : info->swap_promises) { |
1074 TRACE_EVENT_WITH_FLOW1("input,benchmark", | 1104 TRACE_EVENT_WITH_FLOW1("input,benchmark", |
1075 "LatencyInfo.Flow", | 1105 "LatencyInfo.Flow", |
1076 TRACE_ID_DONT_MANGLE(swap_promise->TraceId()), | 1106 TRACE_ID_DONT_MANGLE(swap_promise->TraceId()), |
1077 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, | 1107 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, |
1078 "step", "Main thread scroll update"); | 1108 "step", "Main thread scroll update"); |
1079 QueueSwapPromise(std::move(swap_promise)); | 1109 QueueSwapPromise(std::move(swap_promise)); |
1080 } | 1110 } |
1081 | 1111 |
1082 gfx::Vector2dF inner_viewport_scroll_delta; | |
1083 gfx::Vector2dF outer_viewport_scroll_delta; | |
1084 | |
1085 if (root_layer_.get()) { | 1112 if (root_layer_.get()) { |
1086 for (size_t i = 0; i < info->scrolls.size(); ++i) { | 1113 for (size_t i = 0; i < info->scrolls.size(); ++i) { |
1087 Layer* layer = LayerById(info->scrolls[i].layer_id); | 1114 Layer* layer = LayerById(info->scrolls[i].layer_id); |
1088 if (!layer) | 1115 if (!layer) |
1089 continue; | 1116 continue; |
1090 if (layer == outer_viewport_scroll_layer_.get()) { | 1117 layer->SetScrollOffsetFromImplSide(gfx::ScrollOffsetWithDelta( |
1091 outer_viewport_scroll_delta += info->scrolls[i].scroll_delta; | 1118 layer->scroll_offset(), info->scrolls[i].scroll_delta)); |
1092 } else if (layer == inner_viewport_scroll_layer_.get()) { | |
1093 inner_viewport_scroll_delta += info->scrolls[i].scroll_delta; | |
1094 } else { | |
1095 layer->SetScrollOffsetFromImplSide( | |
1096 gfx::ScrollOffsetWithDelta(layer->scroll_offset(), | |
1097 info->scrolls[i].scroll_delta)); | |
1098 } | |
1099 SetNeedsUpdateLayers(); | 1119 SetNeedsUpdateLayers(); |
1100 } | 1120 } |
1101 } | 1121 } |
1102 | 1122 |
1103 if (!inner_viewport_scroll_delta.IsZero() || | 1123 // This needs to happen after scroll deltas have been sent to prevent top |
1104 !outer_viewport_scroll_delta.IsZero() || info->page_scale_delta != 1.f || | 1124 // controls from clamping the layout viewport both on the compositor and |
1105 !info->elastic_overscroll_delta.IsZero() || info->top_controls_delta) { | 1125 // on the main thread. |
1106 // Preemptively apply the scroll offset and scale delta here before sending | 1126 ApplyViewportDeltas(info); |
1107 // it to the client. If the client comes back and sets it to the same | |
1108 // value, then the layer can early out without needing a full commit. | |
1109 if (inner_viewport_scroll_layer_.get()) { | |
1110 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | |
1111 gfx::ScrollOffsetWithDelta( | |
1112 inner_viewport_scroll_layer_->scroll_offset(), | |
1113 inner_viewport_scroll_delta)); | |
1114 } | |
1115 | |
1116 if (outer_viewport_scroll_layer_.get()) { | |
1117 outer_viewport_scroll_layer_->SetScrollOffsetFromImplSide( | |
1118 gfx::ScrollOffsetWithDelta( | |
1119 outer_viewport_scroll_layer_->scroll_offset(), | |
1120 outer_viewport_scroll_delta)); | |
1121 } | |
1122 | |
1123 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); | |
1124 elastic_overscroll_ += info->elastic_overscroll_delta; | |
1125 // TODO(ccameron): pass the elastic overscroll here so that input events | |
1126 // may be translated appropriately. | |
1127 client_->ApplyViewportDeltas( | |
1128 inner_viewport_scroll_delta, outer_viewport_scroll_delta, | |
1129 info->elastic_overscroll_delta, info->page_scale_delta, | |
1130 info->top_controls_delta); | |
1131 SetNeedsUpdateLayers(); | |
1132 } | |
1133 } | 1127 } |
1134 | 1128 |
1135 void LayerTreeHost::SetDeviceScaleFactor(float device_scale_factor) { | 1129 void LayerTreeHost::SetDeviceScaleFactor(float device_scale_factor) { |
1136 if (device_scale_factor == device_scale_factor_) | 1130 if (device_scale_factor == device_scale_factor_) |
1137 return; | 1131 return; |
1138 device_scale_factor_ = device_scale_factor; | 1132 device_scale_factor_ = device_scale_factor; |
1139 | 1133 |
1140 property_trees_.needs_rebuild = true; | 1134 property_trees_.needs_rebuild = true; |
1141 SetNeedsCommit(); | 1135 SetNeedsCommit(); |
1142 } | 1136 } |
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1698 int seq_num = property_trees_.sequence_number; | 1692 int seq_num = property_trees_.sequence_number; |
1699 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) { | 1693 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) { |
1700 layer->set_property_tree_sequence_number(seq_num); | 1694 layer->set_property_tree_sequence_number(seq_num); |
1701 }); | 1695 }); |
1702 | 1696 |
1703 surface_client_id_ = proto.surface_client_id(); | 1697 surface_client_id_ = proto.surface_client_id(); |
1704 next_surface_sequence_ = proto.next_surface_sequence(); | 1698 next_surface_sequence_ = proto.next_surface_sequence(); |
1705 } | 1699 } |
1706 | 1700 |
1707 } // namespace cc | 1701 } // namespace cc |
OLD | NEW |