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

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

Issue 2144303002: Made layout viewport scroll updates from compositor work like ordinary layers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@rootScrollerOnCompositor
Patch Set: Created 4 years, 5 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
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_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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698