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

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

Issue 2650303002: cc: Remove the LayerTreeHost abstraction. (Closed)
Patch Set: missed ui 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_in_process.h ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "cc/trees/layer_tree_host_in_process.h"
6
7 #include <stddef.h>
8 #include <stdint.h>
9
10 #include <algorithm>
11 #include <memory>
12 #include <stack>
13 #include <string>
14 #include <unordered_map>
15
16 #include "base/atomic_sequence_num.h"
17 #include "base/bind.h"
18 #include "base/command_line.h"
19 #include "base/location.h"
20 #include "base/memory/ptr_util.h"
21 #include "base/metrics/histogram_macros.h"
22 #include "base/numerics/safe_math.h"
23 #include "base/single_thread_task_runner.h"
24 #include "base/stl_util.h"
25 #include "base/strings/string_number_conversions.h"
26 #include "base/strings/stringprintf.h"
27 #include "base/threading/thread_task_runner_handle.h"
28 #include "base/timer/elapsed_timer.h"
29 #include "base/trace_event/trace_event.h"
30 #include "base/trace_event/trace_event_argument.h"
31 #include "cc/base/histograms.h"
32 #include "cc/base/math_util.h"
33 #include "cc/debug/devtools_instrumentation.h"
34 #include "cc/debug/frame_viewer_instrumentation.h"
35 #include "cc/debug/rendering_stats_instrumentation.h"
36 #include "cc/input/layer_selection_bound.h"
37 #include "cc/input/page_scale_animation.h"
38 #include "cc/layers/heads_up_display_layer.h"
39 #include "cc/layers/heads_up_display_layer_impl.h"
40 #include "cc/layers/layer.h"
41 #include "cc/layers/layer_iterator.h"
42 #include "cc/layers/painted_scrollbar_layer.h"
43 #include "cc/resources/ui_resource_manager.h"
44 #include "cc/trees/draw_property_utils.h"
45 #include "cc/trees/layer_tree_host_client.h"
46 #include "cc/trees/layer_tree_host_common.h"
47 #include "cc/trees/layer_tree_host_impl.h"
48 #include "cc/trees/layer_tree_impl.h"
49 #include "cc/trees/mutator_host.h"
50 #include "cc/trees/property_tree_builder.h"
51 #include "cc/trees/proxy_main.h"
52 #include "cc/trees/single_thread_proxy.h"
53 #include "cc/trees/swap_promise_manager.h"
54 #include "cc/trees/tree_synchronizer.h"
55 #include "ui/gfx/geometry/size_conversions.h"
56 #include "ui/gfx/geometry/vector2d_conversions.h"
57
58 namespace {
59 static base::StaticAtomicSequenceNumber s_layer_tree_host_sequence_number;
60 }
61
62 namespace cc {
63
64 LayerTreeHostInProcess::InitParams::InitParams() {}
65
66 LayerTreeHostInProcess::InitParams::~InitParams() {}
67
68 std::unique_ptr<LayerTreeHostInProcess> LayerTreeHostInProcess::CreateThreaded(
69 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner,
70 InitParams* params) {
71 DCHECK(params->main_task_runner.get());
72 DCHECK(impl_task_runner.get());
73 DCHECK(params->settings);
74 std::unique_ptr<LayerTreeHostInProcess> layer_tree_host(
75 new LayerTreeHostInProcess(params, CompositorMode::THREADED));
76 layer_tree_host->InitializeThreaded(params->main_task_runner,
77 impl_task_runner);
78 return layer_tree_host;
79 }
80
81 std::unique_ptr<LayerTreeHostInProcess>
82 LayerTreeHostInProcess::CreateSingleThreaded(
83 LayerTreeHostSingleThreadClient* single_thread_client,
84 InitParams* params) {
85 DCHECK(params->settings);
86 std::unique_ptr<LayerTreeHostInProcess> layer_tree_host(
87 new LayerTreeHostInProcess(params, CompositorMode::SINGLE_THREADED));
88 layer_tree_host->InitializeSingleThreaded(single_thread_client,
89 params->main_task_runner);
90 return layer_tree_host;
91 }
92
93 LayerTreeHostInProcess::LayerTreeHostInProcess(InitParams* params,
94 CompositorMode mode)
95 : LayerTreeHostInProcess(
96 params,
97 mode,
98 base::MakeUnique<LayerTree>(params->mutator_host, this)) {}
99
100 LayerTreeHostInProcess::LayerTreeHostInProcess(
101 InitParams* params,
102 CompositorMode mode,
103 std::unique_ptr<LayerTree> layer_tree)
104 : micro_benchmark_controller_(this),
105 layer_tree_(std::move(layer_tree)),
106 compositor_mode_(mode),
107 ui_resource_manager_(base::MakeUnique<UIResourceManager>()),
108 client_(params->client),
109 source_frame_number_(0),
110 rendering_stats_instrumentation_(RenderingStatsInstrumentation::Create()),
111 settings_(*params->settings),
112 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),
119 task_graph_runner_(params->task_graph_runner),
120 image_worker_task_runner_(params->image_worker_task_runner) {
121 DCHECK(task_graph_runner_);
122 DCHECK(layer_tree_);
123
124 rendering_stats_instrumentation_->set_record_rendering_stats(
125 debug_state_.RecordRenderingStats());
126 }
127
128 void LayerTreeHostInProcess::InitializeThreaded(
129 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
130 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner) {
131 task_runner_provider_ =
132 TaskRunnerProvider::Create(main_task_runner, impl_task_runner);
133 std::unique_ptr<ProxyMain> proxy_main =
134 base::MakeUnique<ProxyMain>(this, task_runner_provider_.get());
135 InitializeProxy(std::move(proxy_main));
136 }
137
138 void LayerTreeHostInProcess::InitializeSingleThreaded(
139 LayerTreeHostSingleThreadClient* single_thread_client,
140 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) {
141 task_runner_provider_ = TaskRunnerProvider::Create(main_task_runner, nullptr);
142 InitializeProxy(SingleThreadProxy::Create(this, single_thread_client,
143 task_runner_provider_.get()));
144 }
145
146 void LayerTreeHostInProcess::InitializeForTesting(
147 std::unique_ptr<TaskRunnerProvider> task_runner_provider,
148 std::unique_ptr<Proxy> proxy_for_testing) {
149 task_runner_provider_ = std::move(task_runner_provider);
150 InitializeProxy(std::move(proxy_for_testing));
151 }
152
153 void LayerTreeHostInProcess::SetTaskRunnerProviderForTesting(
154 std::unique_ptr<TaskRunnerProvider> task_runner_provider) {
155 DCHECK(!task_runner_provider_);
156 task_runner_provider_ = std::move(task_runner_provider);
157 }
158
159 void LayerTreeHostInProcess::SetUIResourceManagerForTesting(
160 std::unique_ptr<UIResourceManager> ui_resource_manager) {
161 ui_resource_manager_ = std::move(ui_resource_manager);
162 }
163
164 void LayerTreeHostInProcess::InitializeProxy(std::unique_ptr<Proxy> proxy) {
165 TRACE_EVENT0("cc", "LayerTreeHostInProcess::InitializeForReal");
166 DCHECK(task_runner_provider_);
167
168 proxy_ = std::move(proxy);
169 proxy_->Start();
170
171 layer_tree_->mutator_host()->SetSupportsScrollAnimations(
172 proxy_->SupportsImplScrolling());
173 }
174
175 LayerTreeHostInProcess::~LayerTreeHostInProcess() {
176 // Track when we're inside a main frame to see if compositor is being
177 // destroyed midway which causes a crash. crbug.com/654672
178 CHECK(!inside_main_frame_);
179 TRACE_EVENT0("cc", "LayerTreeHostInProcess::~LayerTreeHostInProcess");
180
181 // Clear any references into the LayerTreeHostInProcess.
182 layer_tree_.reset();
183
184 if (proxy_) {
185 DCHECK(task_runner_provider_->IsMainThread());
186 proxy_->Stop();
187
188 // Proxy must be destroyed before the Task Runner Provider.
189 proxy_ = nullptr;
190 }
191 }
192
193 int LayerTreeHostInProcess::GetId() const {
194 return id_;
195 }
196
197 int LayerTreeHostInProcess::SourceFrameNumber() const {
198 return source_frame_number_;
199 }
200
201 LayerTree* LayerTreeHostInProcess::GetLayerTree() {
202 return layer_tree_.get();
203 }
204
205 const LayerTree* LayerTreeHostInProcess::GetLayerTree() const {
206 return layer_tree_.get();
207 }
208
209 UIResourceManager* LayerTreeHostInProcess::GetUIResourceManager() const {
210 return ui_resource_manager_.get();
211 }
212
213 TaskRunnerProvider* LayerTreeHostInProcess::GetTaskRunnerProvider() const {
214 return task_runner_provider_.get();
215 }
216
217 SwapPromiseManager* LayerTreeHostInProcess::GetSwapPromiseManager() {
218 return &swap_promise_manager_;
219 }
220
221 const LayerTreeSettings& LayerTreeHostInProcess::GetSettings() const {
222 return settings_;
223 }
224
225 void LayerTreeHostInProcess::SetFrameSinkId(const FrameSinkId& frame_sink_id) {
226 surface_sequence_generator_.set_frame_sink_id(frame_sink_id);
227 }
228
229 void LayerTreeHostInProcess::QueueSwapPromise(
230 std::unique_ptr<SwapPromise> swap_promise) {
231 swap_promise_manager_.QueueSwapPromise(std::move(swap_promise));
232 }
233
234 SurfaceSequenceGenerator*
235 LayerTreeHostInProcess::GetSurfaceSequenceGenerator() {
236 return &surface_sequence_generator_;
237 }
238
239 void LayerTreeHostInProcess::WillBeginMainFrame() {
240 inside_main_frame_ = true;
241 devtools_instrumentation::WillBeginMainThreadFrame(GetId(),
242 SourceFrameNumber());
243 client_->WillBeginMainFrame();
244 }
245
246 void LayerTreeHostInProcess::DidBeginMainFrame() {
247 inside_main_frame_ = false;
248 client_->DidBeginMainFrame();
249 }
250
251 void LayerTreeHostInProcess::BeginMainFrameNotExpectedSoon() {
252 client_->BeginMainFrameNotExpectedSoon();
253 }
254
255 void LayerTreeHostInProcess::BeginMainFrame(const BeginFrameArgs& args) {
256 client_->BeginMainFrame(args);
257 }
258
259 void LayerTreeHostInProcess::DidStopFlinging() {
260 proxy_->MainThreadHasStoppedFlinging();
261 }
262
263 const LayerTreeDebugState& LayerTreeHostInProcess::GetDebugState() const {
264 return debug_state_;
265 }
266
267 void LayerTreeHostInProcess::RequestMainFrameUpdate() {
268 client_->UpdateLayerTreeHost();
269 }
270
271 // This function commits the LayerTreeHost to an impl tree. When modifying
272 // this function, keep in mind that the function *runs* on the impl thread! Any
273 // code that is logically a main thread operation, e.g. deletion of a Layer,
274 // should be delayed until the LayerTreeHostInProcess::CommitComplete, which
275 // will run after the commit, but on the main thread.
276 void LayerTreeHostInProcess::FinishCommitOnImplThread(
277 LayerTreeHostImpl* host_impl) {
278 DCHECK(task_runner_provider_->IsImplThread());
279
280 bool is_new_trace;
281 TRACE_EVENT_IS_NEW_TRACE(&is_new_trace);
282 if (is_new_trace &&
283 frame_viewer_instrumentation::IsTracingLayerTreeSnapshots() &&
284 layer_tree_->root_layer()) {
285 LayerTreeHostCommon::CallFunctionForEveryLayer(
286 layer_tree_.get(), [](Layer* layer) { layer->DidBeginTracing(); });
287 }
288
289 LayerTreeImpl* sync_tree = host_impl->sync_tree();
290
291 if (next_commit_forces_redraw_) {
292 sync_tree->ForceRedrawNextActivation();
293 next_commit_forces_redraw_ = false;
294 }
295 if (next_commit_forces_recalculate_raster_scales_) {
296 sync_tree->ForceRecalculateRasterScales();
297 next_commit_forces_recalculate_raster_scales_ = false;
298 }
299
300 sync_tree->set_source_frame_number(SourceFrameNumber());
301
302 if (layer_tree_->needs_full_tree_sync())
303 TreeSynchronizer::SynchronizeTrees(layer_tree_->root_layer(), sync_tree);
304
305 layer_tree_->PushPropertiesTo(sync_tree);
306
307 sync_tree->PassSwapPromises(swap_promise_manager_.TakeSwapPromises());
308
309 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_);
310 host_impl->SetContentIsSuitableForGpuRasterization(
311 content_is_suitable_for_gpu_rasterization_);
312 RecordGpuRasterizationHistogram();
313
314 host_impl->SetViewportSize(layer_tree_->device_viewport_size());
315 sync_tree->SetDeviceScaleFactor(layer_tree_->device_scale_factor());
316 host_impl->SetDebugState(debug_state_);
317
318 sync_tree->set_ui_resource_request_queue(
319 ui_resource_manager_->TakeUIResourcesRequests());
320
321 {
322 TRACE_EVENT0("cc", "LayerTreeHostInProcess::PushProperties");
323
324 TreeSynchronizer::PushLayerProperties(layer_tree_.get(), sync_tree);
325
326 // This must happen after synchronizing property trees and after pushing
327 // properties, which updates the clobber_active_value flag.
328 sync_tree->property_trees()->scroll_tree.PushScrollUpdatesFromMainThread(
329 layer_tree_->property_trees(), sync_tree);
330
331 // This must happen after synchronizing property trees and after push
332 // properties, which updates property tree indices, but before animation
333 // host pushes properties as animation host push properties can change
334 // Animation::InEffect and we want the old InEffect value for updating
335 // property tree scrolling and animation.
336 sync_tree->UpdatePropertyTreeScrollingAndAnimationFromMainThread();
337
338 TRACE_EVENT0("cc", "LayerTreeHostInProcess::AnimationHost::PushProperties");
339 DCHECK(host_impl->mutator_host());
340 layer_tree_->mutator_host()->PushPropertiesTo(host_impl->mutator_host());
341 }
342
343 micro_benchmark_controller_.ScheduleImplBenchmarks(host_impl);
344 layer_tree_->property_trees()->ResetAllChangeTracking();
345 }
346
347 void LayerTreeHostInProcess::WillCommit() {
348 swap_promise_manager_.WillCommit();
349 client_->WillCommit();
350 }
351
352 void LayerTreeHostInProcess::UpdateHudLayer() {}
353
354 void LayerTreeHostInProcess::CommitComplete() {
355 source_frame_number_++;
356 client_->DidCommit();
357 if (did_complete_scale_animation_) {
358 client_->DidCompletePageScaleAnimation();
359 did_complete_scale_animation_ = false;
360 }
361 }
362
363 void LayerTreeHostInProcess::SetCompositorFrameSink(
364 std::unique_ptr<CompositorFrameSink> surface) {
365 TRACE_EVENT0("cc", "LayerTreeHostInProcess::SetCompositorFrameSink");
366 DCHECK(surface);
367
368 DCHECK(!new_compositor_frame_sink_);
369 new_compositor_frame_sink_ = std::move(surface);
370 proxy_->SetCompositorFrameSink(new_compositor_frame_sink_.get());
371 }
372
373 std::unique_ptr<CompositorFrameSink>
374 LayerTreeHostInProcess::ReleaseCompositorFrameSink() {
375 DCHECK(!visible_);
376
377 DidLoseCompositorFrameSink();
378 proxy_->ReleaseCompositorFrameSink();
379 return std::move(current_compositor_frame_sink_);
380 }
381
382 void LayerTreeHostInProcess::RequestNewCompositorFrameSink() {
383 client_->RequestNewCompositorFrameSink();
384 }
385
386 void LayerTreeHostInProcess::DidInitializeCompositorFrameSink() {
387 DCHECK(new_compositor_frame_sink_);
388 current_compositor_frame_sink_ = std::move(new_compositor_frame_sink_);
389 client_->DidInitializeCompositorFrameSink();
390 }
391
392 void LayerTreeHostInProcess::DidFailToInitializeCompositorFrameSink() {
393 DCHECK(new_compositor_frame_sink_);
394 // Note: It is safe to drop all output surface references here as
395 // LayerTreeHostImpl will not keep a pointer to either the old or
396 // new CompositorFrameSink after failing to initialize the new one.
397 current_compositor_frame_sink_ = nullptr;
398 new_compositor_frame_sink_ = nullptr;
399 client_->DidFailToInitializeCompositorFrameSink();
400 }
401
402 std::unique_ptr<LayerTreeHostImpl>
403 LayerTreeHostInProcess::CreateLayerTreeHostImpl(
404 LayerTreeHostImplClient* client) {
405 DCHECK(task_runner_provider_->IsImplThread());
406
407 const bool supports_impl_scrolling = task_runner_provider_->HasImplThread();
408 std::unique_ptr<MutatorHost> mutator_host_impl =
409 layer_tree_->mutator_host()->CreateImplInstance(supports_impl_scrolling);
410
411 std::unique_ptr<LayerTreeHostImpl> host_impl = LayerTreeHostImpl::Create(
412 settings_, client, task_runner_provider_.get(),
413 rendering_stats_instrumentation_.get(), task_graph_runner_,
414 std::move(mutator_host_impl), id_, std::move(image_worker_task_runner_));
415 host_impl->SetHasGpuRasterizationTrigger(has_gpu_rasterization_trigger_);
416 host_impl->SetContentIsSuitableForGpuRasterization(
417 content_is_suitable_for_gpu_rasterization_);
418 task_graph_runner_ = NULL;
419 input_handler_weak_ptr_ = host_impl->AsWeakPtr();
420 return host_impl;
421 }
422
423 void LayerTreeHostInProcess::DidLoseCompositorFrameSink() {
424 TRACE_EVENT0("cc", "LayerTreeHostInProcess::DidLoseCompositorFrameSink");
425 DCHECK(task_runner_provider_->IsMainThread());
426 SetNeedsCommit();
427 }
428
429 void LayerTreeHostInProcess::SetDeferCommits(bool defer_commits) {
430 proxy_->SetDeferCommits(defer_commits);
431 }
432
433 DISABLE_CFI_PERF
434 void LayerTreeHostInProcess::SetNeedsAnimate() {
435 proxy_->SetNeedsAnimate();
436 swap_promise_manager_.NotifySwapPromiseMonitorsOfSetNeedsCommit();
437 }
438
439 DISABLE_CFI_PERF
440 void LayerTreeHostInProcess::SetNeedsUpdateLayers() {
441 proxy_->SetNeedsUpdateLayers();
442 swap_promise_manager_.NotifySwapPromiseMonitorsOfSetNeedsCommit();
443 }
444
445 void LayerTreeHostInProcess::SetNeedsCommit() {
446 proxy_->SetNeedsCommit();
447 swap_promise_manager_.NotifySwapPromiseMonitorsOfSetNeedsCommit();
448 }
449
450 void LayerTreeHostInProcess::SetNeedsRecalculateRasterScales() {
451 next_commit_forces_recalculate_raster_scales_ = true;
452 proxy_->SetNeedsCommit();
453 }
454
455 void LayerTreeHostInProcess::SetNeedsRedrawRect(const gfx::Rect& damage_rect) {
456 proxy_->SetNeedsRedraw(damage_rect);
457 }
458
459 bool LayerTreeHostInProcess::CommitRequested() const {
460 return proxy_->CommitRequested();
461 }
462
463 void LayerTreeHostInProcess::SetNextCommitWaitsForActivation() {
464 proxy_->SetNextCommitWaitsForActivation();
465 }
466
467 void LayerTreeHostInProcess::SetNextCommitForcesRedraw() {
468 next_commit_forces_redraw_ = true;
469 proxy_->SetNeedsUpdateLayers();
470 }
471
472 void LayerTreeHostInProcess::SetAnimationEvents(
473 std::unique_ptr<MutatorEvents> events) {
474 DCHECK(task_runner_provider_->IsMainThread());
475 layer_tree_->mutator_host()->SetAnimationEvents(std::move(events));
476 }
477
478 void LayerTreeHostInProcess::SetDebugState(
479 const LayerTreeDebugState& debug_state) {
480 LayerTreeDebugState new_debug_state =
481 LayerTreeDebugState::Unite(settings_.initial_debug_state, debug_state);
482
483 if (LayerTreeDebugState::Equal(debug_state_, new_debug_state))
484 return;
485
486 debug_state_ = new_debug_state;
487
488 rendering_stats_instrumentation_->set_record_rendering_stats(
489 debug_state_.RecordRenderingStats());
490
491 SetNeedsCommit();
492 }
493
494 void LayerTreeHostInProcess::ResetGpuRasterizationTracking() {
495 content_is_suitable_for_gpu_rasterization_ = true;
496 gpu_rasterization_histogram_recorded_ = false;
497 }
498
499 void LayerTreeHostInProcess::SetHasGpuRasterizationTrigger(bool has_trigger) {
500 if (has_trigger == has_gpu_rasterization_trigger_)
501 return;
502
503 has_gpu_rasterization_trigger_ = has_trigger;
504 TRACE_EVENT_INSTANT1(
505 "cc", "LayerTreeHostInProcess::SetHasGpuRasterizationTrigger",
506 TRACE_EVENT_SCOPE_THREAD, "has_trigger", has_gpu_rasterization_trigger_);
507 }
508
509 void LayerTreeHostInProcess::ApplyPageScaleDeltaFromImplSide(
510 float page_scale_delta) {
511 DCHECK(CommitRequested());
512 if (page_scale_delta == 1.f)
513 return;
514 float page_scale = layer_tree_->page_scale_factor() * page_scale_delta;
515 layer_tree_->SetPageScaleFromImplSide(page_scale);
516 }
517
518 void LayerTreeHostInProcess::SetVisible(bool visible) {
519 if (visible_ == visible)
520 return;
521 visible_ = visible;
522 proxy_->SetVisible(visible);
523 }
524
525 bool LayerTreeHostInProcess::IsVisible() const {
526 return visible_;
527 }
528
529 void LayerTreeHostInProcess::NotifyInputThrottledUntilCommit() {
530 proxy_->NotifyInputThrottledUntilCommit();
531 }
532
533 void LayerTreeHostInProcess::LayoutAndUpdateLayers() {
534 DCHECK(IsSingleThreaded());
535 // This function is only valid when not using the scheduler.
536 DCHECK(!settings_.single_thread_proxy_scheduler);
537 RequestMainFrameUpdate();
538 UpdateLayers();
539 }
540
541 void LayerTreeHostInProcess::Composite(base::TimeTicks frame_begin_time) {
542 DCHECK(IsSingleThreaded());
543 // This function is only valid when not using the scheduler.
544 DCHECK(!settings_.single_thread_proxy_scheduler);
545 SingleThreadProxy* proxy = static_cast<SingleThreadProxy*>(proxy_.get());
546
547 proxy->CompositeImmediately(frame_begin_time);
548 }
549
550 static int GetLayersUpdateTimeHistogramBucket(size_t numLayers) {
551 // We uses the following exponential (ratio 2) bucketization:
552 // [0, 10), [10, 30), [30, 70), [70, 150), [150, infinity)
553 if (numLayers < 10)
554 return 0;
555 if (numLayers < 30)
556 return 1;
557 if (numLayers < 70)
558 return 2;
559 if (numLayers < 150)
560 return 3;
561 return 4;
562 }
563
564 bool LayerTreeHostInProcess::UpdateLayers() {
565 if (!layer_tree_->root_layer()) {
566 layer_tree_->property_trees()->clear();
567 return false;
568 }
569 DCHECK(!layer_tree_->root_layer()->parent());
570 base::ElapsedTimer timer;
571
572 bool result = DoUpdateLayers(layer_tree_->root_layer());
573 micro_benchmark_controller_.DidUpdateLayers();
574
575 if (const char* client_name = GetClientNameForMetrics()) {
576 std::string histogram_name = base::StringPrintf(
577 "Compositing.%s.LayersUpdateTime.%d", client_name,
578 GetLayersUpdateTimeHistogramBucket(layer_tree_->NumLayers()));
579 base::Histogram::FactoryGet(histogram_name, 0, 10000000, 50,
580 base::HistogramBase::kUmaTargetedHistogramFlag)
581 ->Add(timer.Elapsed().InMicroseconds());
582 }
583
584 return result || next_commit_forces_redraw_;
585 }
586
587 void LayerTreeHostInProcess::DidCompletePageScaleAnimation() {
588 did_complete_scale_animation_ = true;
589 }
590
591 void LayerTreeHostInProcess::RecordGpuRasterizationHistogram() {
592 // Gpu rasterization is only supported for Renderer compositors.
593 // Checking for IsSingleThreaded() to exclude Browser compositors.
594 if (gpu_rasterization_histogram_recorded_ || IsSingleThreaded())
595 return;
596
597 // Record how widely gpu rasterization is enabled.
598 // This number takes device/gpu whitelisting/backlisting into account.
599 // Note that we do not consider the forced gpu rasterization mode, which is
600 // mostly used for debugging purposes.
601 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationEnabled",
602 settings_.gpu_rasterization_enabled);
603 if (settings_.gpu_rasterization_enabled) {
604 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationTriggered",
605 has_gpu_rasterization_trigger_);
606 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationSuitableContent",
607 content_is_suitable_for_gpu_rasterization_);
608 // Record how many pages actually get gpu rasterization when enabled.
609 UMA_HISTOGRAM_BOOLEAN("Renderer4.GpuRasterizationUsed",
610 (has_gpu_rasterization_trigger_ &&
611 content_is_suitable_for_gpu_rasterization_));
612 }
613
614 gpu_rasterization_histogram_recorded_ = true;
615 }
616
617 bool LayerTreeHostInProcess::DoUpdateLayers(Layer* root_layer) {
618 TRACE_EVENT1("cc", "LayerTreeHostInProcess::DoUpdateLayers",
619 "source_frame_number", SourceFrameNumber());
620
621 layer_tree_->UpdateHudLayer(debug_state_.ShowHudInfo());
622 UpdateHudLayer();
623
624 Layer* root_scroll =
625 PropertyTreeBuilder::FindFirstScrollableLayer(root_layer);
626 Layer* page_scale_layer = layer_tree_->page_scale_layer();
627 if (!page_scale_layer && root_scroll)
628 page_scale_layer = root_scroll->parent();
629
630 if (layer_tree_->hud_layer()) {
631 layer_tree_->hud_layer()->PrepareForCalculateDrawProperties(
632 layer_tree_->device_viewport_size(),
633 layer_tree_->device_scale_factor());
634 }
635
636 gfx::Transform identity_transform;
637 LayerList update_layer_list;
638
639 {
640 TRACE_EVENT0("cc",
641 "LayerTreeHostInProcess::UpdateLayers::BuildPropertyTrees");
642 TRACE_EVENT0(
643 TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"),
644 "LayerTreeHostInProcessCommon::ComputeVisibleRectsWithPropertyTrees");
645 PropertyTreeBuilder::PreCalculateMetaInformation(root_layer);
646 bool can_render_to_separate_surface = true;
647 PropertyTrees* property_trees = layer_tree_->property_trees();
648 if (!settings_.use_layer_lists) {
649 // If use_layer_lists is set, then the property trees should have been
650 // built by the client already.
651 PropertyTreeBuilder::BuildPropertyTrees(
652 root_layer, page_scale_layer,
653 layer_tree_->inner_viewport_scroll_layer(),
654 layer_tree_->outer_viewport_scroll_layer(),
655 layer_tree_->overscroll_elasticity_layer(),
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(
661 "cc", "LayerTreeHostInProcess::UpdateLayers_BuiltPropertyTrees",
662 TRACE_EVENT_SCOPE_THREAD, "property_trees",
663 property_trees->AsTracedValue());
664 } else {
665 TRACE_EVENT_INSTANT1(
666 "cc", "LayerTreeHostInProcess::UpdateLayers_ReceivedPropertyTrees",
667 TRACE_EVENT_SCOPE_THREAD, "property_trees",
668 property_trees->AsTracedValue());
669 }
670 draw_property_utils::UpdatePropertyTrees(property_trees,
671 can_render_to_separate_surface);
672 draw_property_utils::FindLayersThatNeedUpdates(
673 layer_tree_.get(), property_trees, &update_layer_list);
674 }
675
676 for (const auto& layer : update_layer_list)
677 layer->SavePaintProperties();
678
679 bool content_is_suitable_for_gpu = true;
680 bool did_paint_content = layer_tree_->UpdateLayers(
681 update_layer_list, &content_is_suitable_for_gpu);
682
683 if (content_is_suitable_for_gpu) {
684 ++num_consecutive_frames_suitable_for_gpu_;
685 if (num_consecutive_frames_suitable_for_gpu_ >=
686 kNumFramesToConsiderBeforeGpuRasterization) {
687 content_is_suitable_for_gpu_rasterization_ = true;
688 }
689 } else {
690 num_consecutive_frames_suitable_for_gpu_ = 0;
691 content_is_suitable_for_gpu_rasterization_ = false;
692 }
693 return did_paint_content;
694 }
695
696 void LayerTreeHostInProcess::ApplyViewportDeltas(ScrollAndScaleSet* info) {
697 gfx::Vector2dF inner_viewport_scroll_delta;
698 if (info->inner_viewport_scroll.layer_id != Layer::INVALID_ID)
699 inner_viewport_scroll_delta = info->inner_viewport_scroll.scroll_delta;
700
701 if (inner_viewport_scroll_delta.IsZero() && info->page_scale_delta == 1.f &&
702 info->elastic_overscroll_delta.IsZero() && !info->top_controls_delta)
703 return;
704
705 // 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
707 // value, then the layer can early out without needing a full commit.
708 if (layer_tree_->inner_viewport_scroll_layer()) {
709 layer_tree_->inner_viewport_scroll_layer()->SetScrollOffsetFromImplSide(
710 gfx::ScrollOffsetWithDelta(
711 layer_tree_->inner_viewport_scroll_layer()->scroll_offset(),
712 inner_viewport_scroll_delta));
713 }
714
715 ApplyPageScaleDeltaFromImplSide(info->page_scale_delta);
716 layer_tree_->SetElasticOverscrollFromImplSide(
717 layer_tree_->elastic_overscroll() + info->elastic_overscroll_delta);
718 // TODO(ccameron): pass the elastic overscroll here so that input events
719 // may be translated appropriately.
720 client_->ApplyViewportDeltas(inner_viewport_scroll_delta, gfx::Vector2dF(),
721 info->elastic_overscroll_delta,
722 info->page_scale_delta,
723 info->top_controls_delta);
724 SetNeedsUpdateLayers();
725 }
726
727 void LayerTreeHostInProcess::ApplyScrollAndScale(ScrollAndScaleSet* info) {
728 for (auto& swap_promise : info->swap_promises) {
729 TRACE_EVENT_WITH_FLOW1("input,benchmark", "LatencyInfo.Flow",
730 TRACE_ID_DONT_MANGLE(swap_promise->TraceId()),
731 TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT,
732 "step", "Main thread scroll update");
733 swap_promise_manager_.QueueSwapPromise(std::move(swap_promise));
734 }
735
736 if (layer_tree_->root_layer()) {
737 for (size_t i = 0; i < info->scrolls.size(); ++i) {
738 Layer* layer = layer_tree_->LayerById(info->scrolls[i].layer_id);
739 if (!layer)
740 continue;
741 layer->SetScrollOffsetFromImplSide(gfx::ScrollOffsetWithDelta(
742 layer->scroll_offset(), info->scrolls[i].scroll_delta));
743 SetNeedsUpdateLayers();
744 }
745 for (size_t i = 0; i < info->scrollbars.size(); ++i) {
746 Layer* layer = layer_tree_->LayerById(info->scrollbars[i].layer_id);
747 if (!layer)
748 continue;
749 layer->SetScrollbarsHiddenFromImplSide(info->scrollbars[i].hidden);
750 }
751 }
752
753 // 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
755 // on the main thread.
756 ApplyViewportDeltas(info);
757 }
758
759 const base::WeakPtr<InputHandler>& LayerTreeHostInProcess::GetInputHandler()
760 const {
761 return input_handler_weak_ptr_;
762 }
763
764 void LayerTreeHostInProcess::UpdateBrowserControlsState(
765 BrowserControlsState constraints,
766 BrowserControlsState current,
767 bool animate) {
768 // Browser controls are only used in threaded mode.
769 DCHECK(IsThreaded());
770 proxy_->UpdateBrowserControlsState(constraints, current, animate);
771 }
772
773 void LayerTreeHostInProcess::AnimateLayers(base::TimeTicks monotonic_time) {
774 MutatorHost* mutator_host = layer_tree_->mutator_host();
775 std::unique_ptr<MutatorEvents> events = mutator_host->CreateEvents();
776
777 if (mutator_host->TickAnimations(monotonic_time))
778 mutator_host->UpdateAnimationState(true, events.get());
779
780 if (!events->IsEmpty())
781 layer_tree_->property_trees()->needs_rebuild = true;
782 }
783
784 int LayerTreeHostInProcess::ScheduleMicroBenchmark(
785 const std::string& benchmark_name,
786 std::unique_ptr<base::Value> value,
787 const MicroBenchmark::DoneCallback& callback) {
788 return micro_benchmark_controller_.ScheduleRun(benchmark_name,
789 std::move(value), callback);
790 }
791
792 bool LayerTreeHostInProcess::SendMessageToMicroBenchmark(
793 int id,
794 std::unique_ptr<base::Value> value) {
795 return micro_benchmark_controller_.SendMessage(id, std::move(value));
796 }
797
798 void LayerTreeHostInProcess::SetLayerTreeMutator(
799 std::unique_ptr<LayerTreeMutator> mutator) {
800 proxy_->SetMutator(std::move(mutator));
801 }
802
803 bool LayerTreeHostInProcess::IsSingleThreaded() const {
804 DCHECK(compositor_mode_ != CompositorMode::SINGLE_THREADED ||
805 !task_runner_provider_->HasImplThread());
806 return compositor_mode_ == CompositorMode::SINGLE_THREADED;
807 }
808
809 bool LayerTreeHostInProcess::IsThreaded() const {
810 DCHECK(compositor_mode_ != CompositorMode::THREADED ||
811 task_runner_provider_->HasImplThread());
812 return compositor_mode_ == CompositorMode::THREADED;
813 }
814
815 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/layer_tree_host_in_process.h ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698