Chromium Code Reviews| 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 <algorithm> | 7 #include <algorithm> |
| 8 #include <stack> | 8 #include <stack> |
| 9 #include <string> | 9 #include <string> |
| 10 | 10 |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 79 InitParams* params) { | 79 InitParams* params) { |
| 80 DCHECK(params->settings); | 80 DCHECK(params->settings); |
| 81 scoped_ptr<LayerTreeHost> layer_tree_host( | 81 scoped_ptr<LayerTreeHost> layer_tree_host( |
| 82 new LayerTreeHost(params, CompositorMode::SingleThreaded)); | 82 new LayerTreeHost(params, CompositorMode::SingleThreaded)); |
| 83 layer_tree_host->InitializeSingleThreaded( | 83 layer_tree_host->InitializeSingleThreaded( |
| 84 single_thread_client, params->main_task_runner, | 84 single_thread_client, params->main_task_runner, |
| 85 std::move(params->external_begin_frame_source)); | 85 std::move(params->external_begin_frame_source)); |
| 86 return layer_tree_host; | 86 return layer_tree_host; |
| 87 } | 87 } |
| 88 | 88 |
| 89 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateRemote( | |
| 90 RemoteProtoChannel* remote_proto_channel, | |
| 91 InitParams* params) { | |
| 92 DCHECK(params->main_task_runner.get()); | |
| 93 DCHECK(params->settings); | |
| 94 DCHECK(remote_proto_channel); | |
| 95 | |
| 96 // Using an external begin frame source is not supported in remote mode. | |
| 97 DCHECK(!params->settings->use_external_begin_frame_source); | |
| 98 DCHECK(!params->external_begin_frame_source); | |
| 99 | |
| 100 scoped_ptr<LayerTreeHost> layer_tree_host( | |
| 101 new LayerTreeHost(params, CompositorMode::Remote)); | |
| 102 layer_tree_host->InitializeRemote(remote_proto_channel, | |
| 103 params->main_task_runner); | |
| 104 return layer_tree_host; | |
| 105 } | |
| 106 | |
| 107 scoped_ptr<LayerTreeHost> LayerTreeHost::CreateDeserializable( | |
| 108 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, | |
| 109 InitParams* params) { | |
| 110 DCHECK(params->settings); | |
| 111 | |
| 112 scoped_ptr<LayerTreeHost> layer_tree_host( | |
| 113 new LayerTreeHost(params, CompositorMode::Deserializable)); | |
| 114 layer_tree_host->InitializeDeserializable(params->main_task_runner, | |
| 115 impl_task_runner); | |
| 116 return layer_tree_host; | |
| 117 } | |
| 118 | |
| 89 LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode) | 119 LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode) |
| 90 : micro_benchmark_controller_(this), | 120 : micro_benchmark_controller_(this), |
| 91 next_ui_resource_id_(1), | 121 next_ui_resource_id_(1), |
| 92 compositor_mode_(mode), | 122 compositor_mode_(mode), |
| 93 needs_full_tree_sync_(true), | 123 needs_full_tree_sync_(true), |
| 94 needs_meta_info_recomputation_(true), | 124 needs_meta_info_recomputation_(true), |
| 95 client_(params->client), | 125 client_(params->client), |
| 96 source_frame_number_(0), | 126 source_frame_number_(0), |
| 97 meta_information_sequence_number_(1), | 127 meta_information_sequence_number_(1), |
| 98 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), | 128 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 115 has_transparent_background_(false), | 145 has_transparent_background_(false), |
| 116 did_complete_scale_animation_(false), | 146 did_complete_scale_animation_(false), |
| 117 in_paint_layer_contents_(false), | 147 in_paint_layer_contents_(false), |
| 118 id_(s_layer_tree_host_sequence_number.GetNext() + 1), | 148 id_(s_layer_tree_host_sequence_number.GetNext() + 1), |
| 119 next_commit_forces_redraw_(false), | 149 next_commit_forces_redraw_(false), |
| 120 shared_bitmap_manager_(params->shared_bitmap_manager), | 150 shared_bitmap_manager_(params->shared_bitmap_manager), |
| 121 gpu_memory_buffer_manager_(params->gpu_memory_buffer_manager), | 151 gpu_memory_buffer_manager_(params->gpu_memory_buffer_manager), |
| 122 task_graph_runner_(params->task_graph_runner), | 152 task_graph_runner_(params->task_graph_runner), |
| 123 surface_id_namespace_(0u), | 153 surface_id_namespace_(0u), |
| 124 next_surface_sequence_(1u) { | 154 next_surface_sequence_(1u) { |
| 125 DCHECK(task_graph_runner_); | 155 if (compositor_mode_ != CompositorMode::Remote) |
| 156 DCHECK(task_graph_runner_); | |
| 126 | 157 |
| 127 if (settings_.accelerated_animation_enabled) { | 158 if (settings_.accelerated_animation_enabled) { |
| 128 if (settings_.use_compositor_animation_timelines) { | 159 if (settings_.use_compositor_animation_timelines) { |
| 129 animation_host_ = AnimationHost::Create(ThreadInstance::MAIN); | 160 animation_host_ = AnimationHost::Create(ThreadInstance::MAIN); |
| 130 animation_host_->SetMutatorHostClient(this); | 161 animation_host_->SetMutatorHostClient(this); |
| 131 } else { | 162 } else { |
| 132 animation_registrar_ = AnimationRegistrar::Create(); | 163 animation_registrar_ = AnimationRegistrar::Create(); |
| 133 } | 164 } |
| 134 } | 165 } |
| 135 | 166 |
| 136 rendering_stats_instrumentation_->set_record_rendering_stats( | 167 rendering_stats_instrumentation_->set_record_rendering_stats( |
| 137 debug_state_.RecordRenderingStats()); | 168 debug_state_.RecordRenderingStats()); |
| 138 } | 169 } |
| 139 | 170 |
| 140 void LayerTreeHost::InitializeThreaded( | 171 void LayerTreeHost::InitializeThreaded( |
| 141 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 172 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| 142 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, | 173 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, |
| 143 scoped_ptr<BeginFrameSource> external_begin_frame_source) { | 174 scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
| 144 task_runner_provider_ = | 175 task_runner_provider_ = |
| 145 TaskRunnerProvider::Create(main_task_runner, impl_task_runner); | 176 TaskRunnerProvider::Create(main_task_runner, impl_task_runner); |
| 146 scoped_ptr<ProxyMain> proxy_main = | 177 InitializeProxy( |
| 147 ProxyMain::CreateThreaded(this, task_runner_provider_.get(), | 178 ProxyMain::CreateThreaded(this, task_runner_provider_.get(), |
| 148 std::move(external_begin_frame_source)); | 179 std::move(external_begin_frame_source))); |
| 149 InitializeProxy(std::move(proxy_main)); | |
| 150 } | 180 } |
| 151 | 181 |
| 152 void LayerTreeHost::InitializeSingleThreaded( | 182 void LayerTreeHost::InitializeSingleThreaded( |
| 153 LayerTreeHostSingleThreadClient* single_thread_client, | 183 LayerTreeHostSingleThreadClient* single_thread_client, |
| 154 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 184 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| 155 scoped_ptr<BeginFrameSource> external_begin_frame_source) { | 185 scoped_ptr<BeginFrameSource> external_begin_frame_source) { |
| 156 task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr); | 186 task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr); |
| 157 InitializeProxy(SingleThreadProxy::Create( | 187 InitializeProxy(SingleThreadProxy::Create( |
| 158 this, single_thread_client, task_runner_provider_.get(), | 188 this, single_thread_client, task_runner_provider_.get(), |
| 159 std::move(external_begin_frame_source))); | 189 std::move(external_begin_frame_source))); |
| 160 } | 190 } |
| 161 | 191 |
| 192 void LayerTreeHost::InitializeRemote( | |
| 193 RemoteProtoChannel* remote_proto_channel, | |
| 194 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) { | |
| 195 task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr); | |
| 196 InitializeProxy(ProxyMain::CreateRemote(remote_proto_channel, this, | |
| 197 task_runner_provider_.get())); | |
| 198 } | |
| 199 | |
| 200 void LayerTreeHost::InitializeDeserializable( | |
| 201 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | |
| 202 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { | |
| 203 task_runner_provider_ = | |
| 204 TaskRunnerProvider::Create(main_task_runner, impl_task_runner); | |
| 205 } | |
| 206 | |
| 162 void LayerTreeHost::InitializeForTesting( | 207 void LayerTreeHost::InitializeForTesting( |
| 163 scoped_ptr<TaskRunnerProvider> task_runner_provider, | 208 scoped_ptr<TaskRunnerProvider> task_runner_provider, |
| 164 scoped_ptr<Proxy> proxy_for_testing) { | 209 scoped_ptr<Proxy> proxy_for_testing) { |
| 165 task_runner_provider_ = std::move(task_runner_provider); | 210 task_runner_provider_ = std::move(task_runner_provider); |
| 166 InitializeProxy(std::move(proxy_for_testing)); | 211 InitializeProxy(std::move(proxy_for_testing)); |
| 167 } | 212 } |
| 168 | 213 |
| 169 void LayerTreeHost::SetTaskRunnerProviderForTesting( | 214 void LayerTreeHost::SetTaskRunnerProviderForTesting( |
| 170 scoped_ptr<TaskRunnerProvider> task_runner_provider) { | 215 scoped_ptr<TaskRunnerProvider> task_runner_provider) { |
| 171 DCHECK(!task_runner_provider_); | 216 DCHECK(!task_runner_provider_); |
| 172 task_runner_provider_ = std::move(task_runner_provider); | 217 task_runner_provider_ = std::move(task_runner_provider); |
| 173 } | 218 } |
| 174 | 219 |
| 175 void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) { | 220 void LayerTreeHost::InitializeProxy(scoped_ptr<Proxy> proxy) { |
| 176 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); | 221 TRACE_EVENT0("cc", "LayerTreeHost::InitializeForReal"); |
| 222 DCHECK(task_runner_provider_); | |
| 177 | 223 |
| 178 proxy_ = std::move(proxy); | 224 proxy_ = std::move(proxy); |
| 179 proxy_->Start(); | 225 proxy_->Start(); |
| 180 if (settings_.accelerated_animation_enabled) { | 226 if (settings_.accelerated_animation_enabled) { |
| 181 if (animation_host_) | 227 if (animation_host_) |
| 182 animation_host_->SetSupportsScrollAnimations( | 228 animation_host_->SetSupportsScrollAnimations( |
| 183 proxy_->SupportsImplScrolling()); | 229 proxy_->SupportsImplScrolling()); |
| 184 else | 230 else |
| 185 animation_registrar_->set_supports_scroll_animations( | 231 animation_registrar_->set_supports_scroll_animations( |
| 186 proxy_->SupportsImplScrolling()); | 232 proxy_->SupportsImplScrolling()); |
| (...skipping 25 matching lines...) Expand all Loading... | |
| 212 RegisterViewportLayers(NULL, NULL, NULL, NULL); | 258 RegisterViewportLayers(NULL, NULL, NULL, NULL); |
| 213 | 259 |
| 214 if (root_layer_.get()) { | 260 if (root_layer_.get()) { |
| 215 // The layer tree must be destroyed before the layer tree host. We've | 261 // The layer tree must be destroyed before the layer tree host. We've |
| 216 // made a contract with our animation controllers that the registrar | 262 // made a contract with our animation controllers that the registrar |
| 217 // will outlive them, and we must make good. | 263 // will outlive them, and we must make good. |
| 218 root_layer_ = NULL; | 264 root_layer_ = NULL; |
| 219 } | 265 } |
| 220 } | 266 } |
| 221 | 267 |
| 268 void LayerTreeHost::ToProtobuf() { | |
|
David Trainor- moved to gerrit
2015/12/15 00:52:14
Add todo to implement?
Khushal
2015/12/15 05:05:30
Done.
| |
| 269 DCHECK(task_runner_provider_->IsMainThread()); | |
| 270 DCHECK(IsRemote()); | |
| 271 } | |
| 272 | |
| 273 void LayerTreeHost::FromProtobuf() { | |
| 274 DCHECK(task_runner_provider_->IsMainThread()); | |
| 275 DCHECK(IsDeserializable()); | |
| 276 } | |
| 277 | |
| 222 void LayerTreeHost::WillBeginMainFrame() { | 278 void LayerTreeHost::WillBeginMainFrame() { |
| 223 devtools_instrumentation::WillBeginMainThreadFrame(id(), | 279 devtools_instrumentation::WillBeginMainThreadFrame(id(), |
| 224 source_frame_number()); | 280 source_frame_number()); |
| 225 client_->WillBeginMainFrame(); | 281 client_->WillBeginMainFrame(); |
| 226 } | 282 } |
| 227 | 283 |
| 228 void LayerTreeHost::DidBeginMainFrame() { | 284 void LayerTreeHost::DidBeginMainFrame() { |
| 229 client_->DidBeginMainFrame(); | 285 client_->DidBeginMainFrame(); |
| 230 } | 286 } |
| 231 | 287 |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 244 void LayerTreeHost::RequestMainFrameUpdate() { | 300 void LayerTreeHost::RequestMainFrameUpdate() { |
| 245 client_->UpdateLayerTreeHost(); | 301 client_->UpdateLayerTreeHost(); |
| 246 } | 302 } |
| 247 | 303 |
| 248 // This function commits the LayerTreeHost to an impl tree. When modifying | 304 // This function commits the LayerTreeHost to an impl tree. When modifying |
| 249 // this function, keep in mind that the function *runs* on the impl thread! Any | 305 // this function, keep in mind that the function *runs* on the impl thread! Any |
| 250 // code that is logically a main thread operation, e.g. deletion of a Layer, | 306 // code that is logically a main thread operation, e.g. deletion of a Layer, |
| 251 // should be delayed until the LayerTreeHost::CommitComplete, which will run | 307 // should be delayed until the LayerTreeHost::CommitComplete, which will run |
| 252 // after the commit, but on the main thread. | 308 // after the commit, but on the main thread. |
| 253 void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) { | 309 void LayerTreeHost::FinishCommitOnImplThread(LayerTreeHostImpl* host_impl) { |
| 310 DCHECK(!IsRemote()); | |
| 254 DCHECK(task_runner_provider_->IsImplThread()); | 311 DCHECK(task_runner_provider_->IsImplThread()); |
| 255 | 312 |
| 256 bool is_new_trace; | 313 bool is_new_trace; |
| 257 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); | 314 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); |
| 258 if (is_new_trace && | 315 if (is_new_trace && |
| 259 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() && | 316 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() && |
| 260 root_layer()) { | 317 root_layer()) { |
| 261 LayerTreeHostCommon::CallFunctionForSubtree( | 318 LayerTreeHostCommon::CallFunctionForSubtree( |
| 262 root_layer(), [](Layer* layer) { layer->DidBeginTracing(); }); | 319 root_layer(), [](Layer* layer) { layer->DidBeginTracing(); }); |
| 263 } | 320 } |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 429 // Note: It is safe to drop all output surface references here as | 486 // Note: It is safe to drop all output surface references here as |
| 430 // LayerTreeHostImpl will not keep a pointer to either the old or | 487 // LayerTreeHostImpl will not keep a pointer to either the old or |
| 431 // new output surface after failing to initialize the new one. | 488 // new output surface after failing to initialize the new one. |
| 432 current_output_surface_ = nullptr; | 489 current_output_surface_ = nullptr; |
| 433 new_output_surface_ = nullptr; | 490 new_output_surface_ = nullptr; |
| 434 client_->DidFailToInitializeOutputSurface(); | 491 client_->DidFailToInitializeOutputSurface(); |
| 435 } | 492 } |
| 436 | 493 |
| 437 scoped_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl( | 494 scoped_ptr<LayerTreeHostImpl> LayerTreeHost::CreateLayerTreeHostImpl( |
| 438 LayerTreeHostImplClient* client) { | 495 LayerTreeHostImplClient* client) { |
| 496 DCHECK(!IsRemote()); | |
| 439 DCHECK(task_runner_provider_->IsImplThread()); | 497 DCHECK(task_runner_provider_->IsImplThread()); |
| 440 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( | 498 scoped_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( |
| 441 settings_, client, task_runner_provider_.get(), | 499 settings_, client, task_runner_provider_.get(), |
| 442 rendering_stats_instrumentation_.get(), shared_bitmap_manager_, | 500 rendering_stats_instrumentation_.get(), shared_bitmap_manager_, |
| 443 gpu_memory_buffer_manager_, task_graph_runner_, id_); | 501 gpu_memory_buffer_manager_, task_graph_runner_, id_); |
| 444 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); | 502 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); |
| 445 host_impl->SetContentIsSuitableForGpuRasterization( | 503 host_impl->SetContentIsSuitableForGpuRasterization( |
| 446 content_is_suitable_for_gpu_rasterization_); | 504 content_is_suitable_for_gpu_rasterization_); |
| 447 shared_bitmap_manager_ = NULL; | 505 shared_bitmap_manager_ = NULL; |
| 448 gpu_memory_buffer_manager_ = NULL; | 506 gpu_memory_buffer_manager_ = NULL; |
| (...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 898 if (painted_device_scale_factor == painted_device_scale_factor_) | 956 if (painted_device_scale_factor == painted_device_scale_factor_) |
| 899 return; | 957 return; |
| 900 painted_device_scale_factor_ = painted_device_scale_factor; | 958 painted_device_scale_factor_ = painted_device_scale_factor; |
| 901 | 959 |
| 902 SetNeedsCommit(); | 960 SetNeedsCommit(); |
| 903 } | 961 } |
| 904 | 962 |
| 905 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints, | 963 void LayerTreeHost::UpdateTopControlsState(TopControlsState constraints, |
| 906 TopControlsState current, | 964 TopControlsState current, |
| 907 bool animate) { | 965 bool animate) { |
| 908 // Top controls are only used in threaded mode. | 966 // Top controls are only used in threaded or remote mode. |
| 909 DCHECK(IsThreaded()); | 967 DCHECK(IsThreaded() || IsRemote()); |
| 910 proxy_->UpdateTopControlsState(constraints, current, animate); | 968 proxy_->UpdateTopControlsState(constraints, current, animate); |
| 911 } | 969 } |
| 912 | 970 |
| 913 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { | 971 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { |
| 914 if (!settings_.accelerated_animation_enabled) | 972 if (!settings_.accelerated_animation_enabled) |
| 915 return; | 973 return; |
| 916 | 974 |
| 917 AnimationEventsVector events; | 975 AnimationEventsVector events; |
| 918 if (animation_host_) { | 976 if (animation_host_) { |
| 919 if (animation_host_->AnimateLayers(monotonic_time)) | 977 if (animation_host_->AnimateLayers(monotonic_time)) |
| (...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1262 !task_runner_provider_->HasImplThread()); | 1320 !task_runner_provider_->HasImplThread()); |
| 1263 return compositor_mode_ == CompositorMode::SingleThreaded; | 1321 return compositor_mode_ == CompositorMode::SingleThreaded; |
| 1264 } | 1322 } |
| 1265 | 1323 |
| 1266 bool LayerTreeHost::IsThreaded() const { | 1324 bool LayerTreeHost::IsThreaded() const { |
| 1267 DCHECK(compositor_mode_ != CompositorMode::Threaded || | 1325 DCHECK(compositor_mode_ != CompositorMode::Threaded || |
| 1268 task_runner_provider_->HasImplThread()); | 1326 task_runner_provider_->HasImplThread()); |
| 1269 return compositor_mode_ == CompositorMode::Threaded; | 1327 return compositor_mode_ == CompositorMode::Threaded; |
| 1270 } | 1328 } |
| 1271 | 1329 |
| 1330 bool LayerTreeHost::IsRemote() const { | |
| 1331 DCHECK(compositor_mode_ != CompositorMode::Remote || | |
| 1332 !task_runner_provider_->HasImplThread()); | |
| 1333 return compositor_mode_ == CompositorMode::Remote; | |
| 1334 } | |
| 1335 | |
| 1336 bool LayerTreeHost::IsDeserializable() const { | |
| 1337 DCHECK(compositor_mode_ != CompositorMode::Deserializable || | |
| 1338 task_runner_provider_->HasImplThread()); | |
| 1339 return compositor_mode_ == CompositorMode::Deserializable; | |
| 1340 } | |
| 1341 | |
| 1272 } // namespace cc | 1342 } // namespace cc |
| OLD | NEW |