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

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

Issue 2445093002: cc/blimp: Add synchronization for scroll/scale state. (Closed)
Patch Set: fix rebase upload 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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
65 CompositorStateDeserializer::LayerData::LayerData() = default; 66 CompositorStateDeserializer::LayerData::LayerData() = default;
66 67
67 CompositorStateDeserializer::LayerData::~LayerData() = default; 68 CompositorStateDeserializer::LayerData::~LayerData() = default;
68 69
69 CompositorStateDeserializer::LayerData::LayerData(LayerData&& other) = default; 70 CompositorStateDeserializer::LayerData::LayerData(LayerData&& other) = default;
70 71
71 CompositorStateDeserializer::LayerData& CompositorStateDeserializer::LayerData:: 72 CompositorStateDeserializer::LayerData& CompositorStateDeserializer::LayerData::
72 operator=(LayerData&& other) = default; 73 operator=(LayerData&& other) = default;
73 74
74 CompositorStateDeserializer::CompositorStateDeserializer( 75 CompositorStateDeserializer::CompositorStateDeserializer(
75 LayerTreeHost* layer_tree_host, 76 LayerTreeHostInProcess* layer_tree_host,
76 std::unique_ptr<ClientPictureCache> client_picture_cache, 77 std::unique_ptr<ClientPictureCache> client_picture_cache,
77 const ScrollCallback& scroll_callback,
78 CompositorStateDeserializerClient* client) 78 CompositorStateDeserializerClient* client)
79 : layer_factory_(base::MakeUnique<DefaultLayerFactory>()), 79 : layer_factory_(base::MakeUnique<DefaultLayerFactory>()),
80 layer_tree_host_(layer_tree_host), 80 layer_tree_host_(layer_tree_host),
81 client_picture_cache_(std::move(client_picture_cache)), 81 client_picture_cache_(std::move(client_picture_cache)),
82 scroll_callback_(scroll_callback), 82 client_(client),
83 client_(client) { 83 weak_factory_(this) {
84 DCHECK(layer_tree_host_); 84 DCHECK(layer_tree_host_);
85 DCHECK(client_); 85 DCHECK(client_);
86 } 86 }
87 87
88 CompositorStateDeserializer::~CompositorStateDeserializer() = default; 88 CompositorStateDeserializer::~CompositorStateDeserializer() = default;
89 89
90 Layer* CompositorStateDeserializer::GetLayerForEngineId( 90 Layer* CompositorStateDeserializer::GetLayerForEngineId(
91 int engine_layer_id) const { 91 int engine_layer_id) const {
92 EngineIdToLayerMap::const_iterator layer_it = 92 EngineIdToLayerMap::const_iterator layer_it =
93 engine_id_to_layer_.find(engine_layer_id); 93 engine_id_to_layer_.find(engine_layer_id);
(...skipping 20 matching lines...) Expand all
114 114
115 // The deserialization is finished, so now clear the cache. 115 // The deserialization is finished, so now clear the cache.
116 client_picture_cache_->Flush(); 116 client_picture_cache_->Flush();
117 } 117 }
118 118
119 void CompositorStateDeserializer::SetLayerFactoryForTesting( 119 void CompositorStateDeserializer::SetLayerFactoryForTesting(
120 std::unique_ptr<LayerFactory> layer_factory) { 120 std::unique_ptr<LayerFactory> layer_factory) {
121 layer_factory_ = std::move(layer_factory); 121 layer_factory_ = std::move(layer_factory);
122 } 122 }
123 123
124 void CompositorStateDeserializer::ApplyViewportDeltas(
125 const gfx::Vector2dF& inner_delta,
126 const gfx::Vector2dF& outer_delta,
127 const gfx::Vector2dF& elastic_overscroll_delta,
128 float page_scale,
129 float top_controls_delta) {
130 DCHECK_EQ(top_controls_delta, 0.0f);
131 DCHECK(elastic_overscroll_delta == gfx::Vector2dF());
132 DCHECK(outer_delta == gfx::Vector2dF());
133
134 // The inner_delta can be ignored here, since we receive that in the scroll
135 // callback on the layer itself.
136 if (page_scale != 1.0f) {
137 LayerTree* layer_tree = layer_tree_host_->GetLayerTree();
138 synced_page_scale_.UpdateDeltaFromImplThread(
139 layer_tree->page_scale_factor());
140 layer_tree->SetPageScaleFactorAndLimits(
141 synced_page_scale_.EngineMain(), layer_tree->min_page_scale_factor(),
142 layer_tree->max_page_scale_factor());
143 client_->DidUpdateLocalState();
144 }
145 }
146
147 void CompositorStateDeserializer::PullClientStateUpdate(
148 proto::ClientStateUpdate* client_state_update) {
149 for (auto& layer_it : engine_id_to_layer_) {
150 int engine_layer_id = layer_it.first;
151 auto& synced_scroll_offset = layer_it.second.synced_scroll_offset;
152 gfx::ScrollOffset scroll_offset_delta =
153 synced_scroll_offset.PullDeltaForEngineUpdate();
154 gfx::Vector2dF scroll_delta_vector =
155 gfx::ScrollOffsetToVector2dF(scroll_offset_delta);
156
157 if (scroll_delta_vector.IsZero()) {
158 continue;
159 }
160
161 proto::ScrollUpdate* scroll_update =
162 client_state_update->add_scroll_updates();
163 scroll_update->set_layer_id(engine_layer_id);
164 Vector2dFToProto(scroll_delta_vector,
165 scroll_update->mutable_scroll_delta());
166 }
167
168 float page_scale_delta = synced_page_scale_.PullDeltaForEngineUpdate();
169 if (page_scale_delta != 1.0f) {
170 client_state_update->set_page_scale_delta(page_scale_delta);
171 }
172 }
173
174 void CompositorStateDeserializer::DidApplyStateUpdatesOnEngine() {
175 for (auto& layer_it : engine_id_to_layer_) {
176 Layer* layer = layer_it.second.layer.get();
177 auto& synced_scroll_offset = layer_it.second.synced_scroll_offset;
178
179 synced_scroll_offset.DidApplySentDeltaOnEngine();
180 layer->SetScrollOffset(synced_scroll_offset.EngineMain());
181 }
182
183 synced_page_scale_.DidApplySentDeltaOnEngine();
184 LayerTree* layer_tree = layer_tree_host_->GetLayerTree();
185 layer_tree->SetPageScaleFactorAndLimits(synced_page_scale_.EngineMain(),
186 layer_tree->min_page_scale_factor(),
187 layer_tree->max_page_scale_factor());
188 }
189
190 void CompositorStateDeserializer::SendUnappliedDeltasToLayerTreeHost() {
191 std::unique_ptr<ReflectedMainFrameState> reflected_main_frame_state =
192 base::MakeUnique<ReflectedMainFrameState>();
193
194 for (auto& layer_it : engine_id_to_layer_) {
195 Layer* layer = layer_it.second.layer.get();
196 auto& synced_scroll_offset = layer_it.second.synced_scroll_offset;
197
198 gfx::ScrollOffset scroll_offset_delta =
199 synced_scroll_offset.DeltaNotAppliedOnEngine();
200 gfx::Vector2dF scroll_delta_vector =
201 gfx::ScrollOffsetToVector2dF(scroll_offset_delta);
202 if (scroll_delta_vector.IsZero())
203 continue;
204
205 ReflectedMainFrameState::ScrollUpdate scroll_update;
206 scroll_update.layer_id = layer->id();
207 scroll_update.scroll_delta = scroll_delta_vector;
208 reflected_main_frame_state->scrolls.push_back(scroll_update);
209 }
210
211 reflected_main_frame_state->page_scale_delta =
212 synced_page_scale_.DeltaNotAppliedOnEngine();
213 layer_tree_host_->SetReflectedMainFrameState(
214 std::move(reflected_main_frame_state));
215 }
216
124 void CompositorStateDeserializer::SychronizeLayerTreeState( 217 void CompositorStateDeserializer::SychronizeLayerTreeState(
125 const proto::LayerTree& layer_tree_proto) { 218 const proto::LayerTree& layer_tree_proto) {
126 LayerTree* layer_tree = layer_tree_host_->GetLayerTree(); 219 LayerTree* layer_tree = layer_tree_host_->GetLayerTree();
127 220
128 // Synchronize the tree hierarchy first. 221 // Synchronize the tree hierarchy first.
129 // TODO(khushalsagar): Don't do this if the hierarchy didn't change. See 222 // TODO(khushalsagar): Don't do this if the hierarchy didn't change. See
130 // crbug.com/605170. 223 // crbug.com/605170.
131 EngineIdToLayerMap new_engine_id_to_layer; 224 EngineIdToLayerMap new_engine_id_to_layer;
132 ScrollbarLayerToScrollLayerId scrollbar_layer_to_scroll_layer; 225 ScrollbarLayerToScrollLayerId scrollbar_layer_to_scroll_layer;
133 if (layer_tree_proto.has_root_layer()) { 226 if (layer_tree_proto.has_root_layer()) {
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
166 GetLayer(layer_tree_proto.inner_viewport_scroll_layer_id()), 259 GetLayer(layer_tree_proto.inner_viewport_scroll_layer_id()),
167 GetLayer(layer_tree_proto.outer_viewport_scroll_layer_id())); 260 GetLayer(layer_tree_proto.outer_viewport_scroll_layer_id()));
168 261
169 layer_tree->SetDeviceScaleFactor(layer_tree_proto.device_scale_factor()); 262 layer_tree->SetDeviceScaleFactor(layer_tree_proto.device_scale_factor());
170 layer_tree->SetPaintedDeviceScaleFactor( 263 layer_tree->SetPaintedDeviceScaleFactor(
171 layer_tree_proto.painted_device_scale_factor()); 264 layer_tree_proto.painted_device_scale_factor());
172 265
173 float min_page_scale_factor = layer_tree_proto.min_page_scale_factor(); 266 float min_page_scale_factor = layer_tree_proto.min_page_scale_factor();
174 float max_page_scale_factor = layer_tree_proto.max_page_scale_factor(); 267 float max_page_scale_factor = layer_tree_proto.max_page_scale_factor();
175 float page_scale_factor = layer_tree_proto.page_scale_factor(); 268 float page_scale_factor = layer_tree_proto.page_scale_factor();
176 if (client_->ShouldRetainClientPageScale(page_scale_factor)) 269 synced_page_scale_.PushFromEngineMainThread(page_scale_factor);
177 page_scale_factor = layer_tree->page_scale_factor(); 270 layer_tree->SetPageScaleFactorAndLimits(synced_page_scale_.EngineMain(),
178 layer_tree->SetPageScaleFactorAndLimits( 271 min_page_scale_factor,
179 page_scale_factor, min_page_scale_factor, max_page_scale_factor); 272 max_page_scale_factor);
180 273
181 layer_tree->set_background_color(layer_tree_proto.background_color()); 274 layer_tree->set_background_color(layer_tree_proto.background_color());
182 layer_tree->set_has_transparent_background( 275 layer_tree->set_has_transparent_background(
183 layer_tree_proto.has_transparent_background()); 276 layer_tree_proto.has_transparent_background());
184 277
185 LayerSelection selection; 278 LayerSelection selection;
186 LayerSelectionFromProtobuf(&selection, layer_tree_proto.selection()); 279 LayerSelectionFromProtobuf(&selection, layer_tree_proto.selection());
187 layer_tree->RegisterSelection(selection); 280 layer_tree->RegisterSelection(selection);
188 layer_tree->SetViewportSize( 281 layer_tree->SetViewportSize(
189 ProtoToSize(layer_tree_proto.device_viewport_size())); 282 ProtoToSize(layer_tree_proto.device_viewport_size()));
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 layer->SetPosition(ProtoToPointF(base.position())); 314 layer->SetPosition(ProtoToPointF(base.position()));
222 layer->SetTransform(ProtoToTransform(base.transform())); 315 layer->SetTransform(ProtoToTransform(base.transform()));
223 layer->SetTransformOrigin(ProtoToPoint3F(base.transform_origin())); 316 layer->SetTransformOrigin(ProtoToPoint3F(base.transform_origin()));
224 layer->SetIsDrawable(base.is_drawable()); 317 layer->SetIsDrawable(base.is_drawable());
225 layer->SetDoubleSided(base.double_sided()); 318 layer->SetDoubleSided(base.double_sided());
226 layer->SetShouldFlattenTransform(base.should_flatten_transform()); 319 layer->SetShouldFlattenTransform(base.should_flatten_transform());
227 layer->Set3dSortingContextId(base.sorting_context_id()); 320 layer->Set3dSortingContextId(base.sorting_context_id());
228 layer->SetUseParentBackfaceVisibility(base.use_parent_backface_visibility()); 321 layer->SetUseParentBackfaceVisibility(base.use_parent_backface_visibility());
229 layer->SetBackgroundColor(base.background_color()); 322 layer->SetBackgroundColor(base.background_color());
230 323
231 gfx::ScrollOffset scroll_offset = ProtoToScrollOffset(base.scroll_offset()); 324 gfx::ScrollOffset engine_scroll_offset =
232 if (client_->ShouldRetainClientScroll(engine_layer_id, scroll_offset)) 325 ProtoToScrollOffset(base.scroll_offset());
233 scroll_offset = layer->scroll_offset(); 326 SyncedRemoteScrollOffset& synced_scroll_offset =
234 layer->SetScrollOffset(scroll_offset); 327 GetLayerData(engine_layer_id)->synced_scroll_offset;
328 synced_scroll_offset.PushFromEngineMainThread(engine_scroll_offset);
329 layer->SetScrollOffset(synced_scroll_offset.EngineMain());
235 330
236 layer->SetScrollClipLayerId( 331 layer->SetScrollClipLayerId(
237 GetClientIdFromEngineId(base.scroll_clip_layer_id())); 332 GetClientIdFromEngineId(base.scroll_clip_layer_id()));
238 layer->SetUserScrollable(base.user_scrollable_horizontal(), 333 layer->SetUserScrollable(base.user_scrollable_horizontal(),
239 base.user_scrollable_vertical()); 334 base.user_scrollable_vertical());
240 335
241 if (layer->main_thread_scrolling_reasons()) { 336 if (layer->main_thread_scrolling_reasons()) {
242 layer->ClearMainThreadScrollingReasons( 337 layer->ClearMainThreadScrollingReasons(
243 layer->main_thread_scrolling_reasons()); 338 layer->main_thread_scrolling_reasons());
244 } 339 }
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 mask_layer_node, new_layer_map, scrollbar_layer_to_scroll_layer); 422 mask_layer_node, new_layer_map, scrollbar_layer_to_scroll_layer);
328 layer->SetMaskLayer(mask_layer.get()); 423 layer->SetMaskLayer(mask_layer.get());
329 SynchronizeLayerHierarchyRecursive(mask_layer.get(), mask_layer_node, 424 SynchronizeLayerHierarchyRecursive(mask_layer.get(), mask_layer_node,
330 new_layer_map, 425 new_layer_map,
331 scrollbar_layer_to_scroll_layer); 426 scrollbar_layer_to_scroll_layer);
332 } else { 427 } else {
333 layer->SetMaskLayer(nullptr); 428 layer->SetMaskLayer(nullptr);
334 } 429 }
335 430
336 // Scroll callback. 431 // Scroll callback.
337 layer->set_did_scroll_callback(base::Bind(scroll_callback_, layer_node.id())); 432 layer->set_did_scroll_callback(
433 base::Bind(&CompositorStateDeserializer::LayerScrolled,
434 weak_factory_.GetWeakPtr(), layer_node.id()));
338 } 435 }
339 436
340 scoped_refptr<Layer> CompositorStateDeserializer::GetLayerAndAddToNewMap( 437 scoped_refptr<Layer> CompositorStateDeserializer::GetLayerAndAddToNewMap(
341 const proto::LayerNode& layer_node, 438 const proto::LayerNode& layer_node,
342 EngineIdToLayerMap* new_layer_map, 439 EngineIdToLayerMap* new_layer_map,
343 ScrollbarLayerToScrollLayerId* scrollbar_layer_to_scroll_layer) { 440 ScrollbarLayerToScrollLayerId* scrollbar_layer_to_scroll_layer) {
344 DCHECK(new_layer_map->find(layer_node.id()) == new_layer_map->end()) 441 DCHECK(new_layer_map->find(layer_node.id()) == new_layer_map->end())
345 << "A LayerNode should have been de-serialized only once"; 442 << "A LayerNode should have been de-serialized only once";
346 443
347 scoped_refptr<Layer> layer; 444 scoped_refptr<Layer> layer;
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
402 } break; 499 } break;
403 case proto::LayerNode::HEADS_UP_DISPLAY_LAYER: 500 case proto::LayerNode::HEADS_UP_DISPLAY_LAYER:
404 // TODO(khushalsagar): Remove this from proto. 501 // TODO(khushalsagar): Remove this from proto.
405 NOTREACHED(); 502 NOTREACHED();
406 } 503 }
407 504
408 layer = layer_data.layer; 505 layer = layer_data.layer;
409 return layer; 506 return layer;
410 } 507 }
411 508
509 void CompositorStateDeserializer::LayerScrolled(int engine_layer_id) {
510 LayerData* layer_data = GetLayerData(engine_layer_id);
511 Layer* layer = layer_data->layer.get();
512 SyncedRemoteScrollOffset& synced_scroll_offset =
513 layer_data->synced_scroll_offset;
514 synced_scroll_offset.UpdateDeltaFromImplThread(layer->scroll_offset());
515 layer->SetScrollOffset(synced_scroll_offset.EngineMain());
516 client_->DidUpdateLocalState();
517 }
518
412 int CompositorStateDeserializer::GetClientIdFromEngineId( 519 int CompositorStateDeserializer::GetClientIdFromEngineId(
413 int engine_layer_id) const { 520 int engine_layer_id) const {
414 Layer* layer = GetLayerForEngineId(engine_layer_id); 521 Layer* layer = GetLayerForEngineId(engine_layer_id);
415 return layer ? layer->id() : Layer::LayerIdLabels::INVALID_ID; 522 return layer ? layer->id() : Layer::LayerIdLabels::INVALID_ID;
416 } 523 }
417 524
418 scoped_refptr<Layer> CompositorStateDeserializer::GetLayer( 525 scoped_refptr<Layer> CompositorStateDeserializer::GetLayer(
419 int engine_layer_id) const { 526 int engine_layer_id) const {
420 EngineIdToLayerMap::const_iterator layer_it = 527 EngineIdToLayerMap::const_iterator layer_it =
421 engine_id_to_layer_.find(engine_layer_id); 528 engine_id_to_layer_.find(engine_layer_id);
422 return layer_it != engine_id_to_layer_.end() ? layer_it->second.layer 529 return layer_it != engine_id_to_layer_.end() ? layer_it->second.layer
423 : nullptr; 530 : nullptr;
424 } 531 }
425 532
426 DeserializedContentLayerClient* 533 DeserializedContentLayerClient*
427 CompositorStateDeserializer::GetContentLayerClient(int engine_layer_id) const { 534 CompositorStateDeserializer::GetContentLayerClient(int engine_layer_id) const {
428 EngineIdToLayerMap::const_iterator layer_it = 535 EngineIdToLayerMap::const_iterator layer_it =
429 engine_id_to_layer_.find(engine_layer_id); 536 engine_id_to_layer_.find(engine_layer_id);
430 return layer_it != engine_id_to_layer_.end() 537 return layer_it != engine_id_to_layer_.end()
431 ? layer_it->second.content_layer_client.get() 538 ? layer_it->second.content_layer_client.get()
432 : nullptr; 539 : nullptr;
433 } 540 }
434 541
542 CompositorStateDeserializer::LayerData*
543 CompositorStateDeserializer::GetLayerData(int engine_layer_id) {
544 EngineIdToLayerMap::iterator layer_it =
545 engine_id_to_layer_.find(engine_layer_id);
546 return layer_it != engine_id_to_layer_.end() ? &layer_it->second : nullptr;
547 }
548
435 } // namespace cc 549 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698