blob: 92e1d844d0401c97a021b0a982b4506d7b77e75d [file] [log] [blame]
[email protected]94f206c12012-08-25 00:09:141// 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
[email protected]556fd292013-03-18 08:03:045#include "cc/trees/single_thread_proxy.h"
[email protected]94f206c12012-08-25 00:09:146
[email protected]74d9063c2013-01-18 03:14:477#include "base/auto_reset.h"
danakj60bc3bc2016-04-09 00:24:488#include "base/memory/ptr_util.h"
primianoc06e2382015-01-28 04:21:499#include "base/trace_event/trace_event.h"
chrishtr82b5d9502017-03-20 18:25:3310#include "cc/base/devtools_instrumentation.h"
11#include "cc/benchmarks/benchmark_instrumentation.h"
David Bokan1e37ebf2018-10-16 13:53:3712#include "cc/input/browser_controls_offset_manager.h"
Xida Chend5ee5052019-01-03 13:27:5113#include "cc/paint/paint_worklet_layer_painter.h"
khushalsagar8ec07402016-09-10 03:13:1914#include "cc/resources/ui_resource_manager.h"
mithrof7a21502014-12-17 03:24:4815#include "cc/scheduler/commit_earlyout_reason.h"
briandersonc9f50352015-06-24 03:38:5816#include "cc/scheduler/compositor_timing_history.h"
17#include "cc/scheduler/scheduler.h"
Brian Anderson242b9b02017-12-06 21:06:2618#include "cc/trees/latency_info_swap_promise.h"
danakjba65a0912017-09-21 16:38:4219#include "cc/trees/layer_tree_frame_sink.h"
khushalsagare0e4486e2017-01-25 03:15:0320#include "cc/trees/layer_tree_host.h"
jaydasika13c05062016-04-01 18:12:2721#include "cc/trees/layer_tree_host_common.h"
[email protected]943528e2013-11-07 05:01:3222#include "cc/trees/layer_tree_host_single_thread_client.h"
[email protected]556fd292013-03-18 08:03:0423#include "cc/trees/layer_tree_impl.h"
loysoc601b7b82016-11-10 02:56:4424#include "cc/trees/mutator_host.h"
jonrossa2ff4f82018-02-16 17:27:4625#include "cc/trees/render_frame_metadata_observer.h"
[email protected]aeeedad2014-08-22 18:16:2226#include "cc/trees/scoped_abort_remaining_swap_promises.h"
Fady Samuelc645ffe2017-07-24 17:28:2027#include "components/viz/common/frame_sinks/delay_based_time_source.h"
Xu Xing32549162017-07-17 22:25:4328#include "components/viz/common/gpu/context_provider.h"
[email protected]94f206c12012-08-25 00:09:1429
[email protected]9c88e562012-09-14 22:21:3030namespace cc {
[email protected]94f206c12012-08-25 00:09:1431
danakj60bc3bc2016-04-09 00:24:4832std::unique_ptr<Proxy> SingleThreadProxy::Create(
khushalsagare0e4486e2017-01-25 03:15:0333 LayerTreeHost* layer_tree_host,
[email protected]27e6a212014-07-18 15:51:2734 LayerTreeHostSingleThreadClient* client,
khushalsagar767dd522015-12-16 05:14:0535 TaskRunnerProvider* task_runner_provider) {
danakj60bc3bc2016-04-09 00:24:4836 return base::WrapUnique(
khushalsagar767dd522015-12-16 05:14:0537 new SingleThreadProxy(layer_tree_host, client, task_runner_provider));
[email protected]94f206c12012-08-25 00:09:1438}
39
khushalsagare0e4486e2017-01-25 03:15:0340SingleThreadProxy::SingleThreadProxy(LayerTreeHost* layer_tree_host,
khushalsagar767dd522015-12-16 05:14:0541 LayerTreeHostSingleThreadClient* client,
42 TaskRunnerProvider* task_runner_provider)
khushalsagarb7db1fe2015-11-12 00:51:2743 : layer_tree_host_(layer_tree_host),
danakj6c872fc02016-10-22 04:29:4944 single_thread_client_(client),
khushalsagarb7db1fe2015-11-12 00:51:2745 task_runner_provider_(task_runner_provider),
[email protected]a8a049c2013-03-11 23:27:0646 next_frame_is_newly_committed_frame_(false),
mithro51693e382015-05-07 23:52:4147#if DCHECK_IS_ON()
mithro69fd3bb52015-05-01 03:45:0248 inside_impl_frame_(false),
mithro51693e382015-05-07 23:52:4149#endif
[email protected]aeeedad2014-08-22 18:16:2250 inside_draw_(false),
Stephen Chenney6d3f5ce2018-11-14 02:08:0551 defer_main_frame_update_(false),
brianderson49e101d22015-04-29 00:05:3352 animate_requested_(false),
[email protected]aeeedad2014-08-22 18:16:2253 commit_requested_(false),
jbauman399aec1a2014-10-25 02:33:3254 inside_synchronous_composite_(false),
David Bokaneaa5cc82018-10-12 15:50:4055 needs_impl_frame_(false),
danakjc7afae52017-06-20 21:12:4156 layer_tree_frame_sink_creation_requested_(false),
57 layer_tree_frame_sink_lost_(true),
samans44b6dfc2017-04-19 16:50:5358 frame_sink_bound_weak_factory_(this),
[email protected]aeeedad2014-08-22 18:16:2259 weak_factory_(this) {
[email protected]a8a049c2013-03-11 23:27:0660 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy");
khushalsagarb7db1fe2015-11-12 00:51:2761 DCHECK(task_runner_provider_);
62 DCHECK(task_runner_provider_->IsMainThread());
[email protected]a8a049c2013-03-11 23:27:0663 DCHECK(layer_tree_host);
khushalsagar767dd522015-12-16 05:14:0564}
danakjfcdaba122015-04-24 21:41:5265
enne2b0ad682016-09-21 01:44:4766void SingleThreadProxy::Start() {
khushalsagar767dd522015-12-16 05:14:0567 DebugScopedSetImplThread impl(task_runner_provider_);
khushalsagar767dd522015-12-16 05:14:0568
khushalsagarcebe4942016-09-07 23:27:0169 const LayerTreeSettings& settings = layer_tree_host_->GetSettings();
khushalsagar6dc91d02017-02-28 05:10:0770 DCHECK(settings.single_thread_proxy_scheduler ||
71 !settings.enable_checker_imaging)
72 << "Checker-imaging is not supported in synchronous single threaded mode";
khushalsagarcebe4942016-09-07 23:27:0173 if (settings.single_thread_proxy_scheduler && !scheduler_on_impl_thread_) {
74 SchedulerSettings scheduler_settings(settings.ToSchedulerSettings());
danakj5f2e92de2015-06-20 00:25:5875 scheduler_settings.commit_to_active_tree = CommitToActiveTree();
briandersonc9f50352015-06-24 03:38:5876
danakj60bc3bc2016-04-09 00:24:4877 std::unique_ptr<CompositorTimingHistory> compositor_timing_history(
briandersonc9f50352015-06-24 03:38:5878 new CompositorTimingHistory(
briandersonbb917dd2016-02-20 05:21:1479 scheduler_settings.using_synchronous_renderer_compositor,
briandersonc68220f2015-07-20 20:08:3580 CompositorTimingHistory::BROWSER_UMA,
khushalsagar767dd522015-12-16 05:14:0581 layer_tree_host_->rendering_stats_instrumentation()));
enne2b0ad682016-09-21 01:44:4782 scheduler_on_impl_thread_.reset(
83 new Scheduler(this, scheduler_settings, layer_tree_host_->GetId(),
84 task_runner_provider_->MainThreadTaskRunner(),
85 std::move(compositor_timing_history)));
danakjfcdaba122015-04-24 21:41:5286 }
[email protected]94f206c12012-08-25 00:09:1487
Walter Kormanaa326e42017-08-22 23:04:4388 host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this);
[email protected]a8a049c2013-03-11 23:27:0689}
90
91SingleThreadProxy::~SingleThreadProxy() {
92 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy");
khushalsagarb7db1fe2015-11-12 00:51:2793 DCHECK(task_runner_provider_->IsMainThread());
[email protected]04049fc2013-05-01 03:13:2094 // Make sure Stop() got called or never Started.
Walter Kormanaa326e42017-08-22 23:04:4395 DCHECK(!host_impl_);
[email protected]a8a049c2013-03-11 23:27:0696}
97
[email protected]a8a049c2013-03-11 23:27:0698bool SingleThreadProxy::IsStarted() const {
khushalsagarb7db1fe2015-11-12 00:51:2799 DCHECK(task_runner_provider_->IsMainThread());
Walter Kormanaa326e42017-08-22 23:04:43100 return !!host_impl_;
[email protected]94f206c12012-08-25 00:09:14101}
102
danakj009cdfdf2015-02-17 22:35:14103bool SingleThreadProxy::CommitToActiveTree() const {
104 // With SingleThreadProxy we skip the pending tree and commit directly to the
105 // active tree.
106 return true;
107}
108
[email protected]a8a049c2013-03-11 23:27:06109void SingleThreadProxy::SetVisible(bool visible) {
mithro46adf5a2014-11-19 14:52:40110 TRACE_EVENT1("cc", "SingleThreadProxy::SetVisible", "visible", visible);
khushalsagarb7db1fe2015-11-12 00:51:27111 DebugScopedSetImplThread impl(task_runner_provider_);
sunnypsc3f6e0c2015-07-25 01:00:59112
Walter Kormanaa326e42017-08-22 23:04:43113 host_impl_->SetVisible(visible);
sunnypsc3f6e0c2015-07-25 01:00:59114
[email protected]aeeedad2014-08-22 18:16:22115 if (scheduler_on_impl_thread_)
Walter Kormanaa326e42017-08-22 23:04:43116 scheduler_on_impl_thread_->SetVisible(host_impl_->visible());
[email protected]a8a049c2013-03-11 23:27:06117}
118
danakjc7afae52017-06-20 21:12:41119void SingleThreadProxy::RequestNewLayerTreeFrameSink() {
khushalsagarb7db1fe2015-11-12 00:51:27120 DCHECK(task_runner_provider_->IsMainThread());
danakjc7afae52017-06-20 21:12:41121 layer_tree_frame_sink_creation_callback_.Cancel();
122 if (layer_tree_frame_sink_creation_requested_)
jbauman8ab0f9e2014-10-15 02:30:34123 return;
danakjc7afae52017-06-20 21:12:41124 layer_tree_frame_sink_creation_requested_ = true;
125 layer_tree_host_->RequestNewLayerTreeFrameSink();
enne2097cab2014-09-25 20:16:31126}
[email protected]94f206c12012-08-25 00:09:14127
danakjc7afae52017-06-20 21:12:41128void SingleThreadProxy::ReleaseLayerTreeFrameSink() {
129 layer_tree_frame_sink_lost_ = true;
samans44b6dfc2017-04-19 16:50:53130 frame_sink_bound_weak_factory_.InvalidateWeakPtrs();
sohan.jyoti3a33d872015-09-18 22:32:55131 if (scheduler_on_impl_thread_)
danakjc7afae52017-06-20 21:12:41132 scheduler_on_impl_thread_->DidLoseLayerTreeFrameSink();
Walter Kormanaa326e42017-08-22 23:04:43133 return host_impl_->ReleaseLayerTreeFrameSink();
sohan.jyoti3a33d872015-09-18 22:32:55134}
135
danakjc7afae52017-06-20 21:12:41136void SingleThreadProxy::SetLayerTreeFrameSink(
137 LayerTreeFrameSink* layer_tree_frame_sink) {
khushalsagarb7db1fe2015-11-12 00:51:27138 DCHECK(task_runner_provider_->IsMainThread());
danakjc7afae52017-06-20 21:12:41139 DCHECK(layer_tree_frame_sink_creation_requested_);
[email protected]da8e3b72b2014-04-25 02:33:45140
enne7f8fdde2014-12-10 21:32:09141 bool success;
142 {
khushalsagarb7db1fe2015-11-12 00:51:27143 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
144 DebugScopedSetImplThread impl(task_runner_provider_);
Xu Xing31616b92018-06-28 00:24:27145 success = host_impl_->InitializeFrameSink(layer_tree_frame_sink);
[email protected]04049fc2013-05-01 03:13:20146 }
147
[email protected]aeeedad2014-08-22 18:16:22148 if (success) {
samans44b6dfc2017-04-19 16:50:53149 frame_sink_bound_weak_ptr_ = frame_sink_bound_weak_factory_.GetWeakPtr();
danakjc7afae52017-06-20 21:12:41150 layer_tree_host_->DidInitializeLayerTreeFrameSink();
[email protected]aeeedad2014-08-22 18:16:22151 if (scheduler_on_impl_thread_)
danakjc7afae52017-06-20 21:12:41152 scheduler_on_impl_thread_->DidCreateAndInitializeLayerTreeFrameSink();
jbauman399aec1a2014-10-25 02:33:32153 else if (!inside_synchronous_composite_)
154 SetNeedsCommit();
danakjc7afae52017-06-20 21:12:41155 layer_tree_frame_sink_creation_requested_ = false;
156 layer_tree_frame_sink_lost_ = false;
enne7f8fdde2014-12-10 21:32:09157 } else {
danakjc7afae52017-06-20 21:12:41158 // DidFailToInitializeLayerTreeFrameSink is treated as a
159 // RequestNewLayerTreeFrameSink, and so
160 // layer_tree_frame_sink_creation_requested remains true.
161 layer_tree_host_->DidFailToInitializeLayerTreeFrameSink();
[email protected]04049fc2013-05-01 03:13:20162 }
[email protected]94f206c12012-08-25 00:09:14163}
164
[email protected]8b9e52b2014-01-17 16:35:31165void SingleThreadProxy::SetNeedsAnimate() {
[email protected]ccc08dc2014-01-30 07:33:20166 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsAnimate");
khushalsagarb7db1fe2015-11-12 00:51:27167 DCHECK(task_runner_provider_->IsMainThread());
brianderson49e101d22015-04-29 00:05:33168 if (animate_requested_)
169 return;
170 animate_requested_ = true;
khushalsagarb7db1fe2015-11-12 00:51:27171 DebugScopedSetImplThread impl(task_runner_provider_);
brianderson49e101d22015-04-29 00:05:33172 if (scheduler_on_impl_thread_)
mithroe77254b32015-07-22 09:36:01173 scheduler_on_impl_thread_->SetNeedsBeginMainFrame();
[email protected]c5134172013-12-11 06:19:48174}
175
[email protected]8b9e52b2014-01-17 16:35:31176void SingleThreadProxy::SetNeedsUpdateLayers() {
[email protected]ccc08dc2014-01-30 07:33:20177 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsUpdateLayers");
khushalsagarb7db1fe2015-11-12 00:51:27178 DCHECK(task_runner_provider_->IsMainThread());
[email protected]aeeedad2014-08-22 18:16:22179 SetNeedsCommit();
[email protected]8b9e52b2014-01-17 16:35:31180}
181
enne98f3a6c2014-10-09 20:09:44182void SingleThreadProxy::DoCommit() {
[email protected]ccc08dc2014-01-30 07:33:20183 TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit");
khushalsagarb7db1fe2015-11-12 00:51:27184 DCHECK(task_runner_provider_->IsMainThread());
enne98f3a6c2014-10-09 20:09:44185
[email protected]aeeedad2014-08-22 18:16:22186 layer_tree_host_->WillCommit();
caseq7d2f4c92015-02-04 16:43:27187 devtools_instrumentation::ScopedCommitTrace commit_task(
khushalsagarcebe4942016-09-07 23:27:01188 layer_tree_host_->GetId());
[email protected]aeeedad2014-08-22 18:16:22189
[email protected]a8a049c2013-03-11 23:27:06190 // Commit immediately.
191 {
khushalsagarb7db1fe2015-11-12 00:51:27192 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
193 DebugScopedSetImplThread impl(task_runner_provider_);
[email protected]f7c01c82013-07-02 22:58:46194
Walter Kormanaa326e42017-08-22 23:04:43195 host_impl_->ReadyToCommit();
196 host_impl_->BeginCommit();
[email protected]94f206c12012-08-25 00:09:14197
Walter Kormanaa326e42017-08-22 23:04:43198 if (host_impl_->EvictedUIResourcesExist())
khushalsagar8ec07402016-09-10 03:13:19199 layer_tree_host_->GetUIResourceManager()->RecreateUIResources();
[email protected]127bdc1a2013-09-11 01:44:48200
Walter Kormanaa326e42017-08-22 23:04:43201 layer_tree_host_->FinishCommitOnImplThread(host_impl_.get());
[email protected]94f206c12012-08-25 00:09:14202
danakj3c3973b2015-08-25 21:50:18203 if (scheduler_on_impl_thread_)
204 scheduler_on_impl_thread_->DidCommit();
205
vmpstra840c6a2017-06-01 21:50:39206 IssueImageDecodeFinishedCallbacks();
Walter Kormanaa326e42017-08-22 23:04:43207 host_impl_->CommitComplete();
danakj3c3973b2015-08-25 21:50:18208
danakj68803fc2015-06-19 20:55:53209 // Commit goes directly to the active tree, but we need to synchronously
210 // "activate" the tree still during commit to satisfy any potential
211 // SetNextCommitWaitsForActivation calls. Unfortunately, the tree
212 // might not be ready to draw, so DidActivateSyncTree must set
213 // the flag to force the tree to not draw until textures are ready.
214 NotifyReadyToActivate();
enne98f3a6c2014-10-09 20:09:44215 }
216}
217
vmpstra840c6a2017-06-01 21:50:39218void SingleThreadProxy::IssueImageDecodeFinishedCallbacks() {
219 DCHECK(task_runner_provider_->IsImplThread());
220
Vladimir Levinbed5b372017-10-26 23:46:31221 layer_tree_host_->ImageDecodesFinished(
222 host_impl_->TakeCompletedImageDecodeRequests());
vmpstra840c6a2017-06-01 21:50:39223}
224
enne98f3a6c2014-10-09 20:09:44225void SingleThreadProxy::CommitComplete() {
danakj3c3973b2015-08-25 21:50:18226 // Commit complete happens on the main side after activate to satisfy any
227 // SetNextCommitWaitsForActivation calls.
Walter Kormanaa326e42017-08-22 23:04:43228 DCHECK(!host_impl_->pending_tree())
enne98f3a6c2014-10-09 20:09:44229 << "Activation is expected to have synchronously occurred by now.";
enne98f3a6c2014-10-09 20:09:44230
khushalsagarb7db1fe2015-11-12 00:51:27231 DebugScopedSetMainThread main(task_runner_provider_);
[email protected]804c8982013-03-13 16:32:21232 layer_tree_host_->CommitComplete();
[email protected]aeeedad2014-08-22 18:16:22233 layer_tree_host_->DidBeginMainFrame();
[email protected]aeeedad2014-08-22 18:16:22234
[email protected]a8a049c2013-03-11 23:27:06235 next_frame_is_newly_committed_frame_ = true;
[email protected]94f206c12012-08-25 00:09:14236}
237
[email protected]a8a049c2013-03-11 23:27:06238void SingleThreadProxy::SetNeedsCommit() {
khushalsagarb7db1fe2015-11-12 00:51:27239 DCHECK(task_runner_provider_->IsMainThread());
danakj6c872fc02016-10-22 04:29:49240 single_thread_client_->RequestScheduleComposite();
danakjfcdaba122015-04-24 21:41:52241 if (commit_requested_)
242 return;
brianderson49e101d22015-04-29 00:05:33243 commit_requested_ = true;
khushalsagarb7db1fe2015-11-12 00:51:27244 DebugScopedSetImplThread impl(task_runner_provider_);
[email protected]aeeedad2014-08-22 18:16:22245 if (scheduler_on_impl_thread_)
mithroe77254b32015-07-22 09:36:01246 scheduler_on_impl_thread_->SetNeedsBeginMainFrame();
[email protected]94f206c12012-08-25 00:09:14247}
248
[email protected]0023fc72014-01-10 20:05:06249void SingleThreadProxy::SetNeedsRedraw(const gfx::Rect& damage_rect) {
[email protected]ccc08dc2014-01-30 07:33:20250 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsRedraw");
khushalsagarb7db1fe2015-11-12 00:51:27251 DCHECK(task_runner_provider_->IsMainThread());
252 DebugScopedSetImplThread impl(task_runner_provider_);
Walter Kormanaa326e42017-08-22 23:04:43253 host_impl_->SetViewportDamage(damage_rect);
danakje41d978a2016-09-19 21:09:28254 SetNeedsRedrawOnImplThread();
[email protected]94f206c12012-08-25 00:09:14255}
256
[email protected]74b43cc2013-08-30 06:29:27257void SingleThreadProxy::SetNextCommitWaitsForActivation() {
enne98f3a6c2014-10-09 20:09:44258 // Activation always forced in commit, so nothing to do.
khushalsagarb7db1fe2015-11-12 00:51:27259 DCHECK(task_runner_provider_->IsMainThread());
[email protected]74b43cc2013-08-30 06:29:27260}
261
danakje6da4f12018-07-04 17:41:30262bool SingleThreadProxy::RequestedAnimatePending() {
David Bokaneaa5cc82018-10-12 15:50:40263 return animate_requested_ || commit_requested_ || needs_impl_frame_;
danakje6da4f12018-07-04 17:41:30264}
265
Stephen Chenney6d3f5ce2018-11-14 02:08:05266void SingleThreadProxy::SetDeferMainFrameUpdate(bool defer_main_frame_update) {
khushalsagarb7db1fe2015-11-12 00:51:27267 DCHECK(task_runner_provider_->IsMainThread());
[email protected]aeeedad2014-08-22 18:16:22268 // Deferring commits only makes sense if there's a scheduler.
269 if (!scheduler_on_impl_thread_)
270 return;
Stephen Chenney6d3f5ce2018-11-14 02:08:05271 if (defer_main_frame_update_ == defer_main_frame_update)
[email protected]aeeedad2014-08-22 18:16:22272 return;
273
Stephen Chenney6d3f5ce2018-11-14 02:08:05274 if (defer_main_frame_update)
275 TRACE_EVENT_ASYNC_BEGIN0("cc", "SingleThreadProxy::SetDeferMainFrameUpdate",
276 this);
[email protected]aeeedad2014-08-22 18:16:22277 else
Stephen Chenney6d3f5ce2018-11-14 02:08:05278 TRACE_EVENT_ASYNC_END0("cc", "SingleThreadProxy::SetDeferMainFrameUpdate",
279 this);
[email protected]aeeedad2014-08-22 18:16:22280
Stephen Chenney6d3f5ce2018-11-14 02:08:05281 defer_main_frame_update_ = defer_main_frame_update;
282 scheduler_on_impl_thread_->SetDeferMainFrameUpdate(defer_main_frame_update);
[email protected]6b16679e2012-10-27 00:44:28283}
284
[email protected]174c6d42014-08-12 01:43:06285bool SingleThreadProxy::CommitRequested() const {
khushalsagarb7db1fe2015-11-12 00:51:27286 DCHECK(task_runner_provider_->IsMainThread());
[email protected]aeeedad2014-08-22 18:16:22287 return commit_requested_;
[email protected]174c6d42014-08-12 01:43:06288}
[email protected]a8a049c2013-03-11 23:27:06289
[email protected]a8a049c2013-03-11 23:27:06290void SingleThreadProxy::Stop() {
291 TRACE_EVENT0("cc", "SingleThreadProxy::stop");
khushalsagarb7db1fe2015-11-12 00:51:27292 DCHECK(task_runner_provider_->IsMainThread());
[email protected]a8a049c2013-03-11 23:27:06293 {
khushalsagarb7db1fe2015-11-12 00:51:27294 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
295 DebugScopedSetImplThread impl(task_runner_provider_);
[email protected]a8a049c2013-03-11 23:27:06296
sunnypsda928f0a2016-10-08 00:32:53297 // Prevent the scheduler from performing actions while we're in an
298 // inconsistent state.
299 if (scheduler_on_impl_thread_)
300 scheduler_on_impl_thread_->Stop();
danakjc7afae52017-06-20 21:12:41301 // Take away the LayerTreeFrameSink before destroying things so it doesn't
danakj1120f4c2016-09-15 02:05:32302 // try to call into its client mid-shutdown.
Walter Kormanaa326e42017-08-22 23:04:43303 host_impl_->ReleaseLayerTreeFrameSink();
Khushal7899efd2018-01-08 18:01:16304
305 // It is important to destroy LTHI before the Scheduler since it can make
306 // callbacks that access it during destruction cleanup.
Walter Kormanaa326e42017-08-22 23:04:43307 host_impl_ = nullptr;
Khushal7899efd2018-01-08 18:01:16308 scheduler_on_impl_thread_ = nullptr;
[email protected]a8a049c2013-03-11 23:27:06309 }
sunnypsda928f0a2016-10-08 00:32:53310 layer_tree_host_ = nullptr;
[email protected]a8a049c2013-03-11 23:27:06311}
312
flackrf54e9b42016-05-31 15:20:10313void SingleThreadProxy::SetMutator(std::unique_ptr<LayerTreeMutator> mutator) {
314 DCHECK(task_runner_provider_->IsMainThread());
315 DebugScopedSetImplThread impl(task_runner_provider_);
Walter Kormanaa326e42017-08-22 23:04:43316 host_impl_->SetLayerTreeMutator(std::move(mutator));
flackrf54e9b42016-05-31 15:20:10317}
318
Xida Chend5ee5052019-01-03 13:27:51319void SingleThreadProxy::SetPaintWorkletLayerPainter(
320 std::unique_ptr<PaintWorkletLayerPainter> painter) {
321 NOTREACHED();
322}
323
[email protected]3d9f7432013-04-06 00:35:18324void SingleThreadProxy::OnCanDrawStateChanged(bool can_draw) {
sunnypsad3235e2016-08-09 04:57:52325 TRACE_EVENT1("cc", "SingleThreadProxy::OnCanDrawStateChanged", "can_draw",
326 can_draw);
khushalsagarb7db1fe2015-11-12 00:51:27327 DCHECK(task_runner_provider_->IsImplThread());
[email protected]aeeedad2014-08-22 18:16:22328 if (scheduler_on_impl_thread_)
329 scheduler_on_impl_thread_->SetCanDraw(can_draw);
[email protected]3d9f7432013-04-06 00:35:18330}
331
[email protected]4f48f6e2013-08-27 06:33:38332void SingleThreadProxy::NotifyReadyToActivate() {
enne98f3a6c2014-10-09 20:09:44333 TRACE_EVENT0("cc", "SingleThreadProxy::NotifyReadyToActivate");
khushalsagarb7db1fe2015-11-12 00:51:27334 DebugScopedSetImplThread impl(task_runner_provider_);
rogerm8aeea932017-04-19 21:26:57335 if (scheduler_on_impl_thread_)
336 scheduler_on_impl_thread_->NotifyReadyToActivate();
[email protected]4f48f6e2013-08-27 06:33:38337}
338
ernstmdfac03e2014-11-11 20:18:05339void SingleThreadProxy::NotifyReadyToDraw() {
weiliangc8dac5a62015-04-02 06:12:35340 TRACE_EVENT0("cc", "SingleThreadProxy::NotifyReadyToDraw");
khushalsagarb7db1fe2015-11-12 00:51:27341 DebugScopedSetImplThread impl(task_runner_provider_);
weiliangc8dac5a62015-04-02 06:12:35342 if (scheduler_on_impl_thread_)
343 scheduler_on_impl_thread_->NotifyReadyToDraw();
ernstmdfac03e2014-11-11 20:18:05344}
345
[email protected]c1bb5af2013-03-13 19:06:27346void SingleThreadProxy::SetNeedsRedrawOnImplThread() {
danakj6c872fc02016-10-22 04:29:49347 single_thread_client_->RequestScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22348 if (scheduler_on_impl_thread_)
349 scheduler_on_impl_thread_->SetNeedsRedraw();
[email protected]a8a049c2013-03-11 23:27:06350}
351
danakja18e826a2015-12-03 00:27:03352void SingleThreadProxy::SetNeedsOneBeginImplFrameOnImplThread() {
353 TRACE_EVENT0("cc",
354 "SingleThreadProxy::SetNeedsOneBeginImplFrameOnImplThread");
danakj6c872fc02016-10-22 04:29:49355 single_thread_client_->RequestScheduleComposite();
mithro719bf6792014-11-10 15:36:47356 if (scheduler_on_impl_thread_)
danakja18e826a2015-12-03 00:27:03357 scheduler_on_impl_thread_->SetNeedsOneBeginImplFrame();
David Bokaneaa5cc82018-10-12 15:50:40358 needs_impl_frame_ = true;
[email protected]43b8f982014-04-30 21:24:33359}
360
vmiura59ea9b4042014-12-09 20:50:39361void SingleThreadProxy::SetNeedsPrepareTilesOnImplThread() {
362 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsPrepareTilesOnImplThread");
enne98f3a6c2014-10-09 20:09:44363 if (scheduler_on_impl_thread_)
vmiura59ea9b4042014-12-09 20:50:39364 scheduler_on_impl_thread_->SetNeedsPrepareTiles();
[email protected]c48536a52013-09-14 00:02:08365}
366
[email protected]c1bb5af2013-03-13 19:06:27367void SingleThreadProxy::SetNeedsCommitOnImplThread() {
danakj6c872fc02016-10-22 04:29:49368 single_thread_client_->RequestScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22369 if (scheduler_on_impl_thread_)
mithroe77254b32015-07-22 09:36:01370 scheduler_on_impl_thread_->SetNeedsBeginMainFrame();
David Bokaneaa5cc82018-10-12 15:50:40371 commit_requested_ = true;
[email protected]a8a049c2013-03-11 23:27:06372}
373
sunnyps7d073dc2015-04-16 23:29:12374void SingleThreadProxy::SetVideoNeedsBeginFrames(bool needs_begin_frames) {
375 TRACE_EVENT1("cc", "SingleThreadProxy::SetVideoNeedsBeginFrames",
376 "needs_begin_frames", needs_begin_frames);
377 // In tests the layer tree is destroyed after the scheduler is.
378 if (scheduler_on_impl_thread_)
379 scheduler_on_impl_thread_->SetVideoNeedsBeginFrames(needs_begin_frames);
380}
381
[email protected]c1bb5af2013-03-13 19:06:27382void SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread(
loysoc601b7b82016-11-10 02:56:44383 std::unique_ptr<MutatorEvents> events) {
[email protected]ccc08dc2014-01-30 07:33:20384 TRACE_EVENT0(
385 "cc", "SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread");
khushalsagarb7db1fe2015-11-12 00:51:27386 DCHECK(task_runner_provider_->IsImplThread());
387 DebugScopedSetMainThread main(task_runner_provider_);
danakja04855a2015-11-18 20:39:10388 layer_tree_host_->SetAnimationEvents(std::move(events));
[email protected]a8a049c2013-03-11 23:27:06389}
390
Xida Chend8bb3b22017-10-26 17:14:52391size_t SingleThreadProxy::CompositedAnimationsCount() const {
392 return 0;
393}
394
395size_t SingleThreadProxy::MainThreadAnimationsCount() const {
396 return 0;
397}
398
Stephen McGruer1619b422018-02-20 18:46:55399bool SingleThreadProxy::CurrentFrameHadRAF() const {
400 return false;
401}
402
403bool SingleThreadProxy::NextFrameHasPendingRAF() const {
404 return false;
405}
406
sunnypsad3235e2016-08-09 04:57:52407bool SingleThreadProxy::IsInsideDraw() {
408 return inside_draw_;
409}
[email protected]a8a049c2013-03-11 23:27:06410
enne98f3a6c2014-10-09 20:09:44411void SingleThreadProxy::DidActivateSyncTree() {
danakj68803fc2015-06-19 20:55:53412 CommitComplete();
enne98f3a6c2014-10-09 20:09:44413}
414
brianderson68749812015-07-07 22:39:39415void SingleThreadProxy::WillPrepareTiles() {
khushalsagarb7db1fe2015-11-12 00:51:27416 DCHECK(task_runner_provider_->IsImplThread());
brianderson68749812015-07-07 22:39:39417 if (scheduler_on_impl_thread_)
418 scheduler_on_impl_thread_->WillPrepareTiles();
419}
420
vmiura59ea9b4042014-12-09 20:50:39421void SingleThreadProxy::DidPrepareTiles() {
khushalsagarb7db1fe2015-11-12 00:51:27422 DCHECK(task_runner_provider_->IsImplThread());
enne98f3a6c2014-10-09 20:09:44423 if (scheduler_on_impl_thread_)
vmiura59ea9b4042014-12-09 20:50:39424 scheduler_on_impl_thread_->DidPrepareTiles();
enne98f3a6c2014-10-09 20:09:44425}
426
rouslanf7ebd8832015-01-22 01:54:14427void SingleThreadProxy::DidCompletePageScaleAnimationOnImplThread() {
428 layer_tree_host_->DidCompletePageScaleAnimation();
429}
430
danakjc7afae52017-06-20 21:12:41431void SingleThreadProxy::DidLoseLayerTreeFrameSinkOnImplThread() {
danakj1120f4c2016-09-15 02:05:32432 TRACE_EVENT0("cc",
danakjc7afae52017-06-20 21:12:41433 "SingleThreadProxy::DidLoseLayerTreeFrameSinkOnImplThread");
[email protected]aeeedad2014-08-22 18:16:22434 {
khushalsagarb7db1fe2015-11-12 00:51:27435 DebugScopedSetMainThread main(task_runner_provider_);
[email protected]aeeedad2014-08-22 18:16:22436 // This must happen before we notify the scheduler as it may try to recreate
437 // the output surface if already in BEGIN_IMPL_FRAME_STATE_IDLE.
danakjc7afae52017-06-20 21:12:41438 layer_tree_host_->DidLoseLayerTreeFrameSink();
[email protected]aeeedad2014-08-22 18:16:22439 }
danakjc7afae52017-06-20 21:12:41440 single_thread_client_->DidLoseLayerTreeFrameSink();
[email protected]aeeedad2014-08-22 18:16:22441 if (scheduler_on_impl_thread_)
danakjc7afae52017-06-20 21:12:41442 scheduler_on_impl_thread_->DidLoseLayerTreeFrameSink();
443 layer_tree_frame_sink_lost_ = true;
[email protected]4d7e46a2013-11-08 05:33:40444}
445
Fady Samuelc645ffe2017-07-24 17:28:20446void SingleThreadProxy::SetBeginFrameSource(viz::BeginFrameSource* source) {
enne19c108582016-04-14 03:35:32447 if (scheduler_on_impl_thread_)
448 scheduler_on_impl_thread_->SetBeginFrameSource(source);
449}
450
danakj9d124422016-10-14 03:15:08451void SingleThreadProxy::DidReceiveCompositorFrameAckOnImplThread() {
miletusfed8c43b2015-01-26 20:04:52452 TRACE_EVENT0("cc,benchmark",
danakj9d124422016-10-14 03:15:08453 "SingleThreadProxy::DidReceiveCompositorFrameAckOnImplThread");
[email protected]aeeedad2014-08-22 18:16:22454 if (scheduler_on_impl_thread_)
danakj9d124422016-10-14 03:15:08455 scheduler_on_impl_thread_->DidReceiveCompositorFrameAck();
Karolina Soltys4d60b402018-10-01 19:28:20456 if (layer_tree_host_->GetSettings().send_compositor_frame_ack) {
457 // We do a PostTask here because freeing resources in some cases (such as in
458 // TextureLayer) is PostTasked and we want to make sure ack is received
459 // after resources are returned.
460 task_runner_provider_->MainThreadTaskRunner()->PostTask(
kylechar4bb144d2019-01-11 20:42:07461 FROM_HERE,
462 base::BindOnce(&SingleThreadProxy::DidReceiveCompositorFrameAck,
463 frame_sink_bound_weak_ptr_));
Karolina Soltys4d60b402018-10-01 19:28:20464 }
[email protected]493067512012-09-19 23:34:10465}
466
danakjc7afae52017-06-20 21:12:41467void SingleThreadProxy::OnDrawForLayerTreeFrameSink(
James Wallace-Leefbb0e3362018-06-18 23:57:47468 bool resourceless_software_draw,
469 bool skip_draw) {
sunnypseab5ac92015-04-02 20:26:13470 NOTREACHED() << "Implemented by ThreadProxy for synchronous compositor.";
471}
472
Khushal8360fc92017-07-26 01:53:25473void SingleThreadProxy::NeedsImplSideInvalidation(
474 bool needs_first_draw_on_activation) {
Khushal4b6c41882018-02-16 09:02:10475 if (scheduler_on_impl_thread_) {
476 scheduler_on_impl_thread_->SetNeedsImplSideInvalidation(
477 needs_first_draw_on_activation);
478 }
khushalsagard3b8827d2017-02-18 18:42:54479}
480
vmpstra840c6a2017-06-01 21:50:39481void SingleThreadProxy::NotifyImageDecodeRequestFinished() {
482 // If we don't have a scheduler, then just issue the callbacks here.
483 // Otherwise, schedule a commit.
484 if (!scheduler_on_impl_thread_) {
485 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
486 DebugScopedSetImplThread impl(task_runner_provider_);
487
488 IssueImageDecodeFinishedCallbacks();
489 return;
490 }
491 SetNeedsCommitOnImplThread();
492}
493
Scott Violete979c012017-12-08 00:18:16494void SingleThreadProxy::DidPresentCompositorFrameOnImplThread(
Sadrul Habib Chowdhury3d4df2e82018-06-02 05:18:00495 uint32_t frame_token,
496 std::vector<LayerTreeHost::PresentationTimeCallback> callbacks,
Sadrul Habib Chowdhuryb62a97302018-06-06 03:33:48497 const gfx::PresentationFeedback& feedback) {
Sadrul Habib Chowdhury3d4df2e82018-06-02 05:18:00498 layer_tree_host_->DidPresentCompositorFrame(frame_token, std::move(callbacks),
Sadrul Habib Chowdhuryb62a97302018-06-06 03:33:48499 feedback);
Scott Violete979c012017-12-08 00:18:16500}
501
Dan Elphick95929fd52017-06-13 09:15:07502void SingleThreadProxy::RequestBeginMainFrameNotExpected(bool new_state) {
503 if (scheduler_on_impl_thread_) {
504 scheduler_on_impl_thread_->SetMainThreadWantsBeginMainFrameNotExpected(
505 new_state);
506 }
507}
508
Khushal4b6c41882018-02-16 09:02:10509void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time,
510 bool raster) {
miletusfed8c43b2015-01-26 20:04:52511 TRACE_EVENT0("cc,benchmark", "SingleThreadProxy::CompositeImmediately");
khushalsagarb7db1fe2015-11-12 00:51:27512 DCHECK(task_runner_provider_->IsMainThread());
mithro51693e382015-05-07 23:52:41513#if DCHECK_IS_ON()
mithroc76d70312015-05-04 23:51:13514 DCHECK(!inside_impl_frame_);
mithro51693e382015-05-07 23:52:41515#endif
jbauman399aec1a2014-10-25 02:33:32516 base::AutoReset<bool> inside_composite(&inside_synchronous_composite_, true);
517
danakjc7afae52017-06-20 21:12:41518 if (layer_tree_frame_sink_lost_) {
519 RequestNewLayerTreeFrameSink();
520 // RequestNewLayerTreeFrameSink could have synchronously created an output
jbauman399aec1a2014-10-25 02:33:32521 // surface, so check again before returning.
danakjc7afae52017-06-20 21:12:41522 if (layer_tree_frame_sink_lost_)
jbauman399aec1a2014-10-25 02:33:32523 return;
524 }
[email protected]51f81da2014-05-16 21:29:26525
Fady Samuelc296f5fb2017-07-21 04:02:19526 viz::BeginFrameArgs begin_frame_args(viz::BeginFrameArgs::Create(
527 BEGINFRAME_FROM_HERE, viz::BeginFrameArgs::kManualSourceId, 1,
528 frame_begin_time, base::TimeTicks(),
529 viz::BeginFrameArgs::DefaultInterval(), viz::BeginFrameArgs::NORMAL));
mithroc76d70312015-05-04 23:51:13530
531 // Start the impl frame.
enne98f3a6c2014-10-09 20:09:44532 {
khushalsagarb7db1fe2015-11-12 00:51:27533 DebugScopedSetImplThread impl(task_runner_provider_);
mithroc76d70312015-05-04 23:51:13534 WillBeginImplFrame(begin_frame_args);
535 }
536
537 // Run the "main thread" and get it to commit.
538 {
mithro51693e382015-05-07 23:52:41539#if DCHECK_IS_ON()
mithroc76d70312015-05-04 23:51:13540 DCHECK(inside_impl_frame_);
mithro51693e382015-05-07 23:52:41541#endif
danakje6da4f12018-07-04 17:41:30542 animate_requested_ = false;
David Bokaneaa5cc82018-10-12 15:50:40543 needs_impl_frame_ = false;
danakje6da4f12018-07-04 17:41:30544 // Prevent new commits from being requested inside DoBeginMainFrame.
545 // Note: We do not want to prevent SetNeedsAnimate from requesting
546 // a commit here.
547 commit_requested_ = true;
enne98f3a6c2014-10-09 20:09:44548 DoBeginMainFrame(begin_frame_args);
danakje6da4f12018-07-04 17:41:30549 commit_requested_ = false;
danakj97660d92017-03-27 14:11:49550 DoPainting();
enne98f3a6c2014-10-09 20:09:44551 DoCommit();
[email protected]e0341352013-04-06 05:01:20552
khushalsagar8297ae992016-09-14 20:51:23553 DCHECK_EQ(
554 0u,
555 layer_tree_host_->GetSwapPromiseManager()->num_queued_swap_promises())
enne98f3a6c2014-10-09 20:09:44556 << "Commit should always succeed and transfer promises.";
557 }
558
mithroc76d70312015-05-04 23:51:13559 // Finish the impl frame.
enne98f3a6c2014-10-09 20:09:44560 {
khushalsagarb7db1fe2015-11-12 00:51:27561 DebugScopedSetImplThread impl(task_runner_provider_);
Walter Kormanaa326e42017-08-22 23:04:43562 host_impl_->ActivateSyncTree();
Khushal4b6c41882018-02-16 09:02:10563 if (raster) {
564 host_impl_->PrepareTiles();
565 host_impl_->SynchronouslyInitializeAllTiles();
566 }
enne69277cb2014-10-29 23:03:40567
danakj12e2f6e2015-08-19 22:25:44568 // TODO(danakj): Don't do this last... we prepared the wrong things. D:
Walter Kormanaa326e42017-08-22 23:04:43569 host_impl_->Animate();
mithro719bf6792014-11-10 15:36:47570
Khushal4b6c41882018-02-16 09:02:10571 if (raster) {
572 LayerTreeHostImpl::FrameData frame;
Sadrul Habib Chowdhury4a7940b2018-06-22 16:45:14573 frame.begin_frame_ack = viz::BeginFrameAck(begin_frame_args, true);
Khushal4b6c41882018-02-16 09:02:10574 DoComposite(&frame);
575 }
enne98f3a6c2014-10-09 20:09:44576
577 // DoComposite could abort, but because this is a synchronous composite
578 // another draw will never be scheduled, so break remaining promises.
Walter Kormanaa326e42017-08-22 23:04:43579 host_impl_->active_tree()->BreakSwapPromises(SwapPromise::SWAP_FAILS);
mithroc76d70312015-05-04 23:51:13580
mithro51693e382015-05-07 23:52:41581 DidFinishImplFrame();
enne98f3a6c2014-10-09 20:09:44582 }
[email protected]74d9063c2013-01-18 03:14:47583}
584
[email protected]5d8bec72014-07-03 03:03:11585bool SingleThreadProxy::SupportsImplScrolling() const {
586 return false;
587}
588
[email protected]3d9f7432013-04-06 00:35:18589bool SingleThreadProxy::ShouldComposite() const {
khushalsagarb7db1fe2015-11-12 00:51:27590 DCHECK(task_runner_provider_->IsImplThread());
Walter Kormanaa326e42017-08-22 23:04:43591 return host_impl_->visible() && host_impl_->CanDraw();
[email protected]3d9f7432013-04-06 00:35:18592}
593
danakjc7afae52017-06-20 21:12:41594void SingleThreadProxy::ScheduleRequestNewLayerTreeFrameSink() {
595 if (layer_tree_frame_sink_creation_callback_.IsCancelled() &&
596 !layer_tree_frame_sink_creation_requested_) {
597 layer_tree_frame_sink_creation_callback_.Reset(
kylechar3ef69ec2019-01-16 21:07:15598 base::BindOnce(&SingleThreadProxy::RequestNewLayerTreeFrameSink,
599 weak_factory_.GetWeakPtr()));
khushalsagarb7db1fe2015-11-12 00:51:27600 task_runner_provider_->MainThreadTaskRunner()->PostTask(
danakjc7afae52017-06-20 21:12:41601 FROM_HERE, layer_tree_frame_sink_creation_callback_.callback());
jbauman8ab0f9e2014-10-15 02:30:34602 }
603}
604
mithro248d1722015-05-05 05:23:45605DrawResult SingleThreadProxy::DoComposite(LayerTreeHostImpl::FrameData* frame) {
[email protected]ccc08dc2014-01-30 07:33:20606 TRACE_EVENT0("cc", "SingleThreadProxy::DoComposite");
[email protected]04049fc2013-05-01 03:13:20607
enne98f3a6c2014-10-09 20:09:44608 DrawResult draw_result;
609 bool draw_frame;
[email protected]a8a049c2013-03-11 23:27:06610 {
khushalsagarb7db1fe2015-11-12 00:51:27611 DebugScopedSetImplThread impl(task_runner_provider_);
[email protected]a8a049c2013-03-11 23:27:06612 base::AutoReset<bool> mark_inside(&inside_draw_, true);
613
[email protected]3d9f7432013-04-06 00:35:18614 // We guard PrepareToDraw() with CanDraw() because it always returns a valid
615 // frame, so can only be used when such a frame is possible. Since
616 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on
617 // CanDraw() as well.
[email protected]2aae96792014-05-15 23:10:50618 if (!ShouldComposite()) {
[email protected]aeeedad2014-08-22 18:16:22619 return DRAW_ABORTED_CANT_DRAW;
[email protected]3d9f7432013-04-06 00:35:18620 }
[email protected]a8a049c2013-03-11 23:27:06621
danakj097919e72016-09-07 19:50:55622 // This CapturePostTasks should be destroyed before
623 // DidCommitAndDrawFrame() is called since that goes out to the
624 // embedder, and we want the embedder to receive its callbacks before that.
625 // NOTE: This maintains consistent ordering with the ThreadProxy since
626 // the DidCommitAndDrawFrame() must be post-tasked from the impl thread
627 // there as the main thread is not blocked, so any posted tasks inside
628 // the swap buffers will execute first.
629 DebugScopedSetMainThreadBlocked main_thread_blocked(task_runner_provider_);
danakj097919e72016-09-07 19:50:55630
Walter Kormanaa326e42017-08-22 23:04:43631 draw_result = host_impl_->PrepareToDraw(frame);
enne98f3a6c2014-10-09 20:09:44632 draw_frame = draw_result == DRAW_SUCCESS;
robliao27728e62015-03-21 07:39:34633 if (draw_frame) {
Walter Kormanaa326e42017-08-22 23:04:43634 if (host_impl_->DrawLayers(frame)) {
danakj097919e72016-09-07 19:50:55635 if (scheduler_on_impl_thread_)
danakjc7afae52017-06-20 21:12:41636 // Drawing implies we submitted a frame to the LayerTreeFrameSink.
danakj9d124422016-10-14 03:15:08637 scheduler_on_impl_thread_->DidSubmitCompositorFrame();
danakj6c872fc02016-10-22 04:29:49638 single_thread_client_->DidSubmitCompositorFrame();
danakj097919e72016-09-07 19:50:55639 }
robliao27728e62015-03-21 07:39:34640 }
Walter Kormanaa326e42017-08-22 23:04:43641 host_impl_->DidDrawAllLayers(*frame);
[email protected]a8a049c2013-03-11 23:27:06642
danakj097919e72016-09-07 19:50:55643 bool start_ready_animations = draw_frame;
Walter Kormanaa326e42017-08-22 23:04:43644 host_impl_->UpdateAnimationState(start_ready_animations);
[email protected]aeeedad2014-08-22 18:16:22645 }
646 DidCommitAndDrawFrame();
647
enne98f3a6c2014-10-09 20:09:44648 return draw_result;
[email protected]a8a049c2013-03-11 23:27:06649}
650
[email protected]aeeedad2014-08-22 18:16:22651void SingleThreadProxy::DidCommitAndDrawFrame() {
[email protected]a8a049c2013-03-11 23:27:06652 if (next_frame_is_newly_committed_frame_) {
khushalsagarb7db1fe2015-11-12 00:51:27653 DebugScopedSetMainThread main(task_runner_provider_);
[email protected]a8a049c2013-03-11 23:27:06654 next_frame_is_newly_committed_frame_ = false;
[email protected]804c8982013-03-13 16:32:21655 layer_tree_host_->DidCommitAndDrawFrame();
[email protected]a8a049c2013-03-11 23:27:06656 }
657}
658
[email protected]4ea293f72014-08-13 03:03:17659bool SingleThreadProxy::MainFrameWillHappenForTesting() {
danakjfcdaba122015-04-24 21:41:52660 if (!scheduler_on_impl_thread_)
661 return false;
662 return scheduler_on_impl_thread_->MainFrameForTestingWillHappen();
[email protected]4ea293f72014-08-13 03:03:17663}
[email protected]a8a049c2013-03-11 23:27:06664
Fady Samueld26f7fb2018-06-19 04:13:37665void SingleThreadProxy::ClearHistory() {
Khushal2f9cdf22018-01-08 21:47:08666 DCHECK(task_runner_provider_->IsImplThread());
667 if (scheduler_on_impl_thread_)
Fady Samueld26f7fb2018-06-19 04:13:37668 scheduler_on_impl_thread_->ClearHistory();
Khushal2f9cdf22018-01-08 21:47:08669}
670
jonrossa2ff4f82018-02-16 17:27:46671void SingleThreadProxy::SetRenderFrameObserver(
672 std::unique_ptr<RenderFrameMetadataObserver> observer) {
jonrossc1877d6d2018-02-21 00:07:31673 host_impl_->SetRenderFrameObserver(std::move(observer));
jonrossa2ff4f82018-02-16 17:27:46674}
675
David Bokan1e37ebf2018-10-16 13:53:37676void SingleThreadProxy::UpdateBrowserControlsState(
677 BrowserControlsState constraints,
678 BrowserControlsState current,
679 bool animate) {
680 host_impl_->browser_controls_manager()->UpdateBrowserControlsState(
681 constraints, current, animate);
682}
683
James Wallace-Leee71cf582018-01-29 22:24:23684bool SingleThreadProxy::WillBeginImplFrame(const viz::BeginFrameArgs& args) {
danakja18e826a2015-12-03 00:27:03685 DebugScopedSetImplThread impl(task_runner_provider_);
mithro51693e382015-05-07 23:52:41686#if DCHECK_IS_ON()
mithro69fd3bb52015-05-01 03:45:02687 DCHECK(!inside_impl_frame_)
688 << "WillBeginImplFrame called while already inside an impl frame!";
689 inside_impl_frame_ = true;
mithro51693e382015-05-07 23:52:41690#endif
James Wallace-Leee71cf582018-01-29 22:24:23691 return host_impl_->WillBeginImplFrame(args);
[email protected]aeeedad2014-08-22 18:16:22692}
693
brianderson266dc3a2015-11-12 03:16:40694void SingleThreadProxy::ScheduledActionSendBeginMainFrame(
Fady Samuelc296f5fb2017-07-21 04:02:19695 const viz::BeginFrameArgs& begin_frame_args) {
[email protected]aeeedad2014-08-22 18:16:22696 TRACE_EVENT0("cc", "SingleThreadProxy::ScheduledActionSendBeginMainFrame");
sunnypsad3235e2016-08-09 04:57:52697#if DCHECK_IS_ON()
[email protected]aeeedad2014-08-22 18:16:22698 // Although this proxy is single-threaded, it's problematic to synchronously
699 // have BeginMainFrame happen after ScheduledActionSendBeginMainFrame. This
700 // could cause a commit to occur in between a series of SetNeedsCommit calls
701 // (i.e. property modifications) causing some to fall on one frame and some to
702 // fall on the next. Doing it asynchronously instead matches the semantics of
703 // ThreadProxy::SetNeedsCommit where SetNeedsCommit will not cause a
704 // synchronous commit.
mithro69fd3bb52015-05-01 03:45:02705 DCHECK(inside_impl_frame_)
706 << "BeginMainFrame should only be sent inside a BeginImplFrame";
mithro51693e382015-05-07 23:52:41707#endif
mithro69fd3bb52015-05-01 03:45:02708
Zhenyao Mo5b30cf32018-12-01 00:31:25709 host_impl_->WillSendBeginMainFrame();
khushalsagarb7db1fe2015-11-12 00:51:27710 task_runner_provider_->MainThreadTaskRunner()->PostTask(
tzik4604bb52017-04-13 21:50:22711 FROM_HERE, base::BindOnce(&SingleThreadProxy::BeginMainFrame,
712 weak_factory_.GetWeakPtr(), begin_frame_args));
Walter Kormanaa326e42017-08-22 23:04:43713 host_impl_->DidSendBeginMainFrame();
[email protected]aeeedad2014-08-22 18:16:22714}
715
kylechard96169b2018-11-02 00:55:00716void SingleThreadProxy::FrameIntervalUpdated(base::TimeDelta interval) {
717 DebugScopedSetMainThread main(task_runner_provider_);
718 single_thread_client_->FrameIntervalUpdated(interval);
719}
720
rmcilroy0a19362a2015-02-18 12:34:25721void SingleThreadProxy::SendBeginMainFrameNotExpectedSoon() {
722 layer_tree_host_->BeginMainFrameNotExpectedSoon();
723}
724
delphick9db74aa2017-05-05 10:20:49725void SingleThreadProxy::ScheduledActionBeginMainFrameNotExpectedUntil(
726 base::TimeTicks time) {
727 layer_tree_host_->BeginMainFrameNotExpectedUntil(time);
728}
729
Fady Samuelc296f5fb2017-07-21 04:02:19730void SingleThreadProxy::BeginMainFrame(
731 const viz::BeginFrameArgs& begin_frame_args) {
Brian Anderson242b9b02017-12-06 21:06:26732 // This checker assumes NotifyReadyToCommit in this stack causes a synchronous
733 // commit.
734 ScopedAbortRemainingSwapPromises swap_promise_checker(
735 layer_tree_host_->GetSwapPromiseManager());
736
brianderson21aef162015-11-11 05:12:23737 if (scheduler_on_impl_thread_) {
738 scheduler_on_impl_thread_->NotifyBeginMainFrameStarted(
739 base::TimeTicks::Now());
740 }
741
danakjfcdaba122015-04-24 21:41:52742 commit_requested_ = false;
David Bokaneaa5cc82018-10-12 15:50:40743 needs_impl_frame_ = false;
brianderson49e101d22015-04-29 00:05:33744 animate_requested_ = false;
danakjfcdaba122015-04-24 21:41:52745
Stephen Chenney6d3f5ce2018-11-14 02:08:05746 if (defer_main_frame_update_) {
simonhongc6309f792015-01-31 15:47:15747 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit",
748 TRACE_EVENT_SCOPE_THREAD);
749 BeginMainFrameAbortedOnImplThread(
750 CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT);
[email protected]aeeedad2014-08-22 18:16:22751 return;
752 }
753
khushalsagarcebe4942016-09-07 23:27:01754 if (!layer_tree_host_->IsVisible()) {
[email protected]aeeedad2014-08-22 18:16:22755 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD);
mithrof7a21502014-12-17 03:24:48756 BeginMainFrameAbortedOnImplThread(
757 CommitEarlyOutReason::ABORTED_NOT_VISIBLE);
[email protected]aeeedad2014-08-22 18:16:22758 return;
759 }
760
danakjfcdaba122015-04-24 21:41:52761 // Prevent new commits from being requested inside DoBeginMainFrame.
brianderson49e101d22015-04-29 00:05:33762 // Note: We do not want to prevent SetNeedsAnimate from requesting
763 // a commit here.
danakjfcdaba122015-04-24 21:41:52764 commit_requested_ = true;
765
enne98f3a6c2014-10-09 20:09:44766 DoBeginMainFrame(begin_frame_args);
danakj97660d92017-03-27 14:11:49767
768 // New commits requested inside UpdateLayers should be respected.
769 commit_requested_ = false;
770
771 // At this point the main frame may have deferred commits to avoid committing
772 // right now.
Stephen Chenney6d3f5ce2018-11-14 02:08:05773 if (defer_main_frame_update_ || begin_frame_args.animate_only) {
danakj97660d92017-03-27 14:11:49774 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit_InsideBeginMainFrame",
775 TRACE_EVENT_SCOPE_THREAD);
776 BeginMainFrameAbortedOnImplThread(
777 CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT);
778 layer_tree_host_->DidBeginMainFrame();
779 return;
780 }
781
Brian Anderson242b9b02017-12-06 21:06:26782 // Queue the LATENCY_BEGIN_FRAME_UI_MAIN_COMPONENT swap promise only once we
783 // know we will commit since QueueSwapPromise itself requests a commit.
784 ui::LatencyInfo new_latency_info(ui::SourceEventType::FRAME);
785 new_latency_info.AddLatencyNumberWithTimestamp(
Sadrul Habib Chowdhury41154dc02018-06-09 04:25:01786 ui::LATENCY_BEGIN_FRAME_UI_MAIN_COMPONENT, begin_frame_args.frame_time,
Navid Zolghadr5870ee112018-05-18 19:08:30787 1);
Brian Anderson242b9b02017-12-06 21:06:26788 layer_tree_host_->QueueSwapPromise(
789 std::make_unique<LatencyInfoSwapPromise>(new_latency_info));
790
danakj97660d92017-03-27 14:11:49791 DoPainting();
enne98f3a6c2014-10-09 20:09:44792}
793
794void SingleThreadProxy::DoBeginMainFrame(
Fady Samuelc296f5fb2017-07-21 04:02:19795 const viz::BeginFrameArgs& begin_frame_args) {
Khushal4b6c41882018-02-16 09:02:10796 // The impl-side scroll deltas may be manipulated directly via the
797 // InputHandler on the UI thread and the scale deltas may change when they are
798 // clamped on the impl thread.
tapted4b70c522016-08-13 09:09:32799 std::unique_ptr<ScrollAndScaleSet> scroll_info =
Walter Kormanaa326e42017-08-22 23:04:43800 host_impl_->ProcessScrollDeltas();
tapted4b70c522016-08-13 09:09:32801 layer_tree_host_->ApplyScrollAndScale(scroll_info.get());
802
enne98f3a6c2014-10-09 20:09:44803 layer_tree_host_->WillBeginMainFrame();
804 layer_tree_host_->BeginMainFrame(begin_frame_args);
805 layer_tree_host_->AnimateLayers(begin_frame_args.frame_time);
Stephen Chenneyec4312612018-11-21 12:40:16806 layer_tree_host_->RequestMainFrameUpdate(
807 false /* record_main_frame_metrics */);
danakj97660d92017-03-27 14:11:49808}
enne98f3a6c2014-10-09 20:09:44809
danakj97660d92017-03-27 14:11:49810void SingleThreadProxy::DoPainting() {
danakj5f46636a2015-06-19 00:01:40811 layer_tree_host_->UpdateLayers();
enne98f3a6c2014-10-09 20:09:44812
mithrof7a21502014-12-17 03:24:48813 // TODO(enne): SingleThreadProxy does not support cancelling commits yet,
814 // search for CommitEarlyOutReason::FINISHED_NO_UPDATES inside
815 // thread_proxy.cc
brianderson21aef162015-11-11 05:12:23816 if (scheduler_on_impl_thread_)
enne98f3a6c2014-10-09 20:09:44817 scheduler_on_impl_thread_->NotifyReadyToCommit();
[email protected]aeeedad2014-08-22 18:16:22818}
819
mithrof7a21502014-12-17 03:24:48820void SingleThreadProxy::BeginMainFrameAbortedOnImplThread(
821 CommitEarlyOutReason reason) {
khushalsagarb7db1fe2015-11-12 00:51:27822 DebugScopedSetImplThread impl(task_runner_provider_);
[email protected]aeeedad2014-08-22 18:16:22823 DCHECK(scheduler_on_impl_thread_->CommitPending());
Walter Kormanaa326e42017-08-22 23:04:43824 DCHECK(!host_impl_->pending_tree());
[email protected]aeeedad2014-08-22 18:16:22825
sunnypsad3235e2016-08-09 04:57:52826 std::vector<std::unique_ptr<SwapPromise>> empty_swap_promises;
Walter Kormanaa326e42017-08-22 23:04:43827 host_impl_->BeginMainFrameAborted(reason, std::move(empty_swap_promises));
mithrof7a21502014-12-17 03:24:48828 scheduler_on_impl_thread_->BeginMainFrameAborted(reason);
[email protected]aeeedad2014-08-22 18:16:22829}
830
danakj9d124422016-10-14 03:15:08831DrawResult SingleThreadProxy::ScheduledActionDrawIfPossible() {
khushalsagarb7db1fe2015-11-12 00:51:27832 DebugScopedSetImplThread impl(task_runner_provider_);
[email protected]aeeedad2014-08-22 18:16:22833 LayerTreeHostImpl::FrameData frame;
esecklerdde665f2017-03-07 20:19:27834 frame.begin_frame_ack =
835 scheduler_on_impl_thread_->CurrentBeginFrameAckForActiveTree();
mithro248d1722015-05-05 05:23:45836 return DoComposite(&frame);
[email protected]aeeedad2014-08-22 18:16:22837}
838
danakj9d124422016-10-14 03:15:08839DrawResult SingleThreadProxy::ScheduledActionDrawForced() {
[email protected]aeeedad2014-08-22 18:16:22840 NOTREACHED();
841 return INVALID_RESULT;
842}
843
844void SingleThreadProxy::ScheduledActionCommit() {
khushalsagarb7db1fe2015-11-12 00:51:27845 DebugScopedSetMainThread main(task_runner_provider_);
enne98f3a6c2014-10-09 20:09:44846 DoCommit();
[email protected]aeeedad2014-08-22 18:16:22847}
848
[email protected]aeeedad2014-08-22 18:16:22849void SingleThreadProxy::ScheduledActionActivateSyncTree() {
khushalsagarb7db1fe2015-11-12 00:51:27850 DebugScopedSetImplThread impl(task_runner_provider_);
Walter Kormanaa326e42017-08-22 23:04:43851 host_impl_->ActivateSyncTree();
[email protected]aeeedad2014-08-22 18:16:22852}
853
danakjc7afae52017-06-20 21:12:41854void SingleThreadProxy::ScheduledActionBeginLayerTreeFrameSinkCreation() {
khushalsagarb7db1fe2015-11-12 00:51:27855 DebugScopedSetMainThread main(task_runner_provider_);
[email protected]aeeedad2014-08-22 18:16:22856 DCHECK(scheduler_on_impl_thread_);
857 // If possible, create the output surface in a post task. Synchronously
858 // creating the output surface makes tests more awkward since this differs
859 // from the ThreadProxy behavior. However, sometimes there is no
860 // task runner.
khushalsagarb7db1fe2015-11-12 00:51:27861 if (task_runner_provider_->MainThreadTaskRunner()) {
danakjc7afae52017-06-20 21:12:41862 ScheduleRequestNewLayerTreeFrameSink();
[email protected]aeeedad2014-08-22 18:16:22863 } else {
danakjc7afae52017-06-20 21:12:41864 RequestNewLayerTreeFrameSink();
[email protected]aeeedad2014-08-22 18:16:22865 }
866}
867
vmiura59ea9b4042014-12-09 20:50:39868void SingleThreadProxy::ScheduledActionPrepareTiles() {
869 TRACE_EVENT0("cc", "SingleThreadProxy::ScheduledActionPrepareTiles");
khushalsagarb7db1fe2015-11-12 00:51:27870 DebugScopedSetImplThread impl(task_runner_provider_);
Walter Kormanaa326e42017-08-22 23:04:43871 host_impl_->PrepareTiles();
[email protected]aeeedad2014-08-22 18:16:22872}
873
James Wallace-Leefbb0e3362018-06-18 23:57:47874void SingleThreadProxy::ScheduledActionInvalidateLayerTreeFrameSink(
875 bool needs_redraw) {
danakja5df53792018-04-26 18:36:39876 // This is an Android WebView codepath, which only uses multi-thread
877 // compositor. So this should not occur in single-thread mode.
878 NOTREACHED() << "Android Webview use-case, so multi-thread only";
sunnypseab5ac92015-04-02 20:26:13879}
880
khushalsagarab73d502017-02-24 02:26:46881void SingleThreadProxy::ScheduledActionPerformImplSideInvalidation() {
khushalsagar6dc91d02017-02-28 05:10:07882 DCHECK(scheduler_on_impl_thread_);
883
884 DebugScopedSetImplThread impl(task_runner_provider_);
Walter Kormanaa326e42017-08-22 23:04:43885 host_impl_->InvalidateContentOnImplSide();
khushalsagar6dc91d02017-02-28 05:10:07886
887 // Invalidations go directly to the active tree, so we synchronously call
888 // NotifyReadyToActivate to update the scheduler and LTHI state correctly.
889 // Since in single-threaded mode the scheduler will wait for a ready to draw
890 // signal from LTHI, the draw will remain blocked till the invalidated tiles
891 // are ready.
892 NotifyReadyToActivate();
khushalsagarab73d502017-02-24 02:26:46893}
894
mithro51693e382015-05-07 23:52:41895void SingleThreadProxy::DidFinishImplFrame() {
Walter Kormanaa326e42017-08-22 23:04:43896 host_impl_->DidFinishImplFrame();
mithro51693e382015-05-07 23:52:41897#if DCHECK_IS_ON()
mithro69fd3bb52015-05-01 03:45:02898 DCHECK(inside_impl_frame_)
mithro51693e382015-05-07 23:52:41899 << "DidFinishImplFrame called while not inside an impl frame!";
mithro69fd3bb52015-05-01 03:45:02900 inside_impl_frame_ = false;
mithro51693e382015-05-07 23:52:41901#endif
[email protected]aeeedad2014-08-22 18:16:22902}
903
Fady Samuelc296f5fb2017-07-21 04:02:19904void SingleThreadProxy::DidNotProduceFrame(const viz::BeginFrameAck& ack) {
eseckler9404a232017-05-22 14:49:43905 DebugScopedSetImplThread impl(task_runner_provider_);
Walter Kormanaa326e42017-08-22 23:04:43906 host_impl_->DidNotProduceFrame(ack);
eseckler9404a232017-05-22 14:49:43907}
908
yiyix807099e2018-11-09 05:24:28909void SingleThreadProxy::WillNotReceiveBeginFrame() {
910 host_impl_->DidNotNeedBeginFrame();
911}
912
samans44b6dfc2017-04-19 16:50:53913void SingleThreadProxy::DidReceiveCompositorFrameAck() {
914 layer_tree_host_->DidReceiveCompositorFrameAck();
915}
916
[email protected]bc5e77c2012-11-05 20:00:49917} // namespace cc