| 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" |
| 17 #include "base/bind.h" | 18 #include "base/bind.h" |
| 18 #include "base/command_line.h" | 19 #include "base/command_line.h" |
| 19 #include "base/location.h" | 20 #include "base/location.h" |
| 20 #include "base/memory/ptr_util.h" | 21 #include "base/memory/ptr_util.h" |
| 21 #include "base/metrics/histogram_macros.h" | 22 #include "base/metrics/histogram_macros.h" |
| 22 #include "base/numerics/safe_math.h" | 23 #include "base/numerics/safe_math.h" |
| 23 #include "base/single_thread_task_runner.h" | 24 #include "base/single_thread_task_runner.h" |
| 24 #include "base/stl_util.h" | 25 #include "base/stl_util.h" |
| 25 #include "base/strings/string_number_conversions.h" | 26 #include "base/strings/string_number_conversions.h" |
| 26 #include "base/strings/stringprintf.h" | 27 #include "base/strings/stringprintf.h" |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 LayerTreeHostSingleThreadClient* single_thread_client, | 84 LayerTreeHostSingleThreadClient* single_thread_client, |
| 84 InitParams* params) { | 85 InitParams* params) { |
| 85 DCHECK(params->settings); | 86 DCHECK(params->settings); |
| 86 std::unique_ptr<LayerTreeHost> layer_tree_host( | 87 std::unique_ptr<LayerTreeHost> layer_tree_host( |
| 87 new LayerTreeHost(params, CompositorMode::SINGLE_THREADED)); | 88 new LayerTreeHost(params, CompositorMode::SINGLE_THREADED)); |
| 88 layer_tree_host->InitializeSingleThreaded(single_thread_client, | 89 layer_tree_host->InitializeSingleThreaded(single_thread_client, |
| 89 params->main_task_runner); | 90 params->main_task_runner); |
| 90 return layer_tree_host; | 91 return layer_tree_host; |
| 91 } | 92 } |
| 92 | 93 |
| 93 LayerTreeHost::LayerTreeHost(InitParams* params, | 94 LayerTreeHost::LayerTreeHost(InitParams* params, CompositorMode mode) |
| 94 CompositorMode mode) | |
| 95 : LayerTreeHost( | |
| 96 params, | |
| 97 mode, | |
| 98 base::MakeUnique<LayerTree>(params->mutator_host, this)) {} | |
| 99 | |
| 100 LayerTreeHost::LayerTreeHost( | |
| 101 InitParams* params, | |
| 102 CompositorMode mode, | |
| 103 std::unique_ptr<LayerTree> layer_tree) | |
| 104 : micro_benchmark_controller_(this), | 95 : micro_benchmark_controller_(this), |
| 105 layer_tree_(std::move(layer_tree)), | |
| 106 compositor_mode_(mode), | 96 compositor_mode_(mode), |
| 107 ui_resource_manager_(base::MakeUnique<UIResourceManager>()), | 97 ui_resource_manager_(base::MakeUnique<UIResourceManager>()), |
| 108 client_(params->client), | 98 client_(params->client), |
| 109 source_frame_number_(0), | |
| 110 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), | 99 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()), |
| 111 settings_(*params->settings), | 100 settings_(*params->settings), |
| 112 debug_state_(settings_.initial_debug_state), | 101 debug_state_(settings_.initial_debug_state), |
| 113 visible_(false), | |
| 114 has_gpu_rasterization_trigger_(false), | |
| 115 content_is_suitable_for_gpu_rasterization_(true), | |
| 116 gpu_rasterization_histogram_recorded_(false), | |
| 117 did_complete_scale_animation_(false), | |
| 118 id_(s_layer_tree_host_sequence_number.GetNext() + 1), | 102 id_(s_layer_tree_host_sequence_number.GetNext() + 1), |
| 119 task_graph_runner_(params->task_graph_runner), | 103 task_graph_runner_(params->task_graph_runner), |
| 104 event_listener_properties_(), |
| 105 mutator_host_(params->mutator_host), |
| 120 image_worker_task_runner_(params->image_worker_task_runner) { | 106 image_worker_task_runner_(params->image_worker_task_runner) { |
| 121 DCHECK(task_graph_runner_); | 107 DCHECK(task_graph_runner_); |
| 122 DCHECK(layer_tree_); | 108 |
| 109 mutator_host_->SetMutatorHostClient(this); |
| 123 | 110 |
| 124 rendering_stats_instrumentation_->set_record_rendering_stats( | 111 rendering_stats_instrumentation_->set_record_rendering_stats( |
| 125 debug_state_.RecordRenderingStats()); | 112 debug_state_.RecordRenderingStats()); |
| 126 } | 113 } |
| 127 | 114 |
| 128 void LayerTreeHost::InitializeThreaded( | 115 void LayerTreeHost::InitializeThreaded( |
| 129 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | 116 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| 130 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { | 117 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) { |
| 131 task_runner_provider_ = | 118 task_runner_provider_ = |
| 132 TaskRunnerProvider::Create(main_task_runner, impl_task_runner); | 119 TaskRunnerProvider::Create(main_task_runner, impl_task_runner); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 161 ui_resource_manager_ = std::move(ui_resource_manager); | 148 ui_resource_manager_ = std::move(ui_resource_manager); |
| 162 } | 149 } |
| 163 | 150 |
| 164 void LayerTreeHost::InitializeProxy(std::unique_ptr<Proxy> proxy) { | 151 void LayerTreeHost::InitializeProxy(std::unique_ptr<Proxy> proxy) { |
| 165 TRACE_EVENT0("cc", "LayerTreeHostInProcess::InitializeForReal"); | 152 TRACE_EVENT0("cc", "LayerTreeHostInProcess::InitializeForReal"); |
| 166 DCHECK(task_runner_provider_); | 153 DCHECK(task_runner_provider_); |
| 167 | 154 |
| 168 proxy_ = std::move(proxy); | 155 proxy_ = std::move(proxy); |
| 169 proxy_->Start(); | 156 proxy_->Start(); |
| 170 | 157 |
| 171 layer_tree_->mutator_host()->SetSupportsScrollAnimations( | 158 mutator_host_->SetSupportsScrollAnimations(proxy_->SupportsImplScrolling()); |
| 172 proxy_->SupportsImplScrolling()); | |
| 173 } | 159 } |
| 174 | 160 |
| 175 LayerTreeHost::~LayerTreeHost() { | 161 LayerTreeHost::~LayerTreeHost() { |
| 176 // Track when we're inside a main frame to see if compositor is being | 162 // Track when we're inside a main frame to see if compositor is being |
| 177 // destroyed midway which causes a crash. crbug.com/654672 | 163 // destroyed midway which causes a crash. crbug.com/654672 |
| 178 CHECK(!inside_main_frame_); | 164 CHECK(!inside_main_frame_); |
| 179 TRACE_EVENT0("cc", "LayerTreeHostInProcess::~LayerTreeHostInProcess"); | 165 TRACE_EVENT0("cc", "LayerTreeHostInProcess::~LayerTreeHostInProcess"); |
| 180 | 166 |
| 181 // Clear any references into the LayerTreeHostInProcess. | 167 // Clear any references into the LayerTreeHost. |
| 182 layer_tree_.reset(); | 168 mutator_host_->SetMutatorHostClient(nullptr); |
| 169 |
| 170 // We must clear any pointers into the layer tree prior to destroying it. |
| 171 RegisterViewportLayers(nullptr, nullptr, nullptr, nullptr); |
| 172 |
| 173 if (root_layer_) { |
| 174 root_layer_->SetLayerTreeHost(nullptr); |
| 175 |
| 176 // The root layer must be destroyed before the layer tree. We've made a |
| 177 // contract with our animation controllers that the animation_host will |
| 178 // outlive them, and we must make good. |
| 179 root_layer_ = nullptr; |
| 180 } |
| 183 | 181 |
| 184 if (proxy_) { | 182 if (proxy_) { |
| 185 DCHECK(task_runner_provider_->IsMainThread()); | 183 DCHECK(task_runner_provider_->IsMainThread()); |
| 186 proxy_->Stop(); | 184 proxy_->Stop(); |
| 187 | 185 |
| 188 // Proxy must be destroyed before the Task Runner Provider. | 186 // Proxy must be destroyed before the Task Runner Provider. |
| 189 proxy_ = nullptr; | 187 proxy_ = nullptr; |
| 190 } | 188 } |
| 191 } | 189 } |
| 192 | 190 |
| 193 int LayerTreeHost::GetId() const { | 191 int LayerTreeHost::GetId() const { |
| 194 return id_; | 192 return id_; |
| 195 } | 193 } |
| 196 | 194 |
| 197 int LayerTreeHost::SourceFrameNumber() const { | 195 int LayerTreeHost::SourceFrameNumber() const { |
| 198 return source_frame_number_; | 196 return source_frame_number_; |
| 199 } | 197 } |
| 200 | 198 |
| 201 LayerTree* LayerTreeHost::GetLayerTree() { | |
| 202 return layer_tree_.get(); | |
| 203 } | |
| 204 | |
| 205 const LayerTree* LayerTreeHost::GetLayerTree() const { | |
| 206 return layer_tree_.get(); | |
| 207 } | |
| 208 | |
| 209 UIResourceManager* LayerTreeHost::GetUIResourceManager() const { | 199 UIResourceManager* LayerTreeHost::GetUIResourceManager() const { |
| 210 return ui_resource_manager_.get(); | 200 return ui_resource_manager_.get(); |
| 211 } | 201 } |
| 212 | 202 |
| 213 TaskRunnerProvider* LayerTreeHost::GetTaskRunnerProvider() const { | 203 TaskRunnerProvider* LayerTreeHost::GetTaskRunnerProvider() const { |
| 214 return task_runner_provider_.get(); | 204 return task_runner_provider_.get(); |
| 215 } | 205 } |
| 216 | 206 |
| 217 SwapPromiseManager* LayerTreeHost::GetSwapPromiseManager() { | 207 SwapPromiseManager* LayerTreeHost::GetSwapPromiseManager() { |
| 218 return &swap_promise_manager_; | 208 return &swap_promise_manager_; |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 // should be delayed until the LayerTreeHostInProcess::CommitComplete, which | 264 // should be delayed until the LayerTreeHostInProcess::CommitComplete, which |
| 275 // will run after the commit, but on the main thread. | 265 // will run after the commit, but on the main thread. |
| 276 void LayerTreeHost::FinishCommitOnImplThread( | 266 void LayerTreeHost::FinishCommitOnImplThread( |
| 277 LayerTreeHostImpl* host_impl) { | 267 LayerTreeHostImpl* host_impl) { |
| 278 DCHECK(task_runner_provider_->IsImplThread()); | 268 DCHECK(task_runner_provider_->IsImplThread()); |
| 279 | 269 |
| 280 bool is_new_trace; | 270 bool is_new_trace; |
| 281 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); | 271 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace); |
| 282 if (is_new_trace && | 272 if (is_new_trace && |
| 283 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() && | 273 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() && |
| 284 layer_tree_->root_layer()) { | 274 root_layer()) { |
| 285 LayerTreeHostCommon::CallFunctionForEveryLayer( | 275 LayerTreeHostCommon::CallFunctionForEveryLayer( |
| 286 layer_tree_.get(), [](Layer* layer) { layer->DidBeginTracing(); }); | 276 this, [](Layer* layer) { layer->DidBeginTracing(); }); |
| 287 } | 277 } |
| 288 | 278 |
| 289 LayerTreeImpl* sync_tree = host_impl->sync_tree(); | 279 LayerTreeImpl* sync_tree = host_impl->sync_tree(); |
| 290 | 280 |
| 291 if (next_commit_forces_redraw_) { | 281 if (next_commit_forces_redraw_) { |
| 292 sync_tree->ForceRedrawNextActivation(); | 282 sync_tree->ForceRedrawNextActivation(); |
| 293 next_commit_forces_redraw_ = false; | 283 next_commit_forces_redraw_ = false; |
| 294 } | 284 } |
| 295 if (next_commit_forces_recalculate_raster_scales_) { | 285 if (next_commit_forces_recalculate_raster_scales_) { |
| 296 sync_tree->ForceRecalculateRasterScales(); | 286 sync_tree->ForceRecalculateRasterScales(); |
| 297 next_commit_forces_recalculate_raster_scales_ = false; | 287 next_commit_forces_recalculate_raster_scales_ = false; |
| 298 } | 288 } |
| 299 | 289 |
| 300 sync_tree->set_source_frame_number(SourceFrameNumber()); | 290 sync_tree->set_source_frame_number(SourceFrameNumber()); |
| 301 | 291 |
| 302 if (layer_tree_->needs_full_tree_sync()) | 292 if (needs_full_tree_sync_) |
| 303 TreeSynchronizer::SynchronizeTrees(layer_tree_->root_layer(), sync_tree); | 293 TreeSynchronizer::SynchronizeTrees(root_layer(), sync_tree); |
| 304 | 294 |
| 305 layer_tree_->PushPropertiesTo(sync_tree); | 295 PushPropertiesTo(sync_tree); |
| 306 | 296 |
| 307 sync_tree->PassSwapPromises(swap_promise_manager_.TakeSwapPromises()); | 297 sync_tree->PassSwapPromises(swap_promise_manager_.TakeSwapPromises()); |
| 308 | 298 |
| 309 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); | 299 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); |
| 310 host_impl->SetContentIsSuitableForGpuRasterization( | 300 host_impl->SetContentIsSuitableForGpuRasterization( |
| 311 content_is_suitable_for_gpu_rasterization_); | 301 content_is_suitable_for_gpu_rasterization_); |
| 312 RecordGpuRasterizationHistogram(); | 302 RecordGpuRasterizationHistogram(); |
| 313 | 303 |
| 314 host_impl->SetViewportSize(layer_tree_->device_viewport_size()); | 304 host_impl->SetViewportSize(device_viewport_size_); |
| 315 sync_tree->SetDeviceScaleFactor(layer_tree_->device_scale_factor()); | 305 sync_tree->SetDeviceScaleFactor(device_scale_factor_); |
| 316 host_impl->SetDebugState(debug_state_); | 306 host_impl->SetDebugState(debug_state_); |
| 317 | 307 |
| 318 sync_tree->set_ui_resource_request_queue( | 308 sync_tree->set_ui_resource_request_queue( |
| 319 ui_resource_manager_->TakeUIResourcesRequests()); | 309 ui_resource_manager_->TakeUIResourcesRequests()); |
| 320 | 310 |
| 321 { | 311 { |
| 322 TRACE_EVENT0("cc", "LayerTreeHostInProcess::PushProperties"); | 312 TRACE_EVENT0("cc", "LayerTreeHostInProcess::PushProperties"); |
| 323 | 313 |
| 324 TreeSynchronizer::PushLayerProperties(layer_tree_.get(), sync_tree); | 314 TreeSynchronizer::PushLayerProperties(this, sync_tree); |
| 325 | 315 |
| 326 // This must happen after synchronizing property trees and after pushing | 316 // This must happen after synchronizing property trees and after pushing |
| 327 // properties, which updates the clobber_active_value flag. | 317 // properties, which updates the clobber_active_value flag. |
| 328 sync_tree->property_trees()->scroll_tree.PushScrollUpdatesFromMainThread( | 318 sync_tree->property_trees()->scroll_tree.PushScrollUpdatesFromMainThread( |
| 329 layer_tree_->property_trees(), sync_tree); | 319 property_trees(), sync_tree); |
| 330 | 320 |
| 331 // This must happen after synchronizing property trees and after push | 321 // This must happen after synchronizing property trees and after push |
| 332 // properties, which updates property tree indices, but before animation | 322 // properties, which updates property tree indices, but before animation |
| 333 // host pushes properties as animation host push properties can change | 323 // host pushes properties as animation host push properties can change |
| 334 // Animation::InEffect and we want the old InEffect value for updating | 324 // Animation::InEffect and we want the old InEffect value for updating |
| 335 // property tree scrolling and animation. | 325 // property tree scrolling and animation. |
| 336 sync_tree->UpdatePropertyTreeScrollingAndAnimationFromMainThread(); | 326 sync_tree->UpdatePropertyTreeScrollingAndAnimationFromMainThread(); |
| 337 | 327 |
| 338 TRACE_EVENT0("cc", "LayerTreeHostInProcess::AnimationHost::PushProperties"); | 328 TRACE_EVENT0("cc", "LayerTreeHostInProcess::AnimationHost::PushProperties"); |
| 339 DCHECK(host_impl->mutator_host()); | 329 DCHECK(host_impl->mutator_host()); |
| 340 layer_tree_->mutator_host()->PushPropertiesTo(host_impl->mutator_host()); | 330 mutator_host_->PushPropertiesTo(host_impl->mutator_host()); |
| 341 } | 331 } |
| 342 | 332 |
| 343 micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl); | 333 micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl); |
| 344 layer_tree_->property_trees()->ResetAllChangeTracking(); | 334 property_trees_.ResetAllChangeTracking(); |
| 345 } | 335 } |
| 346 | 336 |
| 347 void LayerTreeHost::WillCommit() { | 337 void LayerTreeHost::WillCommit() { |
| 348 swap_promise_manager_.WillCommit(); | 338 swap_promise_manager_.WillCommit(); |
| 349 client_->WillCommit(); | 339 client_->WillCommit(); |
| 350 } | 340 } |
| 351 | 341 |
| 352 void LayerTreeHost::UpdateHudLayer() {} | 342 void LayerTreeHost::UpdateHudLayer() {} |
| 353 | 343 |
| 354 void LayerTreeHost::CommitComplete() { | 344 void LayerTreeHost::CommitComplete() { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 client_->DidFailToInitializeCompositorFrameSink(); | 389 client_->DidFailToInitializeCompositorFrameSink(); |
| 400 } | 390 } |
| 401 | 391 |
| 402 std::unique_ptr<LayerTreeHostImpl> | 392 std::unique_ptr<LayerTreeHostImpl> |
| 403 LayerTreeHost::CreateLayerTreeHostImpl( | 393 LayerTreeHost::CreateLayerTreeHostImpl( |
| 404 LayerTreeHostImplClient* client) { | 394 LayerTreeHostImplClient* client) { |
| 405 DCHECK(task_runner_provider_->IsImplThread()); | 395 DCHECK(task_runner_provider_->IsImplThread()); |
| 406 | 396 |
| 407 const bool supports_impl_scrolling = task_runner_provider_->HasImplThread(); | 397 const bool supports_impl_scrolling = task_runner_provider_->HasImplThread(); |
| 408 std::unique_ptr<MutatorHost> mutator_host_impl = | 398 std::unique_ptr<MutatorHost> mutator_host_impl = |
| 409 layer_tree_->mutator_host()->CreateImplInstance(supports_impl_scrolling); | 399 mutator_host_->CreateImplInstance(supports_impl_scrolling); |
| 410 | 400 |
| 411 std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( | 401 std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create( |
| 412 settings_, client, task_runner_provider_.get(), | 402 settings_, client, task_runner_provider_.get(), |
| 413 rendering_stats_instrumentation_.get(), task_graph_runner_, | 403 rendering_stats_instrumentation_.get(), task_graph_runner_, |
| 414 std::move(mutator_host_impl), id_, std::move(image_worker_task_runner_)); | 404 std::move(mutator_host_impl), id_, std::move(image_worker_task_runner_)); |
| 415 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); | 405 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_); |
| 416 host_impl->SetContentIsSuitableForGpuRasterization( | 406 host_impl->SetContentIsSuitableForGpuRasterization( |
| 417 content_is_suitable_for_gpu_rasterization_); | 407 content_is_suitable_for_gpu_rasterization_); |
| 418 task_graph_runner_ = NULL; | 408 task_graph_runner_ = NULL; |
| 419 input_handler_weak_ptr_ = host_impl->AsWeakPtr(); | 409 input_handler_weak_ptr_ = host_impl->AsWeakPtr(); |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 } | 455 } |
| 466 | 456 |
| 467 void LayerTreeHost::SetNextCommitForcesRedraw() { | 457 void LayerTreeHost::SetNextCommitForcesRedraw() { |
| 468 next_commit_forces_redraw_ = true; | 458 next_commit_forces_redraw_ = true; |
| 469 proxy_->SetNeedsUpdateLayers(); | 459 proxy_->SetNeedsUpdateLayers(); |
| 470 } | 460 } |
| 471 | 461 |
| 472 void LayerTreeHost::SetAnimationEvents( | 462 void LayerTreeHost::SetAnimationEvents( |
| 473 std::unique_ptr<MutatorEvents> events) { | 463 std::unique_ptr<MutatorEvents> events) { |
| 474 DCHECK(task_runner_provider_->IsMainThread()); | 464 DCHECK(task_runner_provider_->IsMainThread()); |
| 475 layer_tree_->mutator_host()->SetAnimationEvents(std::move(events)); | 465 mutator_host_->SetAnimationEvents(std::move(events)); |
| 476 } | 466 } |
| 477 | 467 |
| 478 void LayerTreeHost::SetDebugState( | 468 void LayerTreeHost::SetDebugState( |
| 479 const LayerTreeDebugState& debug_state) { | 469 const LayerTreeDebugState& debug_state) { |
| 480 LayerTreeDebugState new_debug_state = | 470 LayerTreeDebugState new_debug_state = |
| 481 LayerTreeDebugState::Unite(settings_.initial_debug_state, debug_state); | 471 LayerTreeDebugState::Unite(settings_.initial_debug_state, debug_state); |
| 482 | 472 |
| 483 if (LayerTreeDebugState::Equal(debug_state_, new_debug_state)) | 473 if (LayerTreeDebugState::Equal(debug_state_, new_debug_state)) |
| 484 return; | 474 return; |
| 485 | 475 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 504 TRACE_EVENT_INSTANT1( | 494 TRACE_EVENT_INSTANT1( |
| 505 "cc", "LayerTreeHostInProcess::SetHasGpuRasterizationTrigger", | 495 "cc", "LayerTreeHostInProcess::SetHasGpuRasterizationTrigger", |
| 506 TRACE_EVENT_SCOPE_THREAD, "has_trigger", has_gpu_rasterization_trigger_); | 496 TRACE_EVENT_SCOPE_THREAD, "has_trigger", has_gpu_rasterization_trigger_); |
| 507 } | 497 } |
| 508 | 498 |
| 509 void LayerTreeHost::ApplyPageScaleDeltaFromImplSide( | 499 void LayerTreeHost::ApplyPageScaleDeltaFromImplSide( |
| 510 float page_scale_delta) { | 500 float page_scale_delta) { |
| 511 DCHECK(CommitRequested()); | 501 DCHECK(CommitRequested()); |
| 512 if (page_scale_delta == 1.f) | 502 if (page_scale_delta == 1.f) |
| 513 return; | 503 return; |
| 514 float page_scale = layer_tree_->page_scale_factor() * page_scale_delta; | 504 float page_scale = page_scale_factor_ * page_scale_delta; |
| 515 layer_tree_->SetPageScaleFromImplSide(page_scale); | 505 SetPageScaleFromImplSide(page_scale); |
| 516 } | 506 } |
| 517 | 507 |
| 518 void LayerTreeHost::SetVisible(bool visible) { | 508 void LayerTreeHost::SetVisible(bool visible) { |
| 519 if (visible_ == visible) | 509 if (visible_ == visible) |
| 520 return; | 510 return; |
| 521 visible_ = visible; | 511 visible_ = visible; |
| 522 proxy_->SetVisible(visible); | 512 proxy_->SetVisible(visible); |
| 523 } | 513 } |
| 524 | 514 |
| 525 bool LayerTreeHost::IsVisible() const { | 515 bool LayerTreeHost::IsVisible() const { |
| (...skipping 29 matching lines...) Expand all Loading... |
| 555 if (numLayers < 30) | 545 if (numLayers < 30) |
| 556 return 1; | 546 return 1; |
| 557 if (numLayers < 70) | 547 if (numLayers < 70) |
| 558 return 2; | 548 return 2; |
| 559 if (numLayers < 150) | 549 if (numLayers < 150) |
| 560 return 3; | 550 return 3; |
| 561 return 4; | 551 return 4; |
| 562 } | 552 } |
| 563 | 553 |
| 564 bool LayerTreeHost::UpdateLayers() { | 554 bool LayerTreeHost::UpdateLayers() { |
| 565 if (!layer_tree_->root_layer()) { | 555 if (!root_layer()) { |
| 566 layer_tree_->property_trees()->clear(); | 556 property_trees_.clear(); |
| 567 return false; | 557 return false; |
| 568 } | 558 } |
| 569 DCHECK(!layer_tree_->root_layer()->parent()); | 559 DCHECK(!root_layer()->parent()); |
| 570 base::ElapsedTimer timer; | 560 base::ElapsedTimer timer; |
| 571 | 561 |
| 572 bool result = DoUpdateLayers(layer_tree_->root_layer()); | 562 bool result = DoUpdateLayers(root_layer()); |
| 573 micro_benchmark_controller_.DidUpdateLayers(); | 563 micro_benchmark_controller_.DidUpdateLayers(); |
| 574 | 564 |
| 575 if (const char* client_name = GetClientNameForMetrics()) { | 565 if (const char* client_name = GetClientNameForMetrics()) { |
| 576 std::string histogram_name = base::StringPrintf( | 566 std::string histogram_name = |
| 577 "Compositing.%s.LayersUpdateTime.%d", client_name, | 567 base::StringPrintf("Compositing.%s.LayersUpdateTime.%d", client_name, |
| 578 GetLayersUpdateTimeHistogramBucket(layer_tree_->NumLayers())); | 568 GetLayersUpdateTimeHistogramBucket(NumLayers())); |
| 579 base::Histogram::FactoryGet(histogram_name, 0, 10000000, 50, | 569 base::Histogram::FactoryGet(histogram_name, 0, 10000000, 50, |
| 580 base::HistogramBase::kUmaTargetedHistogramFlag) | 570 base::HistogramBase::kUmaTargetedHistogramFlag) |
| 581 ->Add(timer.Elapsed().InMicroseconds()); | 571 ->Add(timer.Elapsed().InMicroseconds()); |
| 582 } | 572 } |
| 583 | 573 |
| 584 return result || next_commit_forces_redraw_; | 574 return result || next_commit_forces_redraw_; |
| 585 } | 575 } |
| 586 | 576 |
| 587 void LayerTreeHost::DidCompletePageScaleAnimation() { | 577 void LayerTreeHost::DidCompletePageScaleAnimation() { |
| 588 did_complete_scale_animation_ = true; | 578 did_complete_scale_animation_ = true; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 611 content_is_suitable_for_gpu_rasterization_)); | 601 content_is_suitable_for_gpu_rasterization_)); |
| 612 } | 602 } |
| 613 | 603 |
| 614 gpu_rasterization_histogram_recorded_ = true; | 604 gpu_rasterization_histogram_recorded_ = true; |
| 615 } | 605 } |
| 616 | 606 |
| 617 bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) { | 607 bool LayerTreeHost::DoUpdateLayers(Layer* root_layer) { |
| 618 TRACE_EVENT1("cc", "LayerTreeHostInProcess::DoUpdateLayers", | 608 TRACE_EVENT1("cc", "LayerTreeHostInProcess::DoUpdateLayers", |
| 619 "source_frame_number", SourceFrameNumber()); | 609 "source_frame_number", SourceFrameNumber()); |
| 620 | 610 |
| 621 layer_tree_->UpdateHudLayer(debug_state_.ShowHudInfo()); | 611 UpdateHudLayer(debug_state_.ShowHudInfo()); |
| 622 UpdateHudLayer(); | 612 UpdateHudLayer(); |
| 623 | 613 |
| 624 Layer* root_scroll = | 614 Layer* root_scroll = |
| 625 PropertyTreeBuilder::FindFirstScrollableLayer(root_layer); | 615 PropertyTreeBuilder::FindFirstScrollableLayer(root_layer); |
| 626 Layer* page_scale_layer = layer_tree_->page_scale_layer(); | 616 Layer* page_scale_layer = page_scale_layer_.get(); |
| 627 if (!page_scale_layer && root_scroll) | 617 if (!page_scale_layer && root_scroll) |
| 628 page_scale_layer = root_scroll->parent(); | 618 page_scale_layer = root_scroll->parent(); |
| 629 | 619 |
| 630 if (layer_tree_->hud_layer()) { | 620 if (hud_layer_) { |
| 631 layer_tree_->hud_layer()->PrepareForCalculateDrawProperties( | 621 hud_layer_->PrepareForCalculateDrawProperties(device_viewport_size_, |
| 632 layer_tree_->device_viewport_size(), | 622 device_scale_factor_); |
| 633 layer_tree_->device_scale_factor()); | |
| 634 } | 623 } |
| 635 | 624 |
| 636 gfx::Transform identity_transform; | 625 gfx::Transform identity_transform; |
| 637 LayerList update_layer_list; | 626 LayerList update_layer_list; |
| 638 | 627 |
| 639 { | 628 { |
| 640 TRACE_EVENT0("cc", | 629 TRACE_EVENT0("cc", |
| 641 "LayerTreeHostInProcess::UpdateLayers::BuildPropertyTrees"); | 630 "LayerTreeHostInProcess::UpdateLayers::BuildPropertyTrees"); |
| 642 TRACE_EVENT0( | 631 TRACE_EVENT0( |
| 643 TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), | 632 TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), |
| 644 "LayerTreeHostInProcessCommon::ComputeVisibleRectsWithPropertyTrees"); | 633 "LayerTreeHostInProcessCommon::ComputeVisibleRectsWithPropertyTrees"); |
| 645 PropertyTreeBuilder::PreCalculateMetaInformation(root_layer); | 634 PropertyTreeBuilder::PreCalculateMetaInformation(root_layer); |
| 646 bool can_render_to_separate_surface = true; | 635 bool can_render_to_separate_surface = true; |
| 647 PropertyTrees* property_trees = layer_tree_->property_trees(); | 636 PropertyTrees* property_trees = &property_trees_; |
| 648 if (!settings_.use_layer_lists) { | 637 if (!settings_.use_layer_lists) { |
| 649 // If use_layer_lists is set, then the property trees should have been | 638 // If use_layer_lists is set, then the property trees should have been |
| 650 // built by the client already. | 639 // built by the client already. |
| 651 PropertyTreeBuilder::BuildPropertyTrees( | 640 PropertyTreeBuilder::BuildPropertyTrees( |
| 652 root_layer, page_scale_layer, | 641 root_layer, page_scale_layer, inner_viewport_scroll_layer(), |
| 653 layer_tree_->inner_viewport_scroll_layer(), | 642 outer_viewport_scroll_layer(), overscroll_elasticity_layer(), |
| 654 layer_tree_->outer_viewport_scroll_layer(), | 643 elastic_overscroll_, page_scale_factor_, device_scale_factor_, |
| 655 layer_tree_->overscroll_elasticity_layer(), | 644 gfx::Rect(device_viewport_size_), identity_transform, property_trees); |
| 656 layer_tree_->elastic_overscroll(), layer_tree_->page_scale_factor(), | |
| 657 layer_tree_->device_scale_factor(), | |
| 658 gfx::Rect(layer_tree_->device_viewport_size()), identity_transform, | |
| 659 property_trees); | |
| 660 TRACE_EVENT_INSTANT1( | 645 TRACE_EVENT_INSTANT1( |
| 661 "cc", "LayerTreeHostInProcess::UpdateLayers_BuiltPropertyTrees", | 646 "cc", "LayerTreeHostInProcess::UpdateLayers_BuiltPropertyTrees", |
| 662 TRACE_EVENT_SCOPE_THREAD, "property_trees", | 647 TRACE_EVENT_SCOPE_THREAD, "property_trees", |
| 663 property_trees->AsTracedValue()); | 648 property_trees->AsTracedValue()); |
| 664 } else { | 649 } else { |
| 665 TRACE_EVENT_INSTANT1( | 650 TRACE_EVENT_INSTANT1( |
| 666 "cc", "LayerTreeHostInProcess::UpdateLayers_ReceivedPropertyTrees", | 651 "cc", "LayerTreeHostInProcess::UpdateLayers_ReceivedPropertyTrees", |
| 667 TRACE_EVENT_SCOPE_THREAD, "property_trees", | 652 TRACE_EVENT_SCOPE_THREAD, "property_trees", |
| 668 property_trees->AsTracedValue()); | 653 property_trees->AsTracedValue()); |
| 669 } | 654 } |
| 670 draw_property_utils::UpdatePropertyTrees(property_trees, | 655 draw_property_utils::UpdatePropertyTrees(property_trees, |
| 671 can_render_to_separate_surface); | 656 can_render_to_separate_surface); |
| 672 draw_property_utils::FindLayersThatNeedUpdates( | 657 draw_property_utils::FindLayersThatNeedUpdates(this, property_trees, |
| 673 layer_tree_.get(), property_trees, &update_layer_list); | 658 &update_layer_list); |
| 674 } | 659 } |
| 675 | 660 |
| 676 for (const auto& layer : update_layer_list) | 661 for (const auto& layer : update_layer_list) |
| 677 layer->SavePaintProperties(); | 662 layer->SavePaintProperties(); |
| 678 | 663 |
| 679 bool content_is_suitable_for_gpu = true; | 664 bool content_is_suitable_for_gpu = true; |
| 680 bool did_paint_content = layer_tree_->UpdateLayers( | 665 bool did_paint_content = |
| 681 update_layer_list, &content_is_suitable_for_gpu); | 666 UpdateLayers(update_layer_list, &content_is_suitable_for_gpu); |
| 682 | 667 |
| 683 if (content_is_suitable_for_gpu) { | 668 if (content_is_suitable_for_gpu) { |
| 684 ++num_consecutive_frames_suitable_for_gpu_; | 669 ++num_consecutive_frames_suitable_for_gpu_; |
| 685 if (num_consecutive_frames_suitable_for_gpu_ >= | 670 if (num_consecutive_frames_suitable_for_gpu_ >= |
| 686 kNumFramesToConsiderBeforeGpuRasterization) { | 671 kNumFramesToConsiderBeforeGpuRasterization) { |
| 687 content_is_suitable_for_gpu_rasterization_ = true; | 672 content_is_suitable_for_gpu_rasterization_ = true; |
| 688 } | 673 } |
| 689 } else { | 674 } else { |
| 690 num_consecutive_frames_suitable_for_gpu_ = 0; | 675 num_consecutive_frames_suitable_for_gpu_ = 0; |
| 691 content_is_suitable_for_gpu_rasterization_ = false; | 676 content_is_suitable_for_gpu_rasterization_ = false; |
| 692 } | 677 } |
| 693 return did_paint_content; | 678 return did_paint_content; |
| 694 } | 679 } |
| 695 | 680 |
| 696 void LayerTreeHost::ApplyViewportDeltas(ScrollAndScaleSet* info) { | 681 void LayerTreeHost::ApplyViewportDeltas(ScrollAndScaleSet* info) { |
| 697 gfx::Vector2dF inner_viewport_scroll_delta; | 682 gfx::Vector2dF inner_viewport_scroll_delta; |
| 698 if (info->inner_viewport_scroll.layer_id != Layer::INVALID_ID) | 683 if (info->inner_viewport_scroll.layer_id != Layer::INVALID_ID) |
| 699 inner_viewport_scroll_delta = info->inner_viewport_scroll.scroll_delta; | 684 inner_viewport_scroll_delta = info->inner_viewport_scroll.scroll_delta; |
| 700 | 685 |
| 701 if (inner_viewport_scroll_delta.IsZero() && info->page_scale_delta == 1.f && | 686 if (inner_viewport_scroll_delta.IsZero() && info->page_scale_delta == 1.f && |
| 702 info->elastic_overscroll_delta.IsZero() && !info->top_controls_delta) | 687 info->elastic_overscroll_delta.IsZero() && !info->top_controls_delta) |
| 703 return; | 688 return; |
| 704 | 689 |
| 705 // Preemptively apply the scroll offset and scale delta here before sending | 690 // Preemptively apply the scroll offset and scale delta here before sending |
| 706 // it to the client. If the client comes back and sets it to the same | 691 // it to the client. If the client comes back and sets it to the same |
| 707 // value, then the layer can early out without needing a full commit. | 692 // value, then the layer can early out without needing a full commit. |
| 708 if (layer_tree_->inner_viewport_scroll_layer()) { | 693 if (inner_viewport_scroll_layer_) { |
| 709 layer_tree_->inner_viewport_scroll_layer()->SetScrollOffsetFromImplSide( | 694 inner_viewport_scroll_layer_->SetScrollOffsetFromImplSide( |
| 710 gfx::ScrollOffsetWithDelta( | 695 gfx::ScrollOffsetWithDelta( |
| 711 layer_tree_->inner_viewport_scroll_layer()->scroll_offset(), | 696 inner_viewport_scroll_layer_->scroll_offset(), |
| 712 inner_viewport_scroll_delta)); | 697 inner_viewport_scroll_delta)); |
| 713 } | 698 } |
| 714 | 699 |
| 715 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); | 700 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta); |
| 716 layer_tree_->SetElasticOverscrollFromImplSide( | 701 SetElasticOverscrollFromImplSide(elastic_overscroll_ + |
| 717 layer_tree_->elastic_overscroll() + info->elastic_overscroll_delta); | 702 info->elastic_overscroll_delta); |
| 718 // TODO(ccameron): pass the elastic overscroll here so that input events | 703 // TODO(ccameron): pass the elastic overscroll here so that input events |
| 719 // may be translated appropriately. | 704 // may be translated appropriately. |
| 720 client_->ApplyViewportDeltas(inner_viewport_scroll_delta, gfx::Vector2dF(), | 705 client_->ApplyViewportDeltas(inner_viewport_scroll_delta, gfx::Vector2dF(), |
| 721 info->elastic_overscroll_delta, | 706 info->elastic_overscroll_delta, |
| 722 info->page_scale_delta, | 707 info->page_scale_delta, |
| 723 info->top_controls_delta); | 708 info->top_controls_delta); |
| 724 SetNeedsUpdateLayers(); | 709 SetNeedsUpdateLayers(); |
| 725 } | 710 } |
| 726 | 711 |
| 727 void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) { | 712 void LayerTreeHost::ApplyScrollAndScale(ScrollAndScaleSet* info) { |
| 728 for (auto& swap_promise : info->swap_promises) { | 713 for (auto& swap_promise : info->swap_promises) { |
| 729 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", | 714 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow", |
| 730 TRACE_ID_DONT_MANGLE(swap_promise->TraceId()), | 715 TRACE_ID_DONT_MANGLE(swap_promise->TraceId()), |
| 731 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, | 716 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, |
| 732 "step", "Main thread scroll update"); | 717 "step", "Main thread scroll update"); |
| 733 swap_promise_manager_.QueueSwapPromise(std::move(swap_promise)); | 718 swap_promise_manager_.QueueSwapPromise(std::move(swap_promise)); |
| 734 } | 719 } |
| 735 | 720 |
| 736 if (layer_tree_->root_layer()) { | 721 if (root_layer_) { |
| 737 for (size_t i = 0; i < info->scrolls.size(); ++i) { | 722 for (size_t i = 0; i < info->scrolls.size(); ++i) { |
| 738 Layer* layer = layer_tree_->LayerById(info->scrolls[i].layer_id); | 723 Layer* layer = LayerById(info->scrolls[i].layer_id); |
| 739 if (!layer) | 724 if (!layer) |
| 740 continue; | 725 continue; |
| 741 layer->SetScrollOffsetFromImplSide(gfx::ScrollOffsetWithDelta( | 726 layer->SetScrollOffsetFromImplSide(gfx::ScrollOffsetWithDelta( |
| 742 layer->scroll_offset(), info->scrolls[i].scroll_delta)); | 727 layer->scroll_offset(), info->scrolls[i].scroll_delta)); |
| 743 SetNeedsUpdateLayers(); | 728 SetNeedsUpdateLayers(); |
| 744 } | 729 } |
| 745 for (size_t i = 0; i < info->scrollbars.size(); ++i) { | 730 for (size_t i = 0; i < info->scrollbars.size(); ++i) { |
| 746 Layer* layer = layer_tree_->LayerById(info->scrollbars[i].layer_id); | 731 Layer* layer = LayerById(info->scrollbars[i].layer_id); |
| 747 if (!layer) | 732 if (!layer) |
| 748 continue; | 733 continue; |
| 749 layer->SetScrollbarsHiddenFromImplSide(info->scrollbars[i].hidden); | 734 layer->SetScrollbarsHiddenFromImplSide(info->scrollbars[i].hidden); |
| 750 } | 735 } |
| 751 } | 736 } |
| 752 | 737 |
| 753 // This needs to happen after scroll deltas have been sent to prevent top | 738 // This needs to happen after scroll deltas have been sent to prevent top |
| 754 // controls from clamping the layout viewport both on the compositor and | 739 // controls from clamping the layout viewport both on the compositor and |
| 755 // on the main thread. | 740 // on the main thread. |
| 756 ApplyViewportDeltas(info); | 741 ApplyViewportDeltas(info); |
| 757 } | 742 } |
| 758 | 743 |
| 759 const base::WeakPtr<InputHandler>& LayerTreeHost::GetInputHandler() | 744 const base::WeakPtr<InputHandler>& LayerTreeHost::GetInputHandler() |
| 760 const { | 745 const { |
| 761 return input_handler_weak_ptr_; | 746 return input_handler_weak_ptr_; |
| 762 } | 747 } |
| 763 | 748 |
| 764 void LayerTreeHost::UpdateBrowserControlsState( | 749 void LayerTreeHost::UpdateBrowserControlsState( |
| 765 BrowserControlsState constraints, | 750 BrowserControlsState constraints, |
| 766 BrowserControlsState current, | 751 BrowserControlsState current, |
| 767 bool animate) { | 752 bool animate) { |
| 768 // Browser controls are only used in threaded mode. | 753 // Browser controls are only used in threaded mode. |
| 769 DCHECK(IsThreaded()); | 754 DCHECK(IsThreaded()); |
| 770 proxy_->UpdateBrowserControlsState(constraints, current, animate); | 755 proxy_->UpdateBrowserControlsState(constraints, current, animate); |
| 771 } | 756 } |
| 772 | 757 |
| 773 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { | 758 void LayerTreeHost::AnimateLayers(base::TimeTicks monotonic_time) { |
| 774 MutatorHost* mutator_host = layer_tree_->mutator_host(); | 759 std::unique_ptr<MutatorEvents> events = mutator_host_->CreateEvents(); |
| 775 std::unique_ptr<MutatorEvents> events = mutator_host->CreateEvents(); | |
| 776 | 760 |
| 777 if (mutator_host->TickAnimations(monotonic_time)) | 761 if (mutator_host_->TickAnimations(monotonic_time)) |
| 778 mutator_host->UpdateAnimationState(true, events.get()); | 762 mutator_host_->UpdateAnimationState(true, events.get()); |
| 779 | 763 |
| 780 if (!events->IsEmpty()) | 764 if (!events->IsEmpty()) |
| 781 layer_tree_->property_trees()->needs_rebuild = true; | 765 property_trees_.needs_rebuild = true; |
| 782 } | 766 } |
| 783 | 767 |
| 784 int LayerTreeHost::ScheduleMicroBenchmark( | 768 int LayerTreeHost::ScheduleMicroBenchmark( |
| 785 const std::string& benchmark_name, | 769 const std::string& benchmark_name, |
| 786 std::unique_ptr<base::Value> value, | 770 std::unique_ptr<base::Value> value, |
| 787 const MicroBenchmark::DoneCallback& callback) { | 771 const MicroBenchmark::DoneCallback& callback) { |
| 788 return micro_benchmark_controller_.ScheduleRun(benchmark_name, | 772 return micro_benchmark_controller_.ScheduleRun(benchmark_name, |
| 789 std::move(value), callback); | 773 std::move(value), callback); |
| 790 } | 774 } |
| 791 | 775 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 805 !task_runner_provider_->HasImplThread()); | 789 !task_runner_provider_->HasImplThread()); |
| 806 return compositor_mode_ == CompositorMode::SINGLE_THREADED; | 790 return compositor_mode_ == CompositorMode::SINGLE_THREADED; |
| 807 } | 791 } |
| 808 | 792 |
| 809 bool LayerTreeHost::IsThreaded() const { | 793 bool LayerTreeHost::IsThreaded() const { |
| 810 DCHECK(compositor_mode_ != CompositorMode::THREADED || | 794 DCHECK(compositor_mode_ != CompositorMode::THREADED || |
| 811 task_runner_provider_->HasImplThread()); | 795 task_runner_provider_->HasImplThread()); |
| 812 return compositor_mode_ == CompositorMode::THREADED; | 796 return compositor_mode_ == CompositorMode::THREADED; |
| 813 } | 797 } |
| 814 | 798 |
| 799 void LayerTreeHost::SetRootLayer(scoped_refptr<Layer> root_layer) { |
| 800 if (root_layer_.get() == root_layer.get()) |
| 801 return; |
| 802 |
| 803 if (root_layer_.get()) |
| 804 root_layer_->SetLayerTreeHost(nullptr); |
| 805 root_layer_ = root_layer; |
| 806 if (root_layer_.get()) { |
| 807 DCHECK(!root_layer_->parent()); |
| 808 root_layer_->SetLayerTreeHost(this); |
| 809 } |
| 810 |
| 811 if (hud_layer_.get()) |
| 812 hud_layer_->RemoveFromParent(); |
| 813 |
| 814 // Reset gpu rasterization tracking. |
| 815 // This flag is sticky until a new tree comes along. |
| 816 ResetGpuRasterizationTracking(); |
| 817 |
| 818 SetNeedsFullTreeSync(); |
| 819 } |
| 820 |
| 821 void LayerTreeHost::RegisterViewportLayers( |
| 822 scoped_refptr<Layer> overscroll_elasticity_layer, |
| 823 scoped_refptr<Layer> page_scale_layer, |
| 824 scoped_refptr<Layer> inner_viewport_scroll_layer, |
| 825 scoped_refptr<Layer> outer_viewport_scroll_layer) { |
| 826 DCHECK(!inner_viewport_scroll_layer || |
| 827 inner_viewport_scroll_layer != outer_viewport_scroll_layer); |
| 828 overscroll_elasticity_layer_ = overscroll_elasticity_layer; |
| 829 page_scale_layer_ = page_scale_layer; |
| 830 inner_viewport_scroll_layer_ = inner_viewport_scroll_layer; |
| 831 outer_viewport_scroll_layer_ = outer_viewport_scroll_layer; |
| 832 } |
| 833 |
| 834 void LayerTreeHost::RegisterSelection(const LayerSelection& selection) { |
| 835 if (selection_ == selection) |
| 836 return; |
| 837 |
| 838 selection_ = selection; |
| 839 SetNeedsCommit(); |
| 840 } |
| 841 |
| 842 void LayerTreeHost::SetHaveScrollEventHandlers(bool have_event_handlers) { |
| 843 if (have_scroll_event_handlers_ == have_event_handlers) |
| 844 return; |
| 845 |
| 846 have_scroll_event_handlers_ = have_event_handlers; |
| 847 SetNeedsCommit(); |
| 848 } |
| 849 |
| 850 void LayerTreeHost::SetEventListenerProperties( |
| 851 EventListenerClass event_class, |
| 852 EventListenerProperties properties) { |
| 853 const size_t index = static_cast<size_t>(event_class); |
| 854 if (event_listener_properties_[index] == properties) |
| 855 return; |
| 856 |
| 857 event_listener_properties_[index] = properties; |
| 858 SetNeedsCommit(); |
| 859 } |
| 860 |
| 861 void LayerTreeHost::SetViewportSize(const gfx::Size& device_viewport_size) { |
| 862 if (device_viewport_size_ == device_viewport_size) |
| 863 return; |
| 864 |
| 865 device_viewport_size_ = device_viewport_size; |
| 866 |
| 867 SetPropertyTreesNeedRebuild(); |
| 868 SetNeedsCommit(); |
| 869 } |
| 870 |
| 871 void LayerTreeHost::SetBrowserControlsHeight(float height, bool shrink) { |
| 872 if (top_controls_height_ == height && |
| 873 browser_controls_shrink_blink_size_ == shrink) |
| 874 return; |
| 875 |
| 876 top_controls_height_ = height; |
| 877 browser_controls_shrink_blink_size_ = shrink; |
| 878 SetNeedsCommit(); |
| 879 } |
| 880 |
| 881 void LayerTreeHost::SetBrowserControlsShownRatio(float ratio) { |
| 882 if (top_controls_shown_ratio_ == ratio) |
| 883 return; |
| 884 |
| 885 top_controls_shown_ratio_ = ratio; |
| 886 SetNeedsCommit(); |
| 887 } |
| 888 |
| 889 void LayerTreeHost::SetBottomControlsHeight(float height) { |
| 890 if (bottom_controls_height_ == height) |
| 891 return; |
| 892 |
| 893 bottom_controls_height_ = height; |
| 894 SetNeedsCommit(); |
| 895 } |
| 896 |
| 897 void LayerTreeHost::SetPageScaleFactorAndLimits(float page_scale_factor, |
| 898 float min_page_scale_factor, |
| 899 float max_page_scale_factor) { |
| 900 if (page_scale_factor_ == page_scale_factor && |
| 901 min_page_scale_factor_ == min_page_scale_factor && |
| 902 max_page_scale_factor_ == max_page_scale_factor) |
| 903 return; |
| 904 |
| 905 page_scale_factor_ = page_scale_factor; |
| 906 min_page_scale_factor_ = min_page_scale_factor; |
| 907 max_page_scale_factor_ = max_page_scale_factor; |
| 908 SetPropertyTreesNeedRebuild(); |
| 909 SetNeedsCommit(); |
| 910 } |
| 911 |
| 912 void LayerTreeHost::StartPageScaleAnimation(const gfx::Vector2d& target_offset, |
| 913 bool use_anchor, |
| 914 float scale, |
| 915 base::TimeDelta duration) { |
| 916 pending_page_scale_animation_.reset(new PendingPageScaleAnimation( |
| 917 target_offset, use_anchor, scale, duration)); |
| 918 |
| 919 SetNeedsCommit(); |
| 920 } |
| 921 |
| 922 bool LayerTreeHost::HasPendingPageScaleAnimation() const { |
| 923 return !!pending_page_scale_animation_.get(); |
| 924 } |
| 925 |
| 926 void LayerTreeHost::SetDeviceScaleFactor(float device_scale_factor) { |
| 927 if (device_scale_factor_ == device_scale_factor) |
| 928 return; |
| 929 device_scale_factor_ = device_scale_factor; |
| 930 |
| 931 property_trees_.needs_rebuild = true; |
| 932 SetNeedsCommit(); |
| 933 } |
| 934 |
| 935 void LayerTreeHost::SetPaintedDeviceScaleFactor( |
| 936 float painted_device_scale_factor) { |
| 937 if (painted_device_scale_factor_ == painted_device_scale_factor) |
| 938 return; |
| 939 painted_device_scale_factor_ = painted_device_scale_factor; |
| 940 |
| 941 SetNeedsCommit(); |
| 942 } |
| 943 |
| 944 void LayerTreeHost::SetDeviceColorSpace( |
| 945 const gfx::ColorSpace& device_color_space) { |
| 946 if (device_color_space_ == device_color_space) |
| 947 return; |
| 948 device_color_space_ = device_color_space; |
| 949 LayerTreeHostCommon::CallFunctionForEveryLayer( |
| 950 this, [](Layer* layer) { layer->SetNeedsDisplay(); }); |
| 951 } |
| 952 |
| 953 void LayerTreeHost::RegisterLayer(Layer* layer) { |
| 954 DCHECK(!LayerById(layer->id())); |
| 955 DCHECK(!in_paint_layer_contents_); |
| 956 layer_id_map_[layer->id()] = layer; |
| 957 if (layer->element_id()) { |
| 958 mutator_host_->RegisterElement(layer->element_id(), |
| 959 ElementListType::ACTIVE); |
| 960 } |
| 961 } |
| 962 |
| 963 void LayerTreeHost::UnregisterLayer(Layer* layer) { |
| 964 DCHECK(LayerById(layer->id())); |
| 965 DCHECK(!in_paint_layer_contents_); |
| 966 if (layer->element_id()) { |
| 967 mutator_host_->UnregisterElement(layer->element_id(), |
| 968 ElementListType::ACTIVE); |
| 969 } |
| 970 RemoveLayerShouldPushProperties(layer); |
| 971 layer_id_map_.erase(layer->id()); |
| 972 } |
| 973 |
| 974 Layer* LayerTreeHost::LayerById(int id) const { |
| 975 auto iter = layer_id_map_.find(id); |
| 976 return iter != layer_id_map_.end() ? iter->second : nullptr; |
| 977 } |
| 978 |
| 979 size_t LayerTreeHost::NumLayers() const { |
| 980 return layer_id_map_.size(); |
| 981 } |
| 982 |
| 983 bool LayerTreeHost::UpdateLayers(const LayerList& update_layer_list, |
| 984 bool* content_is_suitable_for_gpu) { |
| 985 base::AutoReset<bool> painting(&in_paint_layer_contents_, true); |
| 986 bool did_paint_content = false; |
| 987 for (const auto& layer : update_layer_list) { |
| 988 did_paint_content |= layer->Update(); |
| 989 *content_is_suitable_for_gpu &= layer->IsSuitableForGpuRasterization(); |
| 990 } |
| 991 return did_paint_content; |
| 992 } |
| 993 |
| 994 void LayerTreeHost::AddLayerShouldPushProperties(Layer* layer) { |
| 995 layers_that_should_push_properties_.insert(layer); |
| 996 } |
| 997 |
| 998 void LayerTreeHost::RemoveLayerShouldPushProperties(Layer* layer) { |
| 999 layers_that_should_push_properties_.erase(layer); |
| 1000 } |
| 1001 |
| 1002 std::unordered_set<Layer*>& LayerTreeHost::LayersThatShouldPushProperties() { |
| 1003 return layers_that_should_push_properties_; |
| 1004 } |
| 1005 |
| 1006 bool LayerTreeHost::LayerNeedsPushPropertiesForTesting(Layer* layer) const { |
| 1007 return layers_that_should_push_properties_.find(layer) != |
| 1008 layers_that_should_push_properties_.end(); |
| 1009 } |
| 1010 |
| 1011 void LayerTreeHost::SetNeedsMetaInfoRecomputation(bool needs_recomputation) { |
| 1012 needs_meta_info_recomputation_ = needs_recomputation; |
| 1013 } |
| 1014 |
| 1015 void LayerTreeHost::SetPageScaleFromImplSide(float page_scale) { |
| 1016 DCHECK(CommitRequested()); |
| 1017 page_scale_factor_ = page_scale; |
| 1018 SetPropertyTreesNeedRebuild(); |
| 1019 } |
| 1020 |
| 1021 void LayerTreeHost::SetElasticOverscrollFromImplSide( |
| 1022 gfx::Vector2dF elastic_overscroll) { |
| 1023 DCHECK(CommitRequested()); |
| 1024 elastic_overscroll_ = elastic_overscroll; |
| 1025 } |
| 1026 |
| 1027 void LayerTreeHost::UpdateHudLayer(bool show_hud_info) { |
| 1028 if (show_hud_info) { |
| 1029 if (!hud_layer_.get()) { |
| 1030 hud_layer_ = HeadsUpDisplayLayer::Create(); |
| 1031 } |
| 1032 |
| 1033 if (root_layer_.get() && !hud_layer_->parent()) |
| 1034 root_layer_->AddChild(hud_layer_); |
| 1035 } else if (hud_layer_.get()) { |
| 1036 hud_layer_->RemoveFromParent(); |
| 1037 hud_layer_ = nullptr; |
| 1038 } |
| 1039 } |
| 1040 |
| 1041 void LayerTreeHost::SetNeedsFullTreeSync() { |
| 1042 needs_full_tree_sync_ = true; |
| 1043 needs_meta_info_recomputation_ = true; |
| 1044 |
| 1045 property_trees_.needs_rebuild = true; |
| 1046 SetNeedsCommit(); |
| 1047 } |
| 1048 |
| 1049 void LayerTreeHost::SetPropertyTreesNeedRebuild() { |
| 1050 property_trees_.needs_rebuild = true; |
| 1051 SetNeedsUpdateLayers(); |
| 1052 } |
| 1053 |
| 1054 void LayerTreeHost::PushPropertiesTo(LayerTreeImpl* tree_impl) { |
| 1055 tree_impl->set_needs_full_tree_sync(needs_full_tree_sync_); |
| 1056 needs_full_tree_sync_ = false; |
| 1057 |
| 1058 if (hud_layer_.get()) { |
| 1059 LayerImpl* hud_impl = tree_impl->LayerById(hud_layer_->id()); |
| 1060 tree_impl->set_hud_layer(static_cast<HeadsUpDisplayLayerImpl*>(hud_impl)); |
| 1061 } else { |
| 1062 tree_impl->set_hud_layer(nullptr); |
| 1063 } |
| 1064 |
| 1065 tree_impl->set_background_color(background_color_); |
| 1066 tree_impl->set_has_transparent_background(has_transparent_background_); |
| 1067 tree_impl->set_have_scroll_event_handlers(have_scroll_event_handlers_); |
| 1068 tree_impl->set_event_listener_properties( |
| 1069 EventListenerClass::kTouchStartOrMove, |
| 1070 event_listener_properties(EventListenerClass::kTouchStartOrMove)); |
| 1071 tree_impl->set_event_listener_properties( |
| 1072 EventListenerClass::kMouseWheel, |
| 1073 event_listener_properties(EventListenerClass::kMouseWheel)); |
| 1074 tree_impl->set_event_listener_properties( |
| 1075 EventListenerClass::kTouchEndOrCancel, |
| 1076 event_listener_properties(EventListenerClass::kTouchEndOrCancel)); |
| 1077 |
| 1078 if (page_scale_layer_ && inner_viewport_scroll_layer_) { |
| 1079 tree_impl->SetViewportLayersFromIds( |
| 1080 overscroll_elasticity_layer_ ? overscroll_elasticity_layer_->id() |
| 1081 : Layer::INVALID_ID, |
| 1082 page_scale_layer_->id(), inner_viewport_scroll_layer_->id(), |
| 1083 outer_viewport_scroll_layer_ ? outer_viewport_scroll_layer_->id() |
| 1084 : Layer::INVALID_ID); |
| 1085 DCHECK(inner_viewport_scroll_layer_->IsContainerForFixedPositionLayers()); |
| 1086 } else { |
| 1087 tree_impl->ClearViewportLayers(); |
| 1088 } |
| 1089 |
| 1090 tree_impl->RegisterSelection(selection_); |
| 1091 |
| 1092 bool property_trees_changed_on_active_tree = |
| 1093 tree_impl->IsActiveTree() && tree_impl->property_trees()->changed; |
| 1094 // Property trees may store damage status. We preserve the sync tree damage |
| 1095 // status by pushing the damage status from sync tree property trees to main |
| 1096 // thread property trees or by moving it onto the layers. |
| 1097 if (root_layer_ && property_trees_changed_on_active_tree) { |
| 1098 if (property_trees_.sequence_number == |
| 1099 tree_impl->property_trees()->sequence_number) |
| 1100 tree_impl->property_trees()->PushChangeTrackingTo(&property_trees_); |
| 1101 else |
| 1102 tree_impl->MoveChangeTrackingToLayers(); |
| 1103 } |
| 1104 // Setting property trees must happen before pushing the page scale. |
| 1105 tree_impl->SetPropertyTrees(&property_trees_); |
| 1106 |
| 1107 tree_impl->PushPageScaleFromMainThread( |
| 1108 page_scale_factor_, min_page_scale_factor_, max_page_scale_factor_); |
| 1109 |
| 1110 tree_impl->set_browser_controls_shrink_blink_size( |
| 1111 browser_controls_shrink_blink_size_); |
| 1112 tree_impl->set_top_controls_height(top_controls_height_); |
| 1113 tree_impl->set_bottom_controls_height(bottom_controls_height_); |
| 1114 tree_impl->PushBrowserControlsFromMainThread(top_controls_shown_ratio_); |
| 1115 tree_impl->elastic_overscroll()->PushFromMainThread(elastic_overscroll_); |
| 1116 if (tree_impl->IsActiveTree()) |
| 1117 tree_impl->elastic_overscroll()->PushPendingToActive(); |
| 1118 |
| 1119 tree_impl->set_painted_device_scale_factor(painted_device_scale_factor_); |
| 1120 |
| 1121 tree_impl->SetDeviceColorSpace(device_color_space_); |
| 1122 |
| 1123 if (pending_page_scale_animation_) { |
| 1124 tree_impl->SetPendingPageScaleAnimation( |
| 1125 std::move(pending_page_scale_animation_)); |
| 1126 } |
| 1127 |
| 1128 DCHECK(!tree_impl->ViewportSizeInvalid()); |
| 1129 |
| 1130 tree_impl->set_has_ever_been_drawn(false); |
| 1131 } |
| 1132 |
| 1133 Layer* LayerTreeHost::LayerByElementId(ElementId element_id) const { |
| 1134 auto iter = element_layers_map_.find(element_id); |
| 1135 return iter != element_layers_map_.end() ? iter->second : nullptr; |
| 1136 } |
| 1137 |
| 1138 void LayerTreeHost::RegisterElement(ElementId element_id, |
| 1139 ElementListType list_type, |
| 1140 Layer* layer) { |
| 1141 if (layer->element_id()) { |
| 1142 element_layers_map_[layer->element_id()] = layer; |
| 1143 } |
| 1144 |
| 1145 mutator_host_->RegisterElement(element_id, list_type); |
| 1146 } |
| 1147 |
| 1148 void LayerTreeHost::UnregisterElement(ElementId element_id, |
| 1149 ElementListType list_type, |
| 1150 Layer* layer) { |
| 1151 mutator_host_->UnregisterElement(element_id, list_type); |
| 1152 |
| 1153 if (layer->element_id()) { |
| 1154 element_layers_map_.erase(layer->element_id()); |
| 1155 } |
| 1156 } |
| 1157 |
| 1158 static void SetElementIdForTesting(Layer* layer) { |
| 1159 layer->SetElementId(LayerIdToElementIdForTesting(layer->id())); |
| 1160 } |
| 1161 |
| 1162 void LayerTreeHost::SetElementIdsForTesting() { |
| 1163 LayerTreeHostCommon::CallFunctionForEveryLayer(this, SetElementIdForTesting); |
| 1164 } |
| 1165 |
| 1166 void LayerTreeHost::BuildPropertyTreesForTesting() { |
| 1167 PropertyTreeBuilder::PreCalculateMetaInformation(root_layer()); |
| 1168 gfx::Transform identity_transform; |
| 1169 PropertyTreeBuilder::BuildPropertyTrees( |
| 1170 root_layer(), page_scale_layer(), inner_viewport_scroll_layer(), |
| 1171 outer_viewport_scroll_layer(), overscroll_elasticity_layer(), |
| 1172 elastic_overscroll(), page_scale_factor(), device_scale_factor(), |
| 1173 gfx::Rect(device_viewport_size()), identity_transform, property_trees()); |
| 1174 } |
| 1175 |
| 1176 bool LayerTreeHost::IsElementInList(ElementId element_id, |
| 1177 ElementListType list_type) const { |
| 1178 return list_type == ElementListType::ACTIVE && LayerByElementId(element_id); |
| 1179 } |
| 1180 |
| 1181 void LayerTreeHost::SetMutatorsNeedCommit() { |
| 1182 SetNeedsCommit(); |
| 1183 } |
| 1184 |
| 1185 void LayerTreeHost::SetMutatorsNeedRebuildPropertyTrees() { |
| 1186 property_trees_.needs_rebuild = true; |
| 1187 } |
| 1188 |
| 1189 void LayerTreeHost::SetElementFilterMutated(ElementId element_id, |
| 1190 ElementListType list_type, |
| 1191 const FilterOperations& filters) { |
| 1192 Layer* layer = LayerByElementId(element_id); |
| 1193 DCHECK(layer); |
| 1194 layer->OnFilterAnimated(filters); |
| 1195 } |
| 1196 |
| 1197 void LayerTreeHost::SetElementOpacityMutated(ElementId element_id, |
| 1198 ElementListType list_type, |
| 1199 float opacity) { |
| 1200 Layer* layer = LayerByElementId(element_id); |
| 1201 DCHECK(layer); |
| 1202 layer->OnOpacityAnimated(opacity); |
| 1203 } |
| 1204 |
| 1205 void LayerTreeHost::SetElementTransformMutated( |
| 1206 ElementId element_id, |
| 1207 ElementListType list_type, |
| 1208 const gfx::Transform& transform) { |
| 1209 Layer* layer = LayerByElementId(element_id); |
| 1210 DCHECK(layer); |
| 1211 layer->OnTransformAnimated(transform); |
| 1212 } |
| 1213 |
| 1214 void LayerTreeHost::SetElementScrollOffsetMutated( |
| 1215 ElementId element_id, |
| 1216 ElementListType list_type, |
| 1217 const gfx::ScrollOffset& scroll_offset) { |
| 1218 Layer* layer = LayerByElementId(element_id); |
| 1219 DCHECK(layer); |
| 1220 layer->OnScrollOffsetAnimated(scroll_offset); |
| 1221 } |
| 1222 |
| 1223 void LayerTreeHost::ElementIsAnimatingChanged( |
| 1224 ElementId element_id, |
| 1225 ElementListType list_type, |
| 1226 const PropertyAnimationState& mask, |
| 1227 const PropertyAnimationState& state) { |
| 1228 Layer* layer = LayerByElementId(element_id); |
| 1229 if (layer) |
| 1230 layer->OnIsAnimatingChanged(mask, state); |
| 1231 } |
| 1232 |
| 1233 gfx::ScrollOffset LayerTreeHost::GetScrollOffsetForAnimation( |
| 1234 ElementId element_id) const { |
| 1235 Layer* layer = LayerByElementId(element_id); |
| 1236 DCHECK(layer); |
| 1237 return layer->ScrollOffsetForAnimation(); |
| 1238 } |
| 1239 |
| 1240 LayerListIterator<Layer> LayerTreeHost::begin() const { |
| 1241 return LayerListIterator<Layer>(root_layer_.get()); |
| 1242 } |
| 1243 |
| 1244 LayerListIterator<Layer> LayerTreeHost::end() const { |
| 1245 return LayerListIterator<Layer>(nullptr); |
| 1246 } |
| 1247 |
| 1248 LayerListReverseIterator<Layer> LayerTreeHost::rbegin() { |
| 1249 return LayerListReverseIterator<Layer>(root_layer_.get()); |
| 1250 } |
| 1251 |
| 1252 LayerListReverseIterator<Layer> LayerTreeHost::rend() { |
| 1253 return LayerListReverseIterator<Layer>(nullptr); |
| 1254 } |
| 1255 |
| 1256 void LayerTreeHost::SetNeedsDisplayOnAllLayers() { |
| 1257 for (auto* layer : *this) |
| 1258 layer->SetNeedsDisplay(); |
| 1259 } |
| 1260 |
| 815 } // namespace cc | 1261 } // namespace cc |
| OLD | NEW |