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

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: Initialize ScrollUpdateInfo's layer id in constructor 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
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698