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

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

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

Powered by Google App Engine
This is Rietveld 408576698