| 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 |