OLD | NEW |
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> |
11 #include <memory> | 11 #include <memory> |
12 #include <stack> | 12 #include <stack> |
13 #include <string> | 13 #include <string> |
14 #include <unordered_map> | 14 #include <unordered_map> |
15 | 15 |
16 #include "base/atomic_sequence_num.h" | 16 #include "base/atomic_sequence_num.h" |
17 #include "base/auto_reset.h" | |
18 #include "base/bind.h" | 17 #include "base/bind.h" |
19 #include "base/command_line.h" | 18 #include "base/command_line.h" |
20 #include "base/location.h" | 19 #include "base/location.h" |
21 #include "base/metrics/histogram.h" | 20 #include "base/metrics/histogram.h" |
22 #include "base/numerics/safe_math.h" | 21 #include "base/numerics/safe_math.h" |
23 #include "base/single_thread_task_runner.h" | 22 #include "base/single_thread_task_runner.h" |
24 #include "base/stl_util.h" | 23 #include "base/stl_util.h" |
25 #include "base/strings/string_number_conversions.h" | 24 #include "base/strings/string_number_conversions.h" |
26 #include "base/threading/thread_task_runner_handle.h" | 25 #include "base/threading/thread_task_runner_handle.h" |
27 #include "base/trace_event/trace_event.h" | 26 #include "base/trace_event/trace_event.h" |
28 #include "base/trace_event/trace_event_argument.h" | 27 #include "base/trace_event/trace_event_argument.h" |
29 #include "cc/animation/animation_events.h" | 28 #include "cc/animation/animation_events.h" |
30 #include "cc/animation/animation_host.h" | 29 #include "cc/animation/animation_host.h" |
31 #include "cc/base/math_util.h" | 30 #include "cc/base/math_util.h" |
32 #include "cc/blimp/image_serialization_processor.h" | 31 #include "cc/blimp/image_serialization_processor.h" |
33 #include "cc/blimp/picture_data.h" | 32 #include "cc/blimp/picture_data.h" |
34 #include "cc/blimp/picture_data_conversions.h" | 33 #include "cc/blimp/picture_data_conversions.h" |
35 #include "cc/debug/devtools_instrumentation.h" | 34 #include "cc/debug/devtools_instrumentation.h" |
36 #include "cc/debug/frame_viewer_instrumentation.h" | 35 #include "cc/debug/frame_viewer_instrumentation.h" |
37 #include "cc/debug/rendering_stats_instrumentation.h" | 36 #include "cc/debug/rendering_stats_instrumentation.h" |
38 #include "cc/input/layer_selection_bound.h" | 37 #include "cc/input/layer_selection_bound.h" |
39 #include "cc/input/page_scale_animation.h" | 38 #include "cc/input/page_scale_animation.h" |
40 #include "cc/layers/heads_up_display_layer.h" | 39 #include "cc/layers/heads_up_display_layer.h" |
41 #include "cc/layers/heads_up_display_layer_impl.h" | 40 #include "cc/layers/heads_up_display_layer_impl.h" |
42 #include "cc/layers/layer.h" | 41 #include "cc/layers/layer.h" |
43 #include "cc/layers/layer_iterator.h" | 42 #include "cc/layers/layer_iterator.h" |
44 #include "cc/layers/layer_proto_converter.h" | 43 #include "cc/layers/layer_proto_converter.h" |
45 #include "cc/layers/painted_scrollbar_layer.h" | 44 #include "cc/layers/painted_scrollbar_layer.h" |
46 #include "cc/proto/gfx_conversions.h" | 45 #include "cc/proto/gfx_conversions.h" |
| 46 #include "cc/proto/layer_tree.pb.h" |
47 #include "cc/proto/layer_tree_host.pb.h" | 47 #include "cc/proto/layer_tree_host.pb.h" |
48 #include "cc/resources/ui_resource_request.h" | 48 #include "cc/resources/ui_resource_request.h" |
49 #include "cc/scheduler/begin_frame_source.h" | 49 #include "cc/scheduler/begin_frame_source.h" |
50 #include "cc/trees/draw_property_utils.h" | 50 #include "cc/trees/draw_property_utils.h" |
51 #include "cc/trees/layer_tree_host_client.h" | 51 #include "cc/trees/layer_tree_host_client.h" |
52 #include "cc/trees/layer_tree_host_common.h" | 52 #include "cc/trees/layer_tree_host_common.h" |
53 #include "cc/trees/layer_tree_host_impl.h" | 53 #include "cc/trees/layer_tree_host_impl.h" |
54 #include "cc/trees/layer_tree_impl.h" | 54 #include "cc/trees/layer_tree_impl.h" |
55 #include "cc/trees/property_tree_builder.h" | 55 #include "cc/trees/property_tree_builder.h" |
56 #include "cc/trees/proxy_main.h" | 56 #include "cc/trees/proxy_main.h" |
57 #include "cc/trees/remote_channel_impl.h" | 57 #include "cc/trees/remote_channel_impl.h" |
58 #include "cc/trees/single_thread_proxy.h" | 58 #include "cc/trees/single_thread_proxy.h" |
59 #include "cc/trees/tree_synchronizer.h" | 59 #include "cc/trees/tree_synchronizer.h" |
60 #include "ui/gfx/geometry/size_conversions.h" | 60 #include "ui/gfx/geometry/size_conversions.h" |
61 #include "ui/gfx/geometry/vector2d_conversions.h" | 61 #include "ui/gfx/geometry/vector2d_conversions.h" |
62 | 62 |
63 namespace { | 63 namespace { |
64 static base::StaticAtomicSequenceNumber s_layer_tree_host_sequence_number; | 64 static base::StaticAtomicSequenceNumber s_layer_tree_host_sequence_number; |
65 } | 65 } |
66 | 66 |
67 namespace cc { | 67 namespace cc { |
68 namespace { | 68 namespace { |
69 | 69 |
70 Layer* UpdateAndGetLayer(Layer* current_layer, | 70 Layer* UpdateAndGetLayer(Layer* current_layer, |
71 int layer_id, | 71 int layer_id, |
72 const std::unordered_map<int, Layer*>& layer_id_map) { | 72 LayerTree* layer_tree) { |
73 if (layer_id == Layer::INVALID_ID) { | 73 if (layer_id == Layer::INVALID_ID) { |
74 if (current_layer) | 74 if (current_layer) |
75 current_layer->SetLayerTreeHost(nullptr); | 75 current_layer->SetLayerTreeHost(nullptr); |
76 | 76 |
77 return nullptr; | 77 return nullptr; |
78 } | 78 } |
79 | 79 Layer* layer = layer_tree->LayerById(layer_id); |
80 auto layer_it = layer_id_map.find(layer_id); | 80 DCHECK(layer); |
81 DCHECK(layer_it != layer_id_map.end()); | 81 if (current_layer && current_layer != layer) |
82 if (current_layer && current_layer != layer_it->second) | |
83 current_layer->SetLayerTreeHost(nullptr); | 82 current_layer->SetLayerTreeHost(nullptr); |
84 | 83 |
85 return layer_it->second; | 84 return layer; |
86 } | 85 } |
87 | 86 |
88 std::unique_ptr<base::trace_event::TracedValue> | 87 std::unique_ptr<base::trace_event::TracedValue> |
89 ComputeLayerTreeHostProtoSizeSplitAsValue(proto::LayerTreeHost* proto) { | 88 ComputeLayerTreeHostProtoSizeSplitAsValue(proto::LayerTreeHost* proto) { |
90 std::unique_ptr<base::trace_event::TracedValue> value( | 89 std::unique_ptr<base::trace_event::TracedValue> value( |
91 new base::trace_event::TracedValue()); | 90 new base::trace_event::TracedValue()); |
92 base::CheckedNumeric<int> base_layer_properties_size = 0; | 91 base::CheckedNumeric<int> base_layer_properties_size = 0; |
93 base::CheckedNumeric<int> picture_layer_properties_size = 0; | 92 base::CheckedNumeric<int> picture_layer_properties_size = 0; |
94 base::CheckedNumeric<int> display_item_list_size = 0; | 93 base::CheckedNumeric<int> display_item_list_size = 0; |
95 base::CheckedNumeric<int> drawing_display_items_size = 0; | 94 base::CheckedNumeric<int> drawing_display_items_size = 0; |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
234 page_scale_factor_(1.f), | 233 page_scale_factor_(1.f), |
235 min_page_scale_factor_(1.f), | 234 min_page_scale_factor_(1.f), |
236 max_page_scale_factor_(1.f), | 235 max_page_scale_factor_(1.f), |
237 has_gpu_rasterization_trigger_(false), | 236 has_gpu_rasterization_trigger_(false), |
238 content_is_suitable_for_gpu_rasterization_(true), | 237 content_is_suitable_for_gpu_rasterization_(true), |
239 gpu_rasterization_histogram_recorded_(false), | 238 gpu_rasterization_histogram_recorded_(false), |
240 background_color_(SK_ColorWHITE), | 239 background_color_(SK_ColorWHITE), |
241 has_transparent_background_(false), | 240 has_transparent_background_(false), |
242 have_scroll_event_handlers_(false), | 241 have_scroll_event_handlers_(false), |
243 event_listener_properties_(), | 242 event_listener_properties_(), |
244 animation_host_(std::move(params->animation_host)), | |
245 did_complete_scale_animation_(false), | 243 did_complete_scale_animation_(false), |
246 in_paint_layer_contents_(false), | |
247 id_(s_layer_tree_host_sequence_number.GetNext() + 1), | 244 id_(s_layer_tree_host_sequence_number.GetNext() + 1), |
248 next_commit_forces_redraw_(false), | 245 next_commit_forces_redraw_(false), |
249 shared_bitmap_manager_(params->shared_bitmap_manager), | 246 shared_bitmap_manager_(params->shared_bitmap_manager), |
250 gpu_memory_buffer_manager_(params->gpu_memory_buffer_manager), | 247 gpu_memory_buffer_manager_(params->gpu_memory_buffer_manager), |
251 task_graph_runner_(params->task_graph_runner), | 248 task_graph_runner_(params->task_graph_runner), |
252 image_serialization_processor_(params->image_serialization_processor), | 249 image_serialization_processor_(params->image_serialization_processor), |
253 surface_client_id_(0u), | 250 surface_client_id_(0u), |
254 next_surface_sequence_(1u) { | 251 next_surface_sequence_(1u), |
| 252 layer_tree_(std::move(params->animation_host)) { |
255 DCHECK(task_graph_runner_); | 253 DCHECK(task_graph_runner_); |
256 | 254 |
257 DCHECK(animation_host_); | 255 layer_tree_.animation_host()->SetMutatorHostClient(this); |
258 animation_host_->SetMutatorHostClient(this); | |
259 | 256 |
260 rendering_stats_instrumentation_->set_record_rendering_stats( | 257 rendering_stats_instrumentation_->set_record_rendering_stats( |
261 debug_state_.RecordRenderingStats()); | 258 debug_state_.RecordRenderingStats()); |
262 } | 259 } |
263 | 260 |
264 void LayerTreeHost::InitializeThreaded( | 261 void LayerTreeHost::InitializeThreaded( |
265 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 262 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
266 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, | 263 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, |
267 std::unique_ptr<BeginFrameSource> external_begin_frame_source) { | 264 std::unique_ptr<BeginFrameSource> external_begin_frame_source) { |
268 task_runner_provider_ = | 265 task_runner_provider_ = |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
359 | 356 |
360 void LayerTreeHost::InitializeProxy( | 357 void LayerTreeHost::InitializeProxy( |
361 std::unique_ptr<Proxy> proxy, | 358 std::unique_ptr<Proxy> proxy, |
362 std::unique_ptr<BeginFrameSource> external_begin_frame_source) { | 359 std::unique_ptr<BeginFrameSource> external_begin_frame_source) { |
363 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); | 360 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); |
364 DCHECK(task_runner_provider_); | 361 DCHECK(task_runner_provider_); |
365 | 362 |
366 proxy_ = std::move(proxy); | 363 proxy_ = std::move(proxy); |
367 proxy_->Start(std::move(external_begin_frame_source)); | 364 proxy_->Start(std::move(external_begin_frame_source)); |
368 | 365 |
369 animation_host_->SetSupportsScrollAnimations(proxy_->SupportsImplScrolling()); | 366 GetLayerTree()->animation_host()->SetSupportsScrollAnimations( |
| 367 proxy_->SupportsImplScrolling()); |
370 } | 368 } |
371 | 369 |
372 LayerTreeHost::~LayerTreeHost() { | 370 LayerTreeHost::~LayerTreeHost() { |
373 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); | 371 TRACE_EVENT0("cc", "LayerTreeHost::~LayerTreeHost"); |
374 | 372 |
375 animation_host_->SetMutatorHostClient(nullptr); | 373 GetLayerTree()->animation_host()->SetMutatorHostClient(nullptr); |
376 | 374 |
377 if (root_layer_.get()) | 375 if (root_layer_.get()) |
378 root_layer_->SetLayerTreeHost(NULL); | 376 root_layer_->SetLayerTreeHost(NULL); |
379 | 377 |
380 DCHECK(swap_promise_monitor_.empty()); | 378 DCHECK(swap_promise_monitor_.empty()); |
381 | 379 |
382 BreakSwapPromises(SwapPromise::COMMIT_FAILS); | 380 BreakSwapPromises(SwapPromise::COMMIT_FAILS); |
383 | 381 |
384 if (proxy_) { | 382 if (proxy_) { |
385 DCHECK(task_runner_provider_->IsMainThread()); | 383 DCHECK(task_runner_provider_->IsMainThread()); |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 ui_resource_request_queue_.clear(); | 541 ui_resource_request_queue_.clear(); |
544 } | 542 } |
545 | 543 |
546 DCHECK(!sync_tree->ViewportSizeInvalid()); | 544 DCHECK(!sync_tree->ViewportSizeInvalid()); |
547 | 545 |
548 sync_tree->set_has_ever_been_drawn(false); | 546 sync_tree->set_has_ever_been_drawn(false); |
549 | 547 |
550 { | 548 { |
551 TRACE_EVENT0("cc", "LayerTreeHost::PushProperties"); | 549 TRACE_EVENT0("cc", "LayerTreeHost::PushProperties"); |
552 | 550 |
553 TreeSynchronizer::PushLayerProperties(this, sync_tree); | 551 TreeSynchronizer::PushLayerProperties(GetLayerTree(), sync_tree); |
554 | 552 |
555 // This must happen after synchronizing property trees and after push | 553 // This must happen after synchronizing property trees and after push |
556 // properties, which updates property tree indices, but before animation | 554 // properties, which updates property tree indices, but before animation |
557 // host pushes properties as animation host push properties can change | 555 // host pushes properties as animation host push properties can change |
558 // Animation::InEffect and we want the old InEffect value for updating | 556 // Animation::InEffect and we want the old InEffect value for updating |
559 // property tree scrolling and animation. | 557 // property tree scrolling and animation. |
560 sync_tree->UpdatePropertyTreeScrollingAndAnimationFromMainThread(); | 558 sync_tree->UpdatePropertyTreeScrollingAndAnimationFromMainThread(); |
561 | 559 |
562 TRACE_EVENT0("cc", "LayerTreeHost::AnimationHost::PushProperties"); | 560 TRACE_EVENT0("cc", "LayerTreeHost::AnimationHost::PushProperties"); |
563 DCHECK(host_impl->animation_host()); | 561 DCHECK(host_impl->animation_host()); |
564 animation_host_->PushPropertiesTo(host_impl->animation_host()); | 562 GetLayerTree()->animation_host()->PushPropertiesTo( |
| 563 host_impl->animation_host()); |
565 } | 564 } |
566 | 565 |
567 // This must happen after synchronizing property trees and after pushing | 566 // This must happen after synchronizing property trees and after pushing |
568 // properties, which updates the clobber_active_value flag. | 567 // properties, which updates the clobber_active_value flag. |
569 sync_tree->UpdatePropertyTreeScrollOffset(&property_trees_); | 568 sync_tree->UpdatePropertyTreeScrollOffset(&property_trees_); |
570 | 569 |
571 micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl); | 570 micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl); |
572 property_trees_.ResetAllChangeTracking(); | 571 property_trees_.ResetAllChangeTracking(); |
573 } | 572 } |
574 | 573 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
641 client_->DidFailToInitializeOutputSurface(); | 640 client_->DidFailToInitializeOutputSurface(); |
642 } | 641 } |
643 | 642 |
644 std::unique_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl( | 643 std::unique_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl( |
645 LayerTreeHostImplClient* client) { | 644 LayerTreeHostImplClient* client) { |
646 DCHECK(!IsRemoteServer()); | 645 DCHECK(!IsRemoteServer()); |
647 DCHECK(task_runner_provider_->IsImplThread()); | 646 DCHECK(task_runner_provider_->IsImplThread()); |
648 | 647 |
649 const bool supports_impl_scrolling = task_runner_provider_->HasImplThread(); | 648 const bool supports_impl_scrolling = task_runner_provider_->HasImplThread(); |
650 std::unique_ptr<AnimationHost> animation_host_impl = | 649 std::unique_ptr<AnimationHost> animation_host_impl = |
651 animation_host_->CreateImplInstance(supports_impl_scrolling); | 650 GetLayerTree()->animation_host()->CreateImplInstance( |
| 651 supports_impl_scrolling); |
652 | 652 |
653 std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( | 653 std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( |
654 settings_, client, task_runner_provider_.get(), | 654 settings_, client, task_runner_provider_.get(), |
655 rendering_stats_instrumentation_.get(), shared_bitmap_manager_, | 655 rendering_stats_instrumentation_.get(), shared_bitmap_manager_, |
656 gpu_memory_buffer_manager_, task_graph_runner_, | 656 gpu_memory_buffer_manager_, task_graph_runner_, |
657 std::move(animation_host_impl), id_); | 657 std::move(animation_host_impl), id_); |
658 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); | 658 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); |
659 host_impl->SetContentIsSuitableForGpuRasterization( | 659 host_impl->SetContentIsSuitableForGpuRasterization( |
660 content_is_suitable_for_gpu_rasterization_); | 660 content_is_suitable_for_gpu_rasterization_); |
661 shared_bitmap_manager_ = NULL; | 661 shared_bitmap_manager_ = NULL; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 } | 746 } |
747 | 747 |
748 void LayerTreeHost::SetNextCommitForcesRedraw() { | 748 void LayerTreeHost::SetNextCommitForcesRedraw() { |
749 next_commit_forces_redraw_ = true; | 749 next_commit_forces_redraw_ = true; |
750 proxy_->SetNeedsUpdateLayers(); | 750 proxy_->SetNeedsUpdateLayers(); |
751 } | 751 } |
752 | 752 |
753 void LayerTreeHost::SetAnimationEvents( | 753 void LayerTreeHost::SetAnimationEvents( |
754 std::unique_ptr<AnimationEvents> events) { | 754 std::unique_ptr<AnimationEvents> events) { |
755 DCHECK(task_runner_provider_->IsMainThread()); | 755 DCHECK(task_runner_provider_->IsMainThread()); |
756 animation_host_->SetAnimationEvents(std::move(events)); | 756 GetLayerTree()->animation_host()->SetAnimationEvents(std::move(events)); |
757 } | 757 } |
758 | 758 |
759 void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) { | 759 void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) { |
760 if (root_layer_.get() == root_layer.get()) | 760 if (root_layer_.get() == root_layer.get()) |
761 return; | 761 return; |
762 | 762 |
763 if (root_layer_.get()) | 763 if (root_layer_.get()) |
764 root_layer_->SetLayerTreeHost(NULL); | 764 root_layer_->SetLayerTreeHost(NULL); |
765 root_layer_ = root_layer; | 765 root_layer_ = root_layer; |
766 if (root_layer_.get()) { | 766 if (root_layer_.get()) { |
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1040 } | 1040 } |
1041 draw_property_utils::UpdatePropertyTrees(&property_trees_, | 1041 draw_property_utils::UpdatePropertyTrees(&property_trees_, |
1042 can_render_to_separate_surface); | 1042 can_render_to_separate_surface); |
1043 draw_property_utils::FindLayersThatNeedUpdates( | 1043 draw_property_utils::FindLayersThatNeedUpdates( |
1044 this, property_trees_.transform_tree, property_trees_.effect_tree, | 1044 this, property_trees_.transform_tree, property_trees_.effect_tree, |
1045 &update_layer_list); | 1045 &update_layer_list); |
1046 } | 1046 } |
1047 | 1047 |
1048 for (const auto& layer : update_layer_list) | 1048 for (const auto& layer : update_layer_list) |
1049 layer->SavePaintProperties(); | 1049 layer->SavePaintProperties(); |
1050 | |
1051 base::AutoReset<bool> painting(&in_paint_layer_contents_, true); | |
1052 bool did_paint_content = false; | |
1053 bool content_is_suitable_for_gpu = true; | 1050 bool content_is_suitable_for_gpu = true; |
1054 for (const auto& layer : update_layer_list) { | 1051 bool did_paint_content = GetLayerTree()->UpdateLayers( |
1055 did_paint_content |= layer->Update(); | 1052 update_layer_list, &content_is_suitable_for_gpu); |
1056 content_is_suitable_for_gpu &= layer->IsSuitableForGpuRasterization(); | |
1057 } | |
1058 | 1053 |
1059 if (content_is_suitable_for_gpu) { | 1054 if (content_is_suitable_for_gpu) { |
1060 ++num_consecutive_frames_suitable_for_gpu_; | 1055 ++num_consecutive_frames_suitable_for_gpu_; |
1061 if (num_consecutive_frames_suitable_for_gpu_ >= | 1056 if (num_consecutive_frames_suitable_for_gpu_ >= |
1062 kNumFramesToConsiderBeforeGpuRasterization) { | 1057 kNumFramesToConsiderBeforeGpuRasterization) { |
1063 content_is_suitable_for_gpu_rasterization_ = true; | 1058 content_is_suitable_for_gpu_rasterization_ = true; |
1064 } | 1059 } |
1065 } else { | 1060 } else { |
1066 num_consecutive_frames_suitable_for_gpu_ = 0; | 1061 num_consecutive_frames_suitable_for_gpu_ = 0; |
1067 content_is_suitable_for_gpu_rasterization_ = false; | 1062 content_is_suitable_for_gpu_rasterization_ = false; |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1146 | 1141 |
1147 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints, | 1142 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints, |
1148 TopControlsState current, | 1143 TopControlsState current, |
1149 bool animate) { | 1144 bool animate) { |
1150 // Top controls are only used in threaded or remote mode. | 1145 // Top controls are only used in threaded or remote mode. |
1151 DCHECK(IsThreaded() || IsRemoteServer()); | 1146 DCHECK(IsThreaded() || IsRemoteServer()); |
1152 proxy_->UpdateTopControlsState(constraints, current, animate); | 1147 proxy_->UpdateTopControlsState(constraints, current, animate); |
1153 } | 1148 } |
1154 | 1149 |
1155 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { | 1150 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { |
1156 std::unique_ptr<AnimationEvents> events = animation_host_->CreateEvents(); | 1151 AnimationHost* animation_host = GetLayerTree()->animation_host(); |
| 1152 std::unique_ptr<AnimationEvents> events = animation_host->CreateEvents(); |
1157 | 1153 |
1158 if (animation_host_->AnimateLayers(monotonic_time)) | 1154 if (animation_host->AnimateLayers(monotonic_time)) |
1159 animation_host_->UpdateAnimationState(true, events.get()); | 1155 animation_host->UpdateAnimationState(true, events.get()); |
1160 | 1156 |
1161 if (!events->events_.empty()) | 1157 if (!events->events_.empty()) |
1162 property_trees_.needs_rebuild = true; | 1158 property_trees_.needs_rebuild = true; |
1163 } | 1159 } |
1164 | 1160 |
1165 UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { | 1161 UIResourceId LayerTreeHost::CreateUIResource(UIResourceClient* client) { |
1166 DCHECK(client); | 1162 DCHECK(client); |
1167 | 1163 |
1168 UIResourceId next_id = next_ui_resource_id_++; | 1164 UIResourceId next_id = next_ui_resource_id_++; |
1169 DCHECK(ui_resource_client_map_.find(next_id) == | 1165 DCHECK(ui_resource_client_map_.find(next_id) == |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1308 SurfaceSequence LayerTreeHost::CreateSurfaceSequence() { | 1304 SurfaceSequence LayerTreeHost::CreateSurfaceSequence() { |
1309 return SurfaceSequence(surface_client_id_, next_surface_sequence_++); | 1305 return SurfaceSequence(surface_client_id_, next_surface_sequence_++); |
1310 } | 1306 } |
1311 | 1307 |
1312 void LayerTreeHost::SetLayerTreeMutator( | 1308 void LayerTreeHost::SetLayerTreeMutator( |
1313 std::unique_ptr<LayerTreeMutator> mutator) { | 1309 std::unique_ptr<LayerTreeMutator> mutator) { |
1314 proxy_->SetMutator(std::move(mutator)); | 1310 proxy_->SetMutator(std::move(mutator)); |
1315 } | 1311 } |
1316 | 1312 |
1317 Layer* LayerTreeHost::LayerById(int id) const { | 1313 Layer* LayerTreeHost::LayerById(int id) const { |
1318 LayerIdMap::const_iterator iter = layer_id_map_.find(id); | 1314 return GetLayerTree()->LayerById(id); |
1319 return iter != layer_id_map_.end() ? iter->second : nullptr; | |
1320 } | 1315 } |
1321 | 1316 |
1322 Layer* LayerTreeHost::LayerByElementId(ElementId element_id) const { | 1317 Layer* LayerTreeHost::LayerByElementId(ElementId element_id) const { |
1323 ElementLayersMap::const_iterator iter = element_layers_map_.find(element_id); | 1318 ElementLayersMap::const_iterator iter = element_layers_map_.find(element_id); |
1324 return iter != element_layers_map_.end() ? iter->second : nullptr; | 1319 return iter != element_layers_map_.end() ? iter->second : nullptr; |
1325 } | 1320 } |
1326 | 1321 |
1327 void LayerTreeHost::AddToElementMap(Layer* layer) { | 1322 void LayerTreeHost::AddToElementMap(Layer* layer) { |
1328 if (!layer->element_id()) | 1323 if (!layer->element_id()) |
1329 return; | 1324 return; |
1330 | 1325 |
1331 element_layers_map_[layer->element_id()] = layer; | 1326 element_layers_map_[layer->element_id()] = layer; |
1332 } | 1327 } |
1333 | 1328 |
1334 void LayerTreeHost::RemoveFromElementMap(Layer* layer) { | 1329 void LayerTreeHost::RemoveFromElementMap(Layer* layer) { |
1335 if (!layer->element_id()) | 1330 if (!layer->element_id()) |
1336 return; | 1331 return; |
1337 | 1332 |
1338 element_layers_map_.erase(layer->element_id()); | 1333 element_layers_map_.erase(layer->element_id()); |
1339 } | 1334 } |
1340 | 1335 |
1341 void LayerTreeHost::AddLayerShouldPushProperties(Layer* layer) { | |
1342 layers_that_should_push_properties_.insert(layer); | |
1343 } | |
1344 | |
1345 void LayerTreeHost::RemoveLayerShouldPushProperties(Layer* layer) { | |
1346 layers_that_should_push_properties_.erase(layer); | |
1347 } | |
1348 | |
1349 std::unordered_set<Layer*>& LayerTreeHost::LayersThatShouldPushProperties() { | |
1350 return layers_that_should_push_properties_; | |
1351 } | |
1352 | |
1353 bool LayerTreeHost::LayerNeedsPushPropertiesForTesting(Layer* layer) { | |
1354 return layers_that_should_push_properties_.find(layer) != | |
1355 layers_that_should_push_properties_.end(); | |
1356 } | |
1357 | |
1358 void LayerTreeHost::RegisterLayer(Layer* layer) { | |
1359 DCHECK(!LayerById(layer->id())); | |
1360 DCHECK(!in_paint_layer_contents_); | |
1361 layer_id_map_[layer->id()] = layer; | |
1362 if (layer->element_id()) { | |
1363 animation_host_->RegisterElement(layer->element_id(), | |
1364 ElementListType::ACTIVE); | |
1365 } | |
1366 } | |
1367 | |
1368 void LayerTreeHost::UnregisterLayer(Layer* layer) { | |
1369 DCHECK(LayerById(layer->id())); | |
1370 DCHECK(!in_paint_layer_contents_); | |
1371 if (layer->element_id()) { | |
1372 animation_host_->UnregisterElement(layer->element_id(), | |
1373 ElementListType::ACTIVE); | |
1374 } | |
1375 RemoveLayerShouldPushProperties(layer); | |
1376 layer_id_map_.erase(layer->id()); | |
1377 } | |
1378 | |
1379 bool LayerTreeHost::IsElementInList(ElementId element_id, | 1336 bool LayerTreeHost::IsElementInList(ElementId element_id, |
1380 ElementListType list_type) const { | 1337 ElementListType list_type) const { |
1381 return list_type == ElementListType::ACTIVE && LayerByElementId(element_id); | 1338 return list_type == ElementListType::ACTIVE && LayerByElementId(element_id); |
1382 } | 1339 } |
1383 | 1340 |
1384 void LayerTreeHost::SetMutatorsNeedCommit() { | 1341 void LayerTreeHost::SetMutatorsNeedCommit() { |
1385 SetNeedsCommit(); | 1342 SetNeedsCommit(); |
1386 } | 1343 } |
1387 | 1344 |
1388 void LayerTreeHost::SetMutatorsNeedRebuildPropertyTrees() { | 1345 void LayerTreeHost::SetMutatorsNeedRebuildPropertyTrees() { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1525 swap_promises->swap(swap_promise_list_); | 1482 swap_promises->swap(swap_promise_list_); |
1526 DCHECK(swap_promise_list_.empty()); | 1483 DCHECK(swap_promise_list_.empty()); |
1527 | 1484 |
1528 proto->set_needs_full_tree_sync(needs_full_tree_sync_); | 1485 proto->set_needs_full_tree_sync(needs_full_tree_sync_); |
1529 proto->set_needs_meta_info_recomputation(needs_meta_info_recomputation_); | 1486 proto->set_needs_meta_info_recomputation(needs_meta_info_recomputation_); |
1530 proto->set_source_frame_number(source_frame_number_); | 1487 proto->set_source_frame_number(source_frame_number_); |
1531 | 1488 |
1532 LayerProtoConverter::SerializeLayerHierarchy(root_layer_, | 1489 LayerProtoConverter::SerializeLayerHierarchy(root_layer_, |
1533 proto->mutable_root_layer()); | 1490 proto->mutable_root_layer()); |
1534 | 1491 |
1535 // layers_that_should_push_properties_ should be serialized before layer | 1492 // Serialize LayerTree before LayerTree.layers_that_should_push_properties_ |
1536 // properties because it is cleared during the properties serialization. | 1493 // is cleared. |
1537 for (auto layer : layers_that_should_push_properties_) | 1494 GetLayerTree()->ToProtobuf(proto->mutable_layer_tree()); |
1538 proto->add_layers_that_should_push_properties(layer->id()); | |
1539 | 1495 |
| 1496 // This will clear LayerTree.layers_that_should_push_properties_. |
1540 LayerProtoConverter::SerializeLayerProperties(this, | 1497 LayerProtoConverter::SerializeLayerProperties(this, |
1541 proto->mutable_layer_updates()); | 1498 proto->mutable_layer_updates()); |
1542 | 1499 |
1543 std::vector<PictureData> pictures = | 1500 std::vector<PictureData> pictures = |
1544 engine_picture_cache_->CalculateCacheUpdateAndFlush(); | 1501 engine_picture_cache_->CalculateCacheUpdateAndFlush(); |
1545 proto::PictureDataVectorToSkPicturesProto(pictures, | 1502 proto::PictureDataVectorToSkPicturesProto(pictures, |
1546 proto->mutable_pictures()); | 1503 proto->mutable_pictures()); |
1547 | 1504 |
1548 proto->set_hud_layer_id(hud_layer_ ? hud_layer_->id() : Layer::INVALID_ID); | 1505 proto->set_hud_layer_id(hud_layer_ ? hud_layer_->id() : Layer::INVALID_ID); |
1549 debug_state_.ToProtobuf(proto->mutable_debug_state()); | 1506 debug_state_.ToProtobuf(proto->mutable_debug_state()); |
(...skipping 14 matching lines...) Expand all Loading... |
1564 proto->set_has_transparent_background(has_transparent_background_); | 1521 proto->set_has_transparent_background(has_transparent_background_); |
1565 proto->set_have_scroll_event_handlers(have_scroll_event_handlers_); | 1522 proto->set_have_scroll_event_handlers(have_scroll_event_handlers_); |
1566 proto->set_wheel_event_listener_properties(static_cast<uint32_t>( | 1523 proto->set_wheel_event_listener_properties(static_cast<uint32_t>( |
1567 event_listener_properties(EventListenerClass::kMouseWheel))); | 1524 event_listener_properties(EventListenerClass::kMouseWheel))); |
1568 proto->set_touch_start_or_move_event_listener_properties( | 1525 proto->set_touch_start_or_move_event_listener_properties( |
1569 static_cast<uint32_t>( | 1526 static_cast<uint32_t>( |
1570 event_listener_properties(EventListenerClass::kTouchStartOrMove))); | 1527 event_listener_properties(EventListenerClass::kTouchStartOrMove))); |
1571 proto->set_touch_end_or_cancel_event_listener_properties( | 1528 proto->set_touch_end_or_cancel_event_listener_properties( |
1572 static_cast<uint32_t>( | 1529 static_cast<uint32_t>( |
1573 event_listener_properties(EventListenerClass::kTouchEndOrCancel))); | 1530 event_listener_properties(EventListenerClass::kTouchEndOrCancel))); |
1574 proto->set_in_paint_layer_contents(in_paint_layer_contents_); | |
1575 proto->set_id(id_); | 1531 proto->set_id(id_); |
1576 proto->set_next_commit_forces_redraw(next_commit_forces_redraw_); | 1532 proto->set_next_commit_forces_redraw(next_commit_forces_redraw_); |
1577 | 1533 |
1578 // Viewport layers. | 1534 // Viewport layers. |
1579 proto->set_overscroll_elasticity_layer_id( | 1535 proto->set_overscroll_elasticity_layer_id( |
1580 overscroll_elasticity_layer_ ? overscroll_elasticity_layer_->id() | 1536 overscroll_elasticity_layer_ ? overscroll_elasticity_layer_->id() |
1581 : Layer::INVALID_ID); | 1537 : Layer::INVALID_ID); |
1582 proto->set_page_scale_layer_id(page_scale_layer_ ? page_scale_layer_->id() | 1538 proto->set_page_scale_layer_id(page_scale_layer_ ? page_scale_layer_->id() |
1583 : Layer::INVALID_ID); | 1539 : Layer::INVALID_ID); |
1584 proto->set_inner_viewport_scroll_layer_id( | 1540 proto->set_inner_viewport_scroll_layer_id( |
(...skipping 10 matching lines...) Expand all Loading... |
1595 proto->set_surface_client_id(surface_client_id_); | 1551 proto->set_surface_client_id(surface_client_id_); |
1596 proto->set_next_surface_sequence(next_surface_sequence_); | 1552 proto->set_next_surface_sequence(next_surface_sequence_); |
1597 | 1553 |
1598 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( | 1554 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID( |
1599 "cc.remote", "LayerTreeHostProto", source_frame_number_, | 1555 "cc.remote", "LayerTreeHostProto", source_frame_number_, |
1600 ComputeLayerTreeHostProtoSizeSplitAsValue(proto)); | 1556 ComputeLayerTreeHostProtoSizeSplitAsValue(proto)); |
1601 } | 1557 } |
1602 | 1558 |
1603 void LayerTreeHost::FromProtobufForCommit(const proto::LayerTreeHost& proto) { | 1559 void LayerTreeHost::FromProtobufForCommit(const proto::LayerTreeHost& proto) { |
1604 DCHECK(client_picture_cache_); | 1560 DCHECK(client_picture_cache_); |
1605 | 1561 LayerTree* layer_tree = GetLayerTree(); |
1606 needs_full_tree_sync_ = proto.needs_full_tree_sync(); | 1562 needs_full_tree_sync_ = proto.needs_full_tree_sync(); |
1607 needs_meta_info_recomputation_ = proto.needs_meta_info_recomputation(); | 1563 needs_meta_info_recomputation_ = proto.needs_meta_info_recomputation(); |
1608 source_frame_number_ = proto.source_frame_number(); | 1564 source_frame_number_ = proto.source_frame_number(); |
1609 | 1565 |
1610 // Layer hierarchy. | 1566 // Layer hierarchy. |
1611 scoped_refptr<Layer> new_root_layer = | 1567 scoped_refptr<Layer> new_root_layer = |
1612 LayerProtoConverter::DeserializeLayerHierarchy(root_layer_, | 1568 LayerProtoConverter::DeserializeLayerHierarchy(root_layer_, |
1613 proto.root_layer(), this); | 1569 proto.root_layer(), this); |
1614 if (root_layer_ != new_root_layer) { | 1570 if (root_layer_ != new_root_layer) { |
1615 root_layer_ = new_root_layer; | 1571 root_layer_ = new_root_layer; |
1616 } | 1572 } |
1617 | 1573 |
1618 for (auto layer_id : proto.layers_that_should_push_properties()) | 1574 layer_tree->FromProtobuf(proto.layer_tree()); |
1619 layers_that_should_push_properties_.insert(layer_id_map_[layer_id]); | |
1620 | 1575 |
1621 // Ensure ClientPictureCache contains all the necessary SkPictures before | 1576 // Ensure ClientPictureCache contains all the necessary SkPictures before |
1622 // deserializing the properties. | 1577 // deserializing the properties. |
1623 proto::SkPictures proto_pictures = proto.pictures(); | 1578 proto::SkPictures proto_pictures = proto.pictures(); |
1624 std::vector<PictureData> pictures = | 1579 std::vector<PictureData> pictures = |
1625 SkPicturesProtoToPictureDataVector(proto_pictures); | 1580 SkPicturesProtoToPictureDataVector(proto_pictures); |
1626 client_picture_cache_->ApplyCacheUpdate(pictures); | 1581 client_picture_cache_->ApplyCacheUpdate(pictures); |
1627 | 1582 |
1628 LayerProtoConverter::DeserializeLayerProperties(root_layer_.get(), | 1583 LayerProtoConverter::DeserializeLayerProperties(root_layer_.get(), |
1629 proto.layer_updates()); | 1584 proto.layer_updates()); |
(...skipping 23 matching lines...) Expand all Loading... |
1653 static_cast<EventListenerProperties>( | 1608 static_cast<EventListenerProperties>( |
1654 proto.wheel_event_listener_properties()); | 1609 proto.wheel_event_listener_properties()); |
1655 event_listener_properties_[static_cast<size_t>( | 1610 event_listener_properties_[static_cast<size_t>( |
1656 EventListenerClass::kTouchStartOrMove)] = | 1611 EventListenerClass::kTouchStartOrMove)] = |
1657 static_cast<EventListenerProperties>( | 1612 static_cast<EventListenerProperties>( |
1658 proto.touch_start_or_move_event_listener_properties()); | 1613 proto.touch_start_or_move_event_listener_properties()); |
1659 event_listener_properties_[static_cast<size_t>( | 1614 event_listener_properties_[static_cast<size_t>( |
1660 EventListenerClass::kTouchEndOrCancel)] = | 1615 EventListenerClass::kTouchEndOrCancel)] = |
1661 static_cast<EventListenerProperties>( | 1616 static_cast<EventListenerProperties>( |
1662 proto.touch_end_or_cancel_event_listener_properties()); | 1617 proto.touch_end_or_cancel_event_listener_properties()); |
1663 in_paint_layer_contents_ = proto.in_paint_layer_contents(); | |
1664 id_ = proto.id(); | 1618 id_ = proto.id(); |
1665 next_commit_forces_redraw_ = proto.next_commit_forces_redraw(); | 1619 next_commit_forces_redraw_ = proto.next_commit_forces_redraw(); |
1666 | 1620 |
1667 hud_layer_ = static_cast<HeadsUpDisplayLayer*>( | 1621 hud_layer_ = static_cast<HeadsUpDisplayLayer*>( |
1668 UpdateAndGetLayer(hud_layer_.get(), proto.hud_layer_id(), layer_id_map_)); | 1622 UpdateAndGetLayer(hud_layer_.get(), proto.hud_layer_id(), layer_tree)); |
1669 overscroll_elasticity_layer_ = | 1623 overscroll_elasticity_layer_ = |
1670 UpdateAndGetLayer(overscroll_elasticity_layer_.get(), | 1624 UpdateAndGetLayer(overscroll_elasticity_layer_.get(), |
1671 proto.overscroll_elasticity_layer_id(), layer_id_map_); | 1625 proto.overscroll_elasticity_layer_id(), layer_tree); |
1672 page_scale_layer_ = UpdateAndGetLayer( | 1626 page_scale_layer_ = UpdateAndGetLayer( |
1673 page_scale_layer_.get(), proto.page_scale_layer_id(), layer_id_map_); | 1627 page_scale_layer_.get(), proto.page_scale_layer_id(), layer_tree); |
1674 inner_viewport_scroll_layer_ = | 1628 inner_viewport_scroll_layer_ = |
1675 UpdateAndGetLayer(inner_viewport_scroll_layer_.get(), | 1629 UpdateAndGetLayer(inner_viewport_scroll_layer_.get(), |
1676 proto.inner_viewport_scroll_layer_id(), layer_id_map_); | 1630 proto.inner_viewport_scroll_layer_id(), layer_tree); |
1677 outer_viewport_scroll_layer_ = | 1631 outer_viewport_scroll_layer_ = |
1678 UpdateAndGetLayer(outer_viewport_scroll_layer_.get(), | 1632 UpdateAndGetLayer(outer_viewport_scroll_layer_.get(), |
1679 proto.outer_viewport_scroll_layer_id(), layer_id_map_); | 1633 proto.outer_viewport_scroll_layer_id(), layer_tree); |
1680 | 1634 |
1681 LayerSelectionFromProtobuf(&selection_, proto.selection()); | 1635 LayerSelectionFromProtobuf(&selection_, proto.selection()); |
1682 | 1636 |
1683 // It is required to create new PropertyTrees before deserializing it. | 1637 // It is required to create new PropertyTrees before deserializing it. |
1684 property_trees_ = PropertyTrees(); | 1638 property_trees_ = PropertyTrees(); |
1685 property_trees_.FromProtobuf(proto.property_trees()); | 1639 property_trees_.FromProtobuf(proto.property_trees()); |
1686 | 1640 |
1687 // Forcefully override the sequence number of all layers in the tree to have | 1641 // Forcefully override the sequence number of all layers in the tree to have |
1688 // a valid sequence number. Changing the sequence number for a layer does not | 1642 // a valid sequence number. Changing the sequence number for a layer does not |
1689 // need a commit, so the value will become out of date for layers that are not | 1643 // need a commit, so the value will become out of date for layers that are not |
1690 // updated for other reasons. All layers that at this point are part of the | 1644 // updated for other reasons. All layers that at this point are part of the |
1691 // layer tree are valid, so it is OK that they have a valid sequence number. | 1645 // layer tree are valid, so it is OK that they have a valid sequence number. |
1692 int seq_num = property_trees_.sequence_number; | 1646 int seq_num = property_trees_.sequence_number; |
1693 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) { | 1647 LayerTreeHostCommon::CallFunctionForEveryLayer(this, [seq_num](Layer* layer) { |
1694 layer->set_property_tree_sequence_number(seq_num); | 1648 layer->set_property_tree_sequence_number(seq_num); |
1695 }); | 1649 }); |
1696 | 1650 |
1697 surface_client_id_ = proto.surface_client_id(); | 1651 surface_client_id_ = proto.surface_client_id(); |
1698 next_surface_sequence_ = proto.next_surface_sequence(); | 1652 next_surface_sequence_ = proto.next_surface_sequence(); |
1699 } | 1653 } |
1700 | 1654 |
| 1655 AnimationHost* LayerTreeHost::animation_host() const { |
| 1656 return GetLayerTree()->animation_host(); |
| 1657 } |
| 1658 |
1701 } // namespace cc | 1659 } // namespace cc |
OLD | NEW |