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

Side by Side Diff: cc/blimp/compositor_state_deserializer.cc

Issue 2445093002: cc/blimp: Add synchronization for scroll/scale state. (Closed)
Patch Set: move application of deltas to push time. Created 4 years, 1 month 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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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/blimp/compositor_state_deserializer.h" 5 #include "cc/blimp/compositor_state_deserializer.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "cc/blimp/client_picture_cache.h" 9 #include "cc/blimp/client_picture_cache.h"
10 #include "cc/blimp/compositor_state_deserializer_client.h"
11 #include "cc/blimp/deserialized_content_layer_client.h" 10 #include "cc/blimp/deserialized_content_layer_client.h"
12 #include "cc/blimp/layer_factory.h" 11 #include "cc/blimp/layer_factory.h"
13 #include "cc/blimp/picture_data_conversions.h" 12 #include "cc/blimp/picture_data_conversions.h"
14 #include "cc/input/layer_selection_bound.h" 13 #include "cc/input/layer_selection_bound.h"
15 #include "cc/layers/layer.h" 14 #include "cc/layers/layer.h"
16 #include "cc/layers/picture_layer.h" 15 #include "cc/layers/picture_layer.h"
17 #include "cc/layers/solid_color_scrollbar_layer.h" 16 #include "cc/layers/solid_color_scrollbar_layer.h"
18 #include "cc/proto/cc_conversions.h" 17 #include "cc/proto/cc_conversions.h"
18 #include "cc/proto/client_state_update.pb.h"
19 #include "cc/proto/gfx_conversions.h" 19 #include "cc/proto/gfx_conversions.h"
20 #include "cc/proto/layer_tree_host.pb.h" 20 #include "cc/proto/layer_tree_host.pb.h"
21 #include "cc/proto/skia_conversions.h" 21 #include "cc/proto/skia_conversions.h"
22 #include "cc/trees/layer_tree_host.h" 22 #include "cc/trees/layer_tree_host_common.h"
23 #include "cc/trees/layer_tree_host_in_process.h"
23 24
24 namespace cc { 25 namespace cc {
25 namespace { 26 namespace {
26 27
27 class DefaultLayerFactory : public LayerFactory { 28 class DefaultLayerFactory : public LayerFactory {
28 public: 29 public:
29 DefaultLayerFactory() = default; 30 DefaultLayerFactory() = default;
30 ~DefaultLayerFactory() override = default; 31 ~DefaultLayerFactory() override = default;
31 32
32 // LayerFactory implementation. 33 // LayerFactory implementation.
(...skipping 23 matching lines...) Expand all
56 CompositorStateDeserializer::LayerData::LayerData() = default; 57 CompositorStateDeserializer::LayerData::LayerData() = default;
57 58
58 CompositorStateDeserializer::LayerData::~LayerData() = default; 59 CompositorStateDeserializer::LayerData::~LayerData() = default;
59 60
60 CompositorStateDeserializer::LayerData::LayerData(LayerData&& other) = default; 61 CompositorStateDeserializer::LayerData::LayerData(LayerData&& other) = default;
61 62
62 CompositorStateDeserializer::LayerData& CompositorStateDeserializer::LayerData:: 63 CompositorStateDeserializer::LayerData& CompositorStateDeserializer::LayerData::
63 operator=(LayerData&& other) = default; 64 operator=(LayerData&& other) = default;
64 65
65 CompositorStateDeserializer::CompositorStateDeserializer( 66 CompositorStateDeserializer::CompositorStateDeserializer(
66 LayerTreeHost* layer_tree_host, 67 LayerTreeHostInProcess* layer_tree_host,
67 std::unique_ptr<ClientPictureCache> client_picture_cache, 68 std::unique_ptr<ClientPictureCache> client_picture_cache,
68 const ScrollCallback& scroll_callback,
69 CompositorStateDeserializerClient* client) 69 CompositorStateDeserializerClient* client)
70 : layer_factory_(base::MakeUnique<DefaultLayerFactory>()), 70 : layer_factory_(base::MakeUnique<DefaultLayerFactory>()),
71 layer_tree_host_(layer_tree_host), 71 layer_tree_host_(layer_tree_host),
72 client_picture_cache_(std::move(client_picture_cache)), 72 client_picture_cache_(std::move(client_picture_cache)),
73 scroll_callback_(scroll_callback), 73 client_(client),
74 client_(client) { 74 weak_factory_(this) {
75 DCHECK(layer_tree_host_); 75 DCHECK(layer_tree_host_);
76 DCHECK(client_); 76 DCHECK(client_);
77 } 77 }
78 78
79 CompositorStateDeserializer::~CompositorStateDeserializer() = default; 79 CompositorStateDeserializer::~CompositorStateDeserializer() = default;
80 80
81 Layer* CompositorStateDeserializer::GetLayerForEngineId( 81 Layer* CompositorStateDeserializer::GetLayerForEngineId(
82 int engine_layer_id) const { 82 int engine_layer_id) const {
83 EngineIdToLayerMap::const_iterator layer_it = 83 EngineIdToLayerMap::const_iterator layer_it =
84 engine_id_to_layer_.find(engine_layer_id); 84 engine_id_to_layer_.find(engine_layer_id);
(...skipping 20 matching lines...) Expand all
105 105
106 // The deserialization is finished, so now clear the cache. 106 // The deserialization is finished, so now clear the cache.
107 client_picture_cache_->Flush(); 107 client_picture_cache_->Flush();
108 } 108 }
109 109
110 void CompositorStateDeserializer::SetLayerFactoryForTesting( 110 void CompositorStateDeserializer::SetLayerFactoryForTesting(
111 std::unique_ptr<LayerFactory> layer_factory) { 111 std::unique_ptr<LayerFactory> layer_factory) {
112 layer_factory_ = std::move(layer_factory); 112 layer_factory_ = std::move(layer_factory);
113 } 113 }
114 114
115 void CompositorStateDeserializer::ApplyViewportDeltas(
116 const gfx::Vector2dF& inner_delta,
117 const gfx::Vector2dF& outer_delta,
118 const gfx::Vector2dF& elastic_overscroll_delta,
119 float page_scale,
120 float top_controls_delta) {
121 DCHECK_EQ(top_controls_delta, 0.0f);
122 DCHECK(elastic_overscroll_delta == gfx::Vector2dF());
123 DCHECK(outer_delta == gfx::Vector2dF());
124
125 // The inner_delta can be ignored here, since we receive that in the scroll
126 // callback on the layer itself.
127 if (page_scale != 1.0f) {
128 LayerTree* layer_tree = layer_tree_host_->GetLayerTree();
129 synced_page_scale_.UpdateDeltaFromImplThread(
130 layer_tree->page_scale_factor());
131 layer_tree->SetPageScaleFactorAndLimits(
132 synced_page_scale_.EngineMain(), layer_tree->min_page_scale_factor(),
133 layer_tree->max_page_scale_factor());
134 client_->DidUpdateLocalState();
135 }
136 }
137
138 void CompositorStateDeserializer::PullClientStateUpdate(
139 proto::ClientStateUpdate* client_state_update) {
140 for (auto& layer_it : engine_id_to_layer_) {
141 int engine_layer_id = layer_it.first;
142 auto& synced_scroll_offset = layer_it.second.synced_scroll_offset;
143 gfx::ScrollOffset scroll_offset_delta =
144 synced_scroll_offset.PullDeltaForEngineUpdate();
145 gfx::Vector2d scroll_delta_vector(scroll_offset_delta.x(),
aelias_OOO_until_Jul13 2016/10/28 03:40:20 gfx::Vector2dF
Khushal 2016/10/31 21:02:01 Done.
146 scroll_offset_delta.y());
147
148 if (scroll_delta_vector.IsZero()) {
149 continue;
150 }
151
152 proto::ScrollUpdate* scroll_update =
153 client_state_update->add_scroll_updates();
154 scroll_update->set_layer_id(engine_layer_id);
155 Vector2dToProto(scroll_delta_vector, scroll_update->mutable_scroll_delta());
156 }
157
158 float page_scale_delta = synced_page_scale_.PullDeltaForEngineUpdate();
159 if (page_scale_delta != 1.0f) {
160 client_state_update->set_page_scale_delta(page_scale_delta);
161 }
162 }
163
164 void CompositorStateDeserializer::DidApplyStateUpdatesOnEngine() {
165 for (auto& layer_it : engine_id_to_layer_) {
166 Layer* layer = layer_it.second.layer.get();
167 auto& synced_scroll_offset = layer_it.second.synced_scroll_offset;
168
169 synced_scroll_offset.DidApplySentDeltaOnEngine();
170 layer->SetScrollOffset(synced_scroll_offset.EngineMain());
171 }
172
173 synced_page_scale_.DidApplySentDeltaOnEngine();
174 LayerTree* layer_tree = layer_tree_host_->GetLayerTree();
175 layer_tree->SetPageScaleFactorAndLimits(synced_page_scale_.EngineMain(),
176 layer_tree->min_page_scale_factor(),
177 layer_tree->max_page_scale_factor());
178 }
179
180 void CompositorStateDeserializer::SendUnappliedDeltasToLayerTreeHost() {
181 std::unique_ptr<ReflectedMainFrameState> reflected_main_frame_state =
182 base::MakeUnique<ReflectedMainFrameState>();
183
184 for (auto& layer_it : engine_id_to_layer_) {
185 Layer* layer = layer_it.second.layer.get();
186 auto& synced_scroll_offset = layer_it.second.synced_scroll_offset;
187
188 gfx::ScrollOffset scroll_offset_delta =
189 synced_scroll_offset.DeltaNotAppliedOnEngine();
190 gfx::Vector2d scroll_delta_vector(scroll_offset_delta.x(),
aelias_OOO_until_Jul13 2016/10/28 03:40:19 gfx::Vector2dF
Khushal 2016/10/31 21:02:01 Done.
191 scroll_offset_delta.y());
192 if (scroll_delta_vector.IsZero())
193 continue;
194
195 LayerTreeHostCommon::ScrollUpdateInfo scroll_update;
196 scroll_update.layer_id = layer->id();
197 scroll_update.scroll_delta = scroll_delta_vector;
198 reflected_main_frame_state->scrolls.push_back(scroll_update);
199 }
200
201 reflected_main_frame_state->page_scale_delta =
202 synced_page_scale_.DeltaNotAppliedOnEngine();
203 layer_tree_host_->SetReflectedMainFrameState(
204 std::move(reflected_main_frame_state));
205 }
206
115 void CompositorStateDeserializer::SychronizeLayerTreeState( 207 void CompositorStateDeserializer::SychronizeLayerTreeState(
116 const proto::LayerTree& layer_tree_proto) { 208 const proto::LayerTree& layer_tree_proto) {
117 LayerTree* layer_tree = layer_tree_host_->GetLayerTree(); 209 LayerTree* layer_tree = layer_tree_host_->GetLayerTree();
118 210
119 // Synchronize the tree hierarchy first. 211 // Synchronize the tree hierarchy first.
120 // TODO(khushalsagar): Don't do this if the hierarchy didn't change. See 212 // TODO(khushalsagar): Don't do this if the hierarchy didn't change. See
121 // crbug.com/605170. 213 // crbug.com/605170.
122 EngineIdToLayerMap new_engine_id_to_layer; 214 EngineIdToLayerMap new_engine_id_to_layer;
123 ScrollbarLayerToScrollLayerId scrollbar_layer_to_scroll_layer; 215 ScrollbarLayerToScrollLayerId scrollbar_layer_to_scroll_layer;
124 if (layer_tree_proto.has_root_layer()) { 216 if (layer_tree_proto.has_root_layer()) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 GetLayer(layer_tree_proto.inner_viewport_scroll_layer_id()), 249 GetLayer(layer_tree_proto.inner_viewport_scroll_layer_id()),
158 GetLayer(layer_tree_proto.outer_viewport_scroll_layer_id())); 250 GetLayer(layer_tree_proto.outer_viewport_scroll_layer_id()));
159 251
160 layer_tree->SetDeviceScaleFactor(layer_tree_proto.device_scale_factor()); 252 layer_tree->SetDeviceScaleFactor(layer_tree_proto.device_scale_factor());
161 layer_tree->SetPaintedDeviceScaleFactor( 253 layer_tree->SetPaintedDeviceScaleFactor(
162 layer_tree_proto.painted_device_scale_factor()); 254 layer_tree_proto.painted_device_scale_factor());
163 255
164 float min_page_scale_factor = layer_tree_proto.min_page_scale_factor(); 256 float min_page_scale_factor = layer_tree_proto.min_page_scale_factor();
165 float max_page_scale_factor = layer_tree_proto.max_page_scale_factor(); 257 float max_page_scale_factor = layer_tree_proto.max_page_scale_factor();
166 float page_scale_factor = layer_tree_proto.page_scale_factor(); 258 float page_scale_factor = layer_tree_proto.page_scale_factor();
167 if (client_->ShouldRetainClientPageScale(page_scale_factor)) 259 synced_page_scale_.PushFromEngineMainThread(page_scale_factor);
168 page_scale_factor = layer_tree->page_scale_factor(); 260 layer_tree->SetPageScaleFactorAndLimits(synced_page_scale_.EngineMain(),
169 layer_tree->SetPageScaleFactorAndLimits( 261 min_page_scale_factor,
170 page_scale_factor, min_page_scale_factor, max_page_scale_factor); 262 max_page_scale_factor);
171 263
172 layer_tree->set_background_color(layer_tree_proto.background_color()); 264 layer_tree->set_background_color(layer_tree_proto.background_color());
173 layer_tree->set_has_transparent_background( 265 layer_tree->set_has_transparent_background(
174 layer_tree_proto.has_transparent_background()); 266 layer_tree_proto.has_transparent_background());
175 267
176 LayerSelection selection; 268 LayerSelection selection;
177 LayerSelectionFromProtobuf(&selection, layer_tree_proto.selection()); 269 LayerSelectionFromProtobuf(&selection, layer_tree_proto.selection());
178 layer_tree->RegisterSelection(selection); 270 layer_tree->RegisterSelection(selection);
179 layer_tree->SetViewportSize( 271 layer_tree->SetViewportSize(
180 ProtoToSize(layer_tree_proto.device_viewport_size())); 272 ProtoToSize(layer_tree_proto.device_viewport_size()));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 layer->SetPosition(ProtoToPointF(base.position())); 304 layer->SetPosition(ProtoToPointF(base.position()));
213 layer->SetTransform(ProtoToTransform(base.transform())); 305 layer->SetTransform(ProtoToTransform(base.transform()));
214 layer->SetTransformOrigin(ProtoToPoint3F(base.transform_origin())); 306 layer->SetTransformOrigin(ProtoToPoint3F(base.transform_origin()));
215 layer->SetIsDrawable(base.is_drawable()); 307 layer->SetIsDrawable(base.is_drawable());
216 layer->SetDoubleSided(base.double_sided()); 308 layer->SetDoubleSided(base.double_sided());
217 layer->SetShouldFlattenTransform(base.should_flatten_transform()); 309 layer->SetShouldFlattenTransform(base.should_flatten_transform());
218 layer->Set3dSortingContextId(base.sorting_context_id()); 310 layer->Set3dSortingContextId(base.sorting_context_id());
219 layer->SetUseParentBackfaceVisibility(base.use_parent_backface_visibility()); 311 layer->SetUseParentBackfaceVisibility(base.use_parent_backface_visibility());
220 layer->SetBackgroundColor(base.background_color()); 312 layer->SetBackgroundColor(base.background_color());
221 313
222 gfx::ScrollOffset scroll_offset = ProtoToScrollOffset(base.scroll_offset()); 314 gfx::ScrollOffset engine_scroll_offset =
223 if (client_->ShouldRetainClientScroll(engine_layer_id, scroll_offset)) 315 ProtoToScrollOffset(base.scroll_offset());
224 scroll_offset = layer->scroll_offset(); 316 SyncedRemoteScrollOffset& synced_scroll_offset =
225 layer->SetScrollOffset(scroll_offset); 317 GetLayerData(engine_layer_id)->synced_scroll_offset;
318 synced_scroll_offset.PushFromEngineMainThread(engine_scroll_offset);
319 layer->SetScrollOffset(synced_scroll_offset.EngineMain());
226 320
227 layer->SetScrollClipLayerId( 321 layer->SetScrollClipLayerId(
228 GetClientIdFromEngineId(base.scroll_clip_layer_id())); 322 GetClientIdFromEngineId(base.scroll_clip_layer_id()));
229 layer->SetUserScrollable(base.user_scrollable_horizontal(), 323 layer->SetUserScrollable(base.user_scrollable_horizontal(),
230 base.user_scrollable_vertical()); 324 base.user_scrollable_vertical());
231 325
232 if (layer->main_thread_scrolling_reasons()) { 326 if (layer->main_thread_scrolling_reasons()) {
233 layer->ClearMainThreadScrollingReasons( 327 layer->ClearMainThreadScrollingReasons(
234 layer->main_thread_scrolling_reasons()); 328 layer->main_thread_scrolling_reasons());
235 } 329 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
318 mask_layer_node, new_layer_map, scrollbar_layer_to_scroll_layer); 412 mask_layer_node, new_layer_map, scrollbar_layer_to_scroll_layer);
319 layer->SetMaskLayer(mask_layer.get()); 413 layer->SetMaskLayer(mask_layer.get());
320 SynchronizeLayerHierarchyRecursive(mask_layer.get(), mask_layer_node, 414 SynchronizeLayerHierarchyRecursive(mask_layer.get(), mask_layer_node,
321 new_layer_map, 415 new_layer_map,
322 scrollbar_layer_to_scroll_layer); 416 scrollbar_layer_to_scroll_layer);
323 } else { 417 } else {
324 layer->SetMaskLayer(nullptr); 418 layer->SetMaskLayer(nullptr);
325 } 419 }
326 420
327 // Scroll callback. 421 // Scroll callback.
328 layer->set_did_scroll_callback(base::Bind(scroll_callback_, layer_node.id())); 422 layer->set_did_scroll_callback(
423 base::Bind(&CompositorStateDeserializer::LayerScrolled,
424 weak_factory_.GetWeakPtr(), layer_node.id()));
329 } 425 }
330 426
331 scoped_refptr<Layer> CompositorStateDeserializer::GetLayerAndAddToNewMap( 427 scoped_refptr<Layer> CompositorStateDeserializer::GetLayerAndAddToNewMap(
332 const proto::LayerNode& layer_node, 428 const proto::LayerNode& layer_node,
333 EngineIdToLayerMap* new_layer_map, 429 EngineIdToLayerMap* new_layer_map,
334 ScrollbarLayerToScrollLayerId* scrollbar_layer_to_scroll_layer) { 430 ScrollbarLayerToScrollLayerId* scrollbar_layer_to_scroll_layer) {
335 DCHECK(new_layer_map->find(layer_node.id()) == new_layer_map->end()) 431 DCHECK(new_layer_map->find(layer_node.id()) == new_layer_map->end())
336 << "A LayerNode should have been de-serialized only once"; 432 << "A LayerNode should have been de-serialized only once";
337 433
338 scoped_refptr<Layer> layer; 434 scoped_refptr<Layer> layer;
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
387 } break; 483 } break;
388 case proto::LayerNode::HEADS_UP_DISPLAY_LAYER: 484 case proto::LayerNode::HEADS_UP_DISPLAY_LAYER:
389 // TODO(khushalsagar): Remove this from proto. 485 // TODO(khushalsagar): Remove this from proto.
390 NOTREACHED(); 486 NOTREACHED();
391 } 487 }
392 488
393 layer = layer_data.layer; 489 layer = layer_data.layer;
394 return layer; 490 return layer;
395 } 491 }
396 492
493 void CompositorStateDeserializer::LayerScrolled(int engine_layer_id) {
494 LayerData* layer_data = GetLayerData(engine_layer_id);
495 Layer* layer = layer_data->layer.get();
496 SyncedRemoteScrollOffset& synced_scroll_offset =
497 layer_data->synced_scroll_offset;
498 synced_scroll_offset.UpdateDeltaFromImplThread(layer->scroll_offset());
499 layer->SetScrollOffset(synced_scroll_offset.EngineMain());
500 client_->DidUpdateLocalState();
501 }
502
397 int CompositorStateDeserializer::GetClientIdFromEngineId( 503 int CompositorStateDeserializer::GetClientIdFromEngineId(
398 int engine_layer_id) const { 504 int engine_layer_id) const {
399 Layer* layer = GetLayerForEngineId(engine_layer_id); 505 Layer* layer = GetLayerForEngineId(engine_layer_id);
400 return layer ? layer->id() : Layer::LayerIdLabels::INVALID_ID; 506 return layer ? layer->id() : Layer::LayerIdLabels::INVALID_ID;
401 } 507 }
402 508
403 scoped_refptr<Layer> CompositorStateDeserializer::GetLayer( 509 scoped_refptr<Layer> CompositorStateDeserializer::GetLayer(
404 int engine_layer_id) const { 510 int engine_layer_id) const {
405 EngineIdToLayerMap::const_iterator layer_it = 511 EngineIdToLayerMap::const_iterator layer_it =
406 engine_id_to_layer_.find(engine_layer_id); 512 engine_id_to_layer_.find(engine_layer_id);
407 return layer_it != engine_id_to_layer_.end() ? layer_it->second.layer 513 return layer_it != engine_id_to_layer_.end() ? layer_it->second.layer
408 : nullptr; 514 : nullptr;
409 } 515 }
410 516
411 DeserializedContentLayerClient* 517 DeserializedContentLayerClient*
412 CompositorStateDeserializer::GetContentLayerClient(int engine_layer_id) const { 518 CompositorStateDeserializer::GetContentLayerClient(int engine_layer_id) const {
413 EngineIdToLayerMap::const_iterator layer_it = 519 EngineIdToLayerMap::const_iterator layer_it =
414 engine_id_to_layer_.find(engine_layer_id); 520 engine_id_to_layer_.find(engine_layer_id);
415 return layer_it != engine_id_to_layer_.end() 521 return layer_it != engine_id_to_layer_.end()
416 ? layer_it->second.content_layer_client.get() 522 ? layer_it->second.content_layer_client.get()
417 : nullptr; 523 : nullptr;
418 } 524 }
419 525
526 CompositorStateDeserializer::LayerData*
527 CompositorStateDeserializer::GetLayerData(int engine_layer_id) {
528 EngineIdToLayerMap::iterator layer_it =
529 engine_id_to_layer_.find(engine_layer_id);
530 return layer_it != engine_id_to_layer_.end() ? &layer_it->second : nullptr;
531 }
532
420 } // namespace cc 533 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698