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

Side by Side Diff: cc/trees/layer_tree_host.cc

Issue 2661523003: cc: Merge LayerTree into the LayerTreeHost. (Closed)
Patch Set: auto Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host.h ('k') | cc/trees/layer_tree_host_common.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698