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