blob: 02315481aa7444d7176770f79902291e839bdde9 [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"
robliao27728e62015-03-21 07:39:348#include "base/profiler/scoped_tracker.h"
primianoc06e2382015-01-28 04:21:499#include "base/trace_event/trace_event.h"
[email protected]adbe30f2013-10-11 21:12:3310#include "cc/debug/benchmark_instrumentation.h"
caseq7d2f4c92015-02-04 16:43:2711#include "cc/debug/devtools_instrumentation.h"
[email protected]7f0d825f2013-03-18 07:24:3012#include "cc/output/context_provider.h"
13#include "cc/output/output_surface.h"
[email protected]89e82672013-03-18 07:50:5614#include "cc/quads/draw_quad.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"
[email protected]556fd292013-03-18 08:03:0418#include "cc/trees/layer_tree_host.h"
[email protected]943528e2013-11-07 05:01:3219#include "cc/trees/layer_tree_host_single_thread_client.h"
[email protected]556fd292013-03-18 08:03:0420#include "cc/trees/layer_tree_impl.h"
[email protected]aeeedad2014-08-22 18:16:2221#include "cc/trees/scoped_abort_remaining_swap_promises.h"
[email protected]94f206c12012-08-25 00:09:1422
[email protected]9c88e562012-09-14 22:21:3023namespace cc {
[email protected]94f206c12012-08-25 00:09:1424
[email protected]943528e2013-11-07 05:01:3225scoped_ptr<Proxy> SingleThreadProxy::Create(
26 LayerTreeHost* layer_tree_host,
[email protected]27e6a212014-07-18 15:51:2727 LayerTreeHostSingleThreadClient* client,
simonhonga7e3ac42014-11-11 20:50:2228 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
29 scoped_ptr<BeginFrameSource> external_begin_frame_source) {
30 return make_scoped_ptr(new SingleThreadProxy(
31 layer_tree_host,
32 client,
33 main_task_runner,
34 external_begin_frame_source.Pass()));
[email protected]94f206c12012-08-25 00:09:1435}
36
[email protected]27e6a212014-07-18 15:51:2737SingleThreadProxy::SingleThreadProxy(
38 LayerTreeHost* layer_tree_host,
39 LayerTreeHostSingleThreadClient* client,
simonhonga7e3ac42014-11-11 20:50:2240 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
41 scoped_ptr<BeginFrameSource> external_begin_frame_source)
[email protected]27e6a212014-07-18 15:51:2742 : Proxy(main_task_runner, NULL),
[email protected]a8a049c2013-03-11 23:27:0643 layer_tree_host_(layer_tree_host),
[email protected]943528e2013-11-07 05:01:3244 client_(client),
sunnypsf381ede2015-06-23 01:46:5345 external_begin_frame_source_(external_begin_frame_source.Pass()),
[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),
51 defer_commits_(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),
jbauman8ab0f9e2014-10-15 02:30:3455 output_surface_creation_requested_(false),
[email protected]aeeedad2014-08-22 18:16:2256 weak_factory_(this) {
[email protected]a8a049c2013-03-11 23:27:0657 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy");
58 DCHECK(Proxy::IsMainThread());
59 DCHECK(layer_tree_host);
danakjfcdaba122015-04-24 21:41:5260
61 if (layer_tree_host->settings().single_thread_proxy_scheduler &&
62 !scheduler_on_impl_thread_) {
63 SchedulerSettings scheduler_settings(
64 layer_tree_host->settings().ToSchedulerSettings());
danakj5f2e92de2015-06-20 00:25:5865 scheduler_settings.commit_to_active_tree = CommitToActiveTree();
briandersonc9f50352015-06-24 03:38:5866
67 scoped_ptr<CompositorTimingHistory> compositor_timing_history(
68 new CompositorTimingHistory(
briandersonc68220f2015-07-20 20:08:3569 CompositorTimingHistory::BROWSER_UMA,
briandersonc9f50352015-06-24 03:38:5870 layer_tree_host->rendering_stats_instrumentation()));
71
danakjfcdaba122015-04-24 21:41:5272 scheduler_on_impl_thread_ = Scheduler::Create(
73 this, scheduler_settings, layer_tree_host_->id(),
briandersonc9f50352015-06-24 03:38:5874 MainThreadTaskRunner(), external_begin_frame_source_.get(),
75 compositor_timing_history.Pass());
danakjfcdaba122015-04-24 21:41:5276 }
[email protected]94f206c12012-08-25 00:09:1477}
78
[email protected]e96e3432013-12-19 18:56:0779void SingleThreadProxy::Start() {
[email protected]a8a049c2013-03-11 23:27:0680 DebugScopedSetImplThread impl(this);
[email protected]804c8982013-03-13 16:32:2181 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this);
[email protected]a8a049c2013-03-11 23:27:0682}
83
84SingleThreadProxy::~SingleThreadProxy() {
85 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy");
86 DCHECK(Proxy::IsMainThread());
[email protected]04049fc2013-05-01 03:13:2087 // Make sure Stop() got called or never Started.
88 DCHECK(!layer_tree_host_impl_);
[email protected]a8a049c2013-03-11 23:27:0689}
90
[email protected]a8a049c2013-03-11 23:27:0691void SingleThreadProxy::FinishAllRendering() {
[email protected]ccc08dc2014-01-30 07:33:2092 TRACE_EVENT0("cc", "SingleThreadProxy::FinishAllRendering");
[email protected]a8a049c2013-03-11 23:27:0693 DCHECK(Proxy::IsMainThread());
94 {
[email protected]61de5812012-11-08 07:03:4495 DebugScopedSetImplThread impl(this);
[email protected]c1bb5af2013-03-13 19:06:2796 layer_tree_host_impl_->FinishAllRendering();
[email protected]a8a049c2013-03-11 23:27:0697 }
[email protected]94f206c12012-08-25 00:09:1498}
99
[email protected]a8a049c2013-03-11 23:27:06100bool SingleThreadProxy::IsStarted() const {
101 DCHECK(Proxy::IsMainThread());
[email protected]3209161d2013-03-29 19:17:34102 return layer_tree_host_impl_;
[email protected]94f206c12012-08-25 00:09:14103}
104
danakj009cdfdf2015-02-17 22:35:14105bool SingleThreadProxy::CommitToActiveTree() const {
106 // With SingleThreadProxy we skip the pending tree and commit directly to the
107 // active tree.
108 return true;
109}
110
[email protected]a8a049c2013-03-11 23:27:06111void SingleThreadProxy::SetVisible(bool visible) {
mithro46adf5a2014-11-19 14:52:40112 TRACE_EVENT1("cc", "SingleThreadProxy::SetVisible", "visible", visible);
[email protected]f7c01c82013-07-02 22:58:46113 DebugScopedSetImplThread impl(this);
sunnypsc3f6e0c2015-07-25 01:00:59114
[email protected]c1bb5af2013-03-13 19:06:27115 layer_tree_host_impl_->SetVisible(visible);
sunnypsc3f6e0c2015-07-25 01:00:59116
[email protected]aeeedad2014-08-22 18:16:22117 if (scheduler_on_impl_thread_)
118 scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible());
[email protected]a8a049c2013-03-11 23:27:06119}
120
bajones274110612015-01-06 20:53:59121void SingleThreadProxy::SetThrottleFrameProduction(bool throttle) {
122 TRACE_EVENT1("cc", "SingleThreadProxy::SetThrottleFrameProduction",
123 "throttle", throttle);
124 DebugScopedSetImplThread impl(this);
125 if (scheduler_on_impl_thread_)
126 scheduler_on_impl_thread_->SetThrottleFrameProduction(throttle);
127}
128
enne2097cab2014-09-25 20:16:31129void SingleThreadProxy::RequestNewOutputSurface() {
[email protected]a8a049c2013-03-11 23:27:06130 DCHECK(Proxy::IsMainThread());
[email protected]497edf82014-05-20 21:53:15131 DCHECK(layer_tree_host_->output_surface_lost());
jbauman8ab0f9e2014-10-15 02:30:34132 output_surface_creation_callback_.Cancel();
133 if (output_surface_creation_requested_)
134 return;
135 output_surface_creation_requested_ = true;
enne2097cab2014-09-25 20:16:31136 layer_tree_host_->RequestNewOutputSurface();
137}
[email protected]94f206c12012-08-25 00:09:14138
revemand180dfc32015-09-24 00:19:43139void SingleThreadProxy::ReleaseOutputSurface() {
sieverse83e41d2015-09-18 23:33:26140 // |layer_tree_host_| should already be aware of this.
141 DCHECK(layer_tree_host_->output_surface_lost());
142
sohan.jyoti3a33d872015-09-18 22:32:55143 if (scheduler_on_impl_thread_)
144 scheduler_on_impl_thread_->DidLoseOutputSurface();
145 return layer_tree_host_impl_->ReleaseOutputSurface();
146}
147
revemand180dfc32015-09-24 00:19:43148void SingleThreadProxy::SetOutputSurface(OutputSurface* output_surface) {
enne2097cab2014-09-25 20:16:31149 DCHECK(Proxy::IsMainThread());
150 DCHECK(layer_tree_host_->output_surface_lost());
enne5232fbb2015-01-27 21:22:41151 DCHECK(output_surface_creation_requested_);
[email protected]da8e3b72b2014-04-25 02:33:45152 renderer_capabilities_for_main_thread_ = RendererCapabilities();
153
enne7f8fdde2014-12-10 21:32:09154 bool success;
155 {
[email protected]819b9f52013-09-22 23:29:51156 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
[email protected]a8a049c2013-03-11 23:27:06157 DebugScopedSetImplThread impl(this);
revemand180dfc32015-09-24 00:19:43158 success = layer_tree_host_impl_->InitializeRenderer(output_surface);
[email protected]04049fc2013-05-01 03:13:20159 }
160
[email protected]aeeedad2014-08-22 18:16:22161 if (success) {
enne7f8fdde2014-12-10 21:32:09162 layer_tree_host_->DidInitializeOutputSurface();
[email protected]aeeedad2014-08-22 18:16:22163 if (scheduler_on_impl_thread_)
164 scheduler_on_impl_thread_->DidCreateAndInitializeOutputSurface();
jbauman399aec1a2014-10-25 02:33:32165 else if (!inside_synchronous_composite_)
166 SetNeedsCommit();
enne5232fbb2015-01-27 21:22:41167 output_surface_creation_requested_ = false;
enne7f8fdde2014-12-10 21:32:09168 } else {
enne5232fbb2015-01-27 21:22:41169 // DidFailToInitializeOutputSurface is treated as a RequestNewOutputSurface,
170 // and so output_surface_creation_requested remains true.
enne7f8fdde2014-12-10 21:32:09171 layer_tree_host_->DidFailToInitializeOutputSurface();
[email protected]04049fc2013-05-01 03:13:20172 }
[email protected]94f206c12012-08-25 00:09:14173}
174
[email protected]a8a049c2013-03-11 23:27:06175const RendererCapabilities& SingleThreadProxy::GetRendererCapabilities() const {
[email protected]04049fc2013-05-01 03:13:20176 DCHECK(Proxy::IsMainThread());
177 DCHECK(!layer_tree_host_->output_surface_lost());
[email protected]a8a049c2013-03-11 23:27:06178 return renderer_capabilities_for_main_thread_;
[email protected]94f206c12012-08-25 00:09:14179}
180
[email protected]8b9e52b2014-01-17 16:35:31181void SingleThreadProxy::SetNeedsAnimate() {
[email protected]ccc08dc2014-01-30 07:33:20182 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsAnimate");
[email protected]c5134172013-12-11 06:19:48183 DCHECK(Proxy::IsMainThread());
[email protected]06cbc31b2014-01-17 06:43:20184 client_->ScheduleAnimation();
brianderson49e101d22015-04-29 00:05:33185 if (animate_requested_)
186 return;
187 animate_requested_ = true;
188 DebugScopedSetImplThread impl(this);
189 if (scheduler_on_impl_thread_)
mithroe77254b32015-07-22 09:36:01190 scheduler_on_impl_thread_->SetNeedsBeginMainFrame();
[email protected]c5134172013-12-11 06:19:48191}
192
[email protected]8b9e52b2014-01-17 16:35:31193void SingleThreadProxy::SetNeedsUpdateLayers() {
[email protected]ccc08dc2014-01-30 07:33:20194 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsUpdateLayers");
[email protected]8b9e52b2014-01-17 16:35:31195 DCHECK(Proxy::IsMainThread());
[email protected]aeeedad2014-08-22 18:16:22196 SetNeedsCommit();
[email protected]8b9e52b2014-01-17 16:35:31197}
198
enne98f3a6c2014-10-09 20:09:44199void SingleThreadProxy::DoCommit() {
[email protected]ccc08dc2014-01-30 07:33:20200 TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit");
[email protected]a8a049c2013-03-11 23:27:06201 DCHECK(Proxy::IsMainThread());
enne98f3a6c2014-10-09 20:09:44202
robliao27728e62015-03-21 07:39:34203 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 is
204 // fixed.
205 tracked_objects::ScopedTracker tracking_profile1(
206 FROM_HERE_WITH_EXPLICIT_FUNCTION("461509 SingleThreadProxy::DoCommit1"));
[email protected]aeeedad2014-08-22 18:16:22207 layer_tree_host_->WillCommit();
caseq7d2f4c92015-02-04 16:43:27208 devtools_instrumentation::ScopedCommitTrace commit_task(
209 layer_tree_host_->id());
[email protected]aeeedad2014-08-22 18:16:22210
[email protected]a8a049c2013-03-11 23:27:06211 // Commit immediately.
212 {
robliao27728e62015-03-21 07:39:34213 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
214 // is fixed.
215 tracked_objects::ScopedTracker tracking_profile2(
216 FROM_HERE_WITH_EXPLICIT_FUNCTION(
217 "461509 SingleThreadProxy::DoCommit2"));
[email protected]819b9f52013-09-22 23:29:51218 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
[email protected]f7c01c82013-07-02 22:58:46219 DebugScopedSetImplThread impl(this);
220
[email protected]9794fb32013-08-29 09:49:59221 // This CapturePostTasks should be destroyed before CommitComplete() is
222 // called since that goes out to the embedder, and we want the embedder
223 // to receive its callbacks before that.
enne98f3a6c2014-10-09 20:09:44224 commit_blocking_task_runner_.reset(new BlockingTaskRunner::CapturePostTasks(
225 blocking_main_thread_task_runner()));
[email protected]9794fb32013-08-29 09:49:59226
[email protected]c1bb5af2013-03-13 19:06:27227 layer_tree_host_impl_->BeginCommit();
[email protected]94f206c12012-08-25 00:09:14228
robliao27728e62015-03-21 07:39:34229 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
230 // is fixed.
robliao27728e62015-03-21 07:39:34231 tracked_objects::ScopedTracker tracking_profile6(
232 FROM_HERE_WITH_EXPLICIT_FUNCTION(
233 "461509 SingleThreadProxy::DoCommit6"));
[email protected]127bdc1a2013-09-11 01:44:48234 if (layer_tree_host_impl_->EvictedUIResourcesExist())
235 layer_tree_host_->RecreateUIResources();
236
robliao27728e62015-03-21 07:39:34237 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
238 // is fixed.
239 tracked_objects::ScopedTracker tracking_profile7(
240 FROM_HERE_WITH_EXPLICIT_FUNCTION(
241 "461509 SingleThreadProxy::DoCommit7"));
[email protected]804c8982013-03-13 16:32:21242 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get());
[email protected]94f206c12012-08-25 00:09:14243
danakje649f572015-01-08 23:35:58244#if DCHECK_IS_ON()
[email protected]3519b872013-07-30 07:17:50245 // In the single-threaded case, the scale and scroll deltas should never be
[email protected]a8a049c2013-03-11 23:27:06246 // touched on the impl layer tree.
[email protected]ed511b8d2013-03-25 03:29:29247 scoped_ptr<ScrollAndScaleSet> scroll_info =
[email protected]c1bb5af2013-03-13 19:06:27248 layer_tree_host_impl_->ProcessScrollDeltas();
[email protected]ed511b8d2013-03-25 03:29:29249 DCHECK(!scroll_info->scrolls.size());
[email protected]3519b872013-07-30 07:17:50250 DCHECK_EQ(1.f, scroll_info->page_scale_delta);
[email protected]94f206c12012-08-25 00:09:14251#endif
enne98f3a6c2014-10-09 20:09:44252
danakj3c3973b2015-08-25 21:50:18253 if (scheduler_on_impl_thread_)
254 scheduler_on_impl_thread_->DidCommit();
255
256 layer_tree_host_impl_->CommitComplete();
257
danakj68803fc2015-06-19 20:55:53258 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
259 // is fixed.
260 tracked_objects::ScopedTracker tracking_profile8(
261 FROM_HERE_WITH_EXPLICIT_FUNCTION(
262 "461509 SingleThreadProxy::DoCommit8"));
263 // Commit goes directly to the active tree, but we need to synchronously
264 // "activate" the tree still during commit to satisfy any potential
265 // SetNextCommitWaitsForActivation calls. Unfortunately, the tree
266 // might not be ready to draw, so DidActivateSyncTree must set
267 // the flag to force the tree to not draw until textures are ready.
268 NotifyReadyToActivate();
enne98f3a6c2014-10-09 20:09:44269 }
270}
271
272void SingleThreadProxy::CommitComplete() {
danakj3c3973b2015-08-25 21:50:18273 // Commit complete happens on the main side after activate to satisfy any
274 // SetNextCommitWaitsForActivation calls.
enne98f3a6c2014-10-09 20:09:44275 DCHECK(!layer_tree_host_impl_->pending_tree())
276 << "Activation is expected to have synchronously occurred by now.";
277 DCHECK(commit_blocking_task_runner_);
278
279 DebugScopedSetMainThread main(this);
280 commit_blocking_task_runner_.reset();
[email protected]804c8982013-03-13 16:32:21281 layer_tree_host_->CommitComplete();
[email protected]aeeedad2014-08-22 18:16:22282 layer_tree_host_->DidBeginMainFrame();
[email protected]aeeedad2014-08-22 18:16:22283
[email protected]a8a049c2013-03-11 23:27:06284 next_frame_is_newly_committed_frame_ = true;
[email protected]94f206c12012-08-25 00:09:14285}
286
[email protected]a8a049c2013-03-11 23:27:06287void SingleThreadProxy::SetNeedsCommit() {
288 DCHECK(Proxy::IsMainThread());
[email protected]943528e2013-11-07 05:01:32289 client_->ScheduleComposite();
danakjfcdaba122015-04-24 21:41:52290 if (commit_requested_)
291 return;
brianderson49e101d22015-04-29 00:05:33292 commit_requested_ = true;
danakjfcdaba122015-04-24 21:41:52293 DebugScopedSetImplThread impl(this);
[email protected]aeeedad2014-08-22 18:16:22294 if (scheduler_on_impl_thread_)
mithroe77254b32015-07-22 09:36:01295 scheduler_on_impl_thread_->SetNeedsBeginMainFrame();
[email protected]94f206c12012-08-25 00:09:14296}
297
[email protected]0023fc72014-01-10 20:05:06298void SingleThreadProxy::SetNeedsRedraw(const gfx::Rect& damage_rect) {
[email protected]ccc08dc2014-01-30 07:33:20299 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsRedraw");
[email protected]aeeedad2014-08-22 18:16:22300 DCHECK(Proxy::IsMainThread());
301 DebugScopedSetImplThread impl(this);
[email protected]2decdd782014-08-13 22:36:06302 client_->ScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22303 SetNeedsRedrawRectOnImplThread(damage_rect);
[email protected]94f206c12012-08-25 00:09:14304}
305
[email protected]74b43cc2013-08-30 06:29:27306void SingleThreadProxy::SetNextCommitWaitsForActivation() {
enne98f3a6c2014-10-09 20:09:44307 // Activation always forced in commit, so nothing to do.
[email protected]aeeedad2014-08-22 18:16:22308 DCHECK(Proxy::IsMainThread());
[email protected]74b43cc2013-08-30 06:29:27309}
310
[email protected]a8a049c2013-03-11 23:27:06311void SingleThreadProxy::SetDeferCommits(bool defer_commits) {
[email protected]aeeedad2014-08-22 18:16:22312 DCHECK(Proxy::IsMainThread());
313 // Deferring commits only makes sense if there's a scheduler.
314 if (!scheduler_on_impl_thread_)
315 return;
316 if (defer_commits_ == defer_commits)
317 return;
318
319 if (defer_commits)
320 TRACE_EVENT_ASYNC_BEGIN0("cc", "SingleThreadProxy::SetDeferCommits", this);
321 else
322 TRACE_EVENT_ASYNC_END0("cc", "SingleThreadProxy::SetDeferCommits", this);
323
324 defer_commits_ = defer_commits;
simonhongc6309f792015-01-31 15:47:15325 scheduler_on_impl_thread_->SetDeferCommits(defer_commits);
[email protected]6b16679e2012-10-27 00:44:28326}
327
[email protected]174c6d42014-08-12 01:43:06328bool SingleThreadProxy::CommitRequested() const {
[email protected]aeeedad2014-08-22 18:16:22329 DCHECK(Proxy::IsMainThread());
330 return commit_requested_;
[email protected]174c6d42014-08-12 01:43:06331}
[email protected]a8a049c2013-03-11 23:27:06332
[email protected]174c6d42014-08-12 01:43:06333bool SingleThreadProxy::BeginMainFrameRequested() const {
[email protected]aeeedad2014-08-22 18:16:22334 DCHECK(Proxy::IsMainThread());
335 // If there is no scheduler, then there can be no pending begin frame,
336 // as all frames are all manually initiated by the embedder of cc.
337 if (!scheduler_on_impl_thread_)
338 return false;
339 return commit_requested_;
[email protected]174c6d42014-08-12 01:43:06340}
[email protected]971728d2013-10-26 10:39:31341
[email protected]a8a049c2013-03-11 23:27:06342void SingleThreadProxy::Stop() {
343 TRACE_EVENT0("cc", "SingleThreadProxy::stop");
344 DCHECK(Proxy::IsMainThread());
345 {
[email protected]819b9f52013-09-22 23:29:51346 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
[email protected]a8a049c2013-03-11 23:27:06347 DebugScopedSetImplThread impl(this);
348
skyostil3976a3f2014-09-04 22:07:23349 BlockingTaskRunner::CapturePostTasks blocked(
350 blocking_main_thread_task_runner());
danakjf446a072014-09-27 21:55:48351 scheduler_on_impl_thread_ = nullptr;
352 layer_tree_host_impl_ = nullptr;
[email protected]a8a049c2013-03-11 23:27:06353 }
[email protected]7aba6662013-03-12 10:17:34354 layer_tree_host_ = NULL;
[email protected]a8a049c2013-03-11 23:27:06355}
356
[email protected]3d9f7432013-04-06 00:35:18357void SingleThreadProxy::OnCanDrawStateChanged(bool can_draw) {
[email protected]ccc08dc2014-01-30 07:33:20358 TRACE_EVENT1(
359 "cc", "SingleThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw);
[email protected]3d9f7432013-04-06 00:35:18360 DCHECK(Proxy::IsImplThread());
[email protected]aeeedad2014-08-22 18:16:22361 if (scheduler_on_impl_thread_)
362 scheduler_on_impl_thread_->SetCanDraw(can_draw);
[email protected]3d9f7432013-04-06 00:35:18363}
364
[email protected]4f48f6e2013-08-27 06:33:38365void SingleThreadProxy::NotifyReadyToActivate() {
enne98f3a6c2014-10-09 20:09:44366 TRACE_EVENT0("cc", "SingleThreadProxy::NotifyReadyToActivate");
367 DebugScopedSetImplThread impl(this);
368 if (scheduler_on_impl_thread_)
369 scheduler_on_impl_thread_->NotifyReadyToActivate();
[email protected]4f48f6e2013-08-27 06:33:38370}
371
ernstmdfac03e2014-11-11 20:18:05372void SingleThreadProxy::NotifyReadyToDraw() {
weiliangc8dac5a62015-04-02 06:12:35373 TRACE_EVENT0("cc", "SingleThreadProxy::NotifyReadyToDraw");
374 DebugScopedSetImplThread impl(this);
375 if (scheduler_on_impl_thread_)
376 scheduler_on_impl_thread_->NotifyReadyToDraw();
ernstmdfac03e2014-11-11 20:18:05377}
378
[email protected]c1bb5af2013-03-13 19:06:27379void SingleThreadProxy::SetNeedsRedrawOnImplThread() {
[email protected]943528e2013-11-07 05:01:32380 client_->ScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22381 if (scheduler_on_impl_thread_)
382 scheduler_on_impl_thread_->SetNeedsRedraw();
[email protected]a8a049c2013-03-11 23:27:06383}
384
[email protected]43b8f982014-04-30 21:24:33385void SingleThreadProxy::SetNeedsAnimateOnImplThread() {
mithro719bf6792014-11-10 15:36:47386 client_->ScheduleComposite();
387 if (scheduler_on_impl_thread_)
388 scheduler_on_impl_thread_->SetNeedsAnimate();
[email protected]43b8f982014-04-30 21:24:33389}
390
vmiura59ea9b4042014-12-09 20:50:39391void SingleThreadProxy::SetNeedsPrepareTilesOnImplThread() {
392 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsPrepareTilesOnImplThread");
enne98f3a6c2014-10-09 20:09:44393 if (scheduler_on_impl_thread_)
vmiura59ea9b4042014-12-09 20:50:39394 scheduler_on_impl_thread_->SetNeedsPrepareTiles();
[email protected]c48536a52013-09-14 00:02:08395}
396
[email protected]0023fc72014-01-10 20:05:06397void SingleThreadProxy::SetNeedsRedrawRectOnImplThread(
398 const gfx::Rect& damage_rect) {
[email protected]1cd9f5552013-04-26 04:22:03399 layer_tree_host_impl_->SetViewportDamage(damage_rect);
[email protected]aeeedad2014-08-22 18:16:22400 SetNeedsRedrawOnImplThread();
[email protected]1cd9f5552013-04-26 04:22:03401}
402
[email protected]c1bb5af2013-03-13 19:06:27403void SingleThreadProxy::SetNeedsCommitOnImplThread() {
[email protected]943528e2013-11-07 05:01:32404 client_->ScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22405 if (scheduler_on_impl_thread_)
mithroe77254b32015-07-22 09:36:01406 scheduler_on_impl_thread_->SetNeedsBeginMainFrame();
[email protected]a8a049c2013-03-11 23:27:06407}
408
sunnyps7d073dc2015-04-16 23:29:12409void SingleThreadProxy::SetVideoNeedsBeginFrames(bool needs_begin_frames) {
410 TRACE_EVENT1("cc", "SingleThreadProxy::SetVideoNeedsBeginFrames",
411 "needs_begin_frames", needs_begin_frames);
412 // In tests the layer tree is destroyed after the scheduler is.
413 if (scheduler_on_impl_thread_)
414 scheduler_on_impl_thread_->SetVideoNeedsBeginFrames(needs_begin_frames);
415}
416
[email protected]c1bb5af2013-03-13 19:06:27417void SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread(
[email protected]85b57502014-03-11 15:37:48418 scoped_ptr<AnimationEventsVector> events) {
[email protected]ccc08dc2014-01-30 07:33:20419 TRACE_EVENT0(
420 "cc", "SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread");
[email protected]a8a049c2013-03-11 23:27:06421 DCHECK(Proxy::IsImplThread());
422 DebugScopedSetMainThread main(this);
[email protected]85b57502014-03-11 15:37:48423 layer_tree_host_->SetAnimationEvents(events.Pass());
[email protected]a8a049c2013-03-11 23:27:06424}
425
[email protected]c1bb5af2013-03-13 19:06:27426bool SingleThreadProxy::IsInsideDraw() { return inside_draw_; }
[email protected]a8a049c2013-03-11 23:27:06427
enne98f3a6c2014-10-09 20:09:44428void SingleThreadProxy::DidActivateSyncTree() {
danakj68803fc2015-06-19 20:55:53429 // Synchronously call to CommitComplete. Resetting
430 // |commit_blocking_task_runner| would make sure all tasks posted during
431 // commit/activation before CommitComplete.
432 CommitComplete();
enne98f3a6c2014-10-09 20:09:44433}
434
brianderson68749812015-07-07 22:39:39435void SingleThreadProxy::WillPrepareTiles() {
436 DCHECK(Proxy::IsImplThread());
437 if (scheduler_on_impl_thread_)
438 scheduler_on_impl_thread_->WillPrepareTiles();
439}
440
vmiura59ea9b4042014-12-09 20:50:39441void SingleThreadProxy::DidPrepareTiles() {
enne98f3a6c2014-10-09 20:09:44442 DCHECK(Proxy::IsImplThread());
443 if (scheduler_on_impl_thread_)
vmiura59ea9b4042014-12-09 20:50:39444 scheduler_on_impl_thread_->DidPrepareTiles();
enne98f3a6c2014-10-09 20:09:44445}
446
rouslanf7ebd8832015-01-22 01:54:14447void SingleThreadProxy::DidCompletePageScaleAnimationOnImplThread() {
448 layer_tree_host_->DidCompletePageScaleAnimation();
449}
450
[email protected]fa339032014-02-18 22:11:59451void SingleThreadProxy::UpdateRendererCapabilitiesOnImplThread() {
452 DCHECK(IsImplThread());
453 renderer_capabilities_for_main_thread_ =
454 layer_tree_host_impl_->GetRendererCapabilities().MainThreadCapabilities();
455}
456
[email protected]c1bb5af2013-03-13 19:06:27457void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() {
[email protected]ccc08dc2014-01-30 07:33:20458 TRACE_EVENT0("cc", "SingleThreadProxy::DidLoseOutputSurfaceOnImplThread");
[email protected]aeeedad2014-08-22 18:16:22459 {
460 DebugScopedSetMainThread main(this);
461 // This must happen before we notify the scheduler as it may try to recreate
462 // the output surface if already in BEGIN_IMPL_FRAME_STATE_IDLE.
463 layer_tree_host_->DidLoseOutputSurface();
464 }
[email protected]4d7e46a2013-11-08 05:33:40465 client_->DidAbortSwapBuffers();
[email protected]aeeedad2014-08-22 18:16:22466 if (scheduler_on_impl_thread_)
467 scheduler_on_impl_thread_->DidLoseOutputSurface();
[email protected]4d7e46a2013-11-08 05:33:40468}
469
weiliangcaf17af42014-12-15 22:17:02470void SingleThreadProxy::CommitVSyncParameters(base::TimeTicks timebase,
471 base::TimeDelta interval) {
472 if (scheduler_on_impl_thread_)
473 scheduler_on_impl_thread_->CommitVSyncParameters(timebase, interval);
474}
475
jbauman93a5a902015-03-13 22:16:55476void SingleThreadProxy::SetEstimatedParentDrawTime(base::TimeDelta draw_time) {
477 if (scheduler_on_impl_thread_)
478 scheduler_on_impl_thread_->SetEstimatedParentDrawTime(draw_time);
479}
480
alexst346f30c2015-03-25 13:24:05481void SingleThreadProxy::SetMaxSwapsPendingOnImplThread(int max) {
482 if (scheduler_on_impl_thread_)
483 scheduler_on_impl_thread_->SetMaxSwapsPending(max);
484}
485
[email protected]4d7e46a2013-11-08 05:33:40486void SingleThreadProxy::DidSwapBuffersOnImplThread() {
[email protected]aeeedad2014-08-22 18:16:22487 TRACE_EVENT0("cc", "SingleThreadProxy::DidSwapBuffersOnImplThread");
488 if (scheduler_on_impl_thread_)
489 scheduler_on_impl_thread_->DidSwapBuffers();
[email protected]4d7e46a2013-11-08 05:33:40490 client_->DidPostSwapBuffers();
491}
492
[email protected]c14902662014-04-18 05:06:11493void SingleThreadProxy::DidSwapBuffersCompleteOnImplThread() {
miletusfed8c43b2015-01-26 20:04:52494 TRACE_EVENT0("cc,benchmark",
495 "SingleThreadProxy::DidSwapBuffersCompleteOnImplThread");
[email protected]aeeedad2014-08-22 18:16:22496 if (scheduler_on_impl_thread_)
497 scheduler_on_impl_thread_->DidSwapBuffersComplete();
498 layer_tree_host_->DidCompleteSwapBuffers();
[email protected]493067512012-09-19 23:34:10499}
500
sunnypseab5ac92015-04-02 20:26:13501void SingleThreadProxy::OnDrawForOutputSurface() {
502 NOTREACHED() << "Implemented by ThreadProxy for synchronous compositor.";
503}
504
mpbed24c2c2015-06-05 20:57:13505void SingleThreadProxy::PostFrameTimingEventsOnImplThread(
506 scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events,
507 scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) {
508 layer_tree_host_->RecordFrameTimingEvents(composite_events.Pass(),
509 main_frame_events.Pass());
510}
511
wangxianzhu67d1fae2015-06-30 22:15:53512void SingleThreadProxy::LayoutAndUpdateLayers() {
513 if (layer_tree_host_->output_surface_lost()) {
514 RequestNewOutputSurface();
515 // RequestNewOutputSurface could have synchronously created an output
516 // surface, so check again before returning.
517 if (layer_tree_host_->output_surface_lost())
518 return;
519 }
520
521 layer_tree_host_->Layout();
522 layer_tree_host_->UpdateLayers();
523}
524
[email protected]f0c2a242013-03-15 19:34:52525void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) {
miletusfed8c43b2015-01-26 20:04:52526 TRACE_EVENT0("cc,benchmark", "SingleThreadProxy::CompositeImmediately");
[email protected]51f81da2014-05-16 21:29:26527 DCHECK(Proxy::IsMainThread());
mithro51693e382015-05-07 23:52:41528#if DCHECK_IS_ON()
mithroc76d70312015-05-04 23:51:13529 DCHECK(!inside_impl_frame_);
mithro51693e382015-05-07 23:52:41530#endif
jbauman399aec1a2014-10-25 02:33:32531 base::AutoReset<bool> inside_composite(&inside_synchronous_composite_, true);
532
533 if (layer_tree_host_->output_surface_lost()) {
534 RequestNewOutputSurface();
535 // RequestNewOutputSurface could have synchronously created an output
536 // surface, so check again before returning.
537 if (layer_tree_host_->output_surface_lost())
538 return;
539 }
[email protected]51f81da2014-05-16 21:29:26540
mithroc76d70312015-05-04 23:51:13541 BeginFrameArgs begin_frame_args(BeginFrameArgs::Create(
542 BEGINFRAME_FROM_HERE, frame_begin_time, base::TimeTicks(),
543 BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL));
544
545 // Start the impl frame.
enne98f3a6c2014-10-09 20:09:44546 {
mithroc76d70312015-05-04 23:51:13547 DebugScopedSetImplThread impl(this);
548 WillBeginImplFrame(begin_frame_args);
549 }
550
551 // Run the "main thread" and get it to commit.
552 {
mithro51693e382015-05-07 23:52:41553#if DCHECK_IS_ON()
mithroc76d70312015-05-04 23:51:13554 DCHECK(inside_impl_frame_);
mithro51693e382015-05-07 23:52:41555#endif
enne98f3a6c2014-10-09 20:09:44556 DoBeginMainFrame(begin_frame_args);
557 DoCommit();
[email protected]e0341352013-04-06 05:01:20558
enne98f3a6c2014-10-09 20:09:44559 DCHECK_EQ(0u, layer_tree_host_->num_queued_swap_promises())
560 << "Commit should always succeed and transfer promises.";
561 }
562
mithroc76d70312015-05-04 23:51:13563 // Finish the impl frame.
enne98f3a6c2014-10-09 20:09:44564 {
mithroc76d70312015-05-04 23:51:13565 DebugScopedSetImplThread impl(this);
danakj68803fc2015-06-19 20:55:53566 layer_tree_host_impl_->ActivateSyncTree();
567 DCHECK(
568 !layer_tree_host_impl_->active_tree()->needs_update_draw_properties());
569 layer_tree_host_impl_->PrepareTiles();
570 layer_tree_host_impl_->SynchronouslyInitializeAllTiles();
enne69277cb2014-10-29 23:03:40571
danakj12e2f6e2015-08-19 22:25:44572 // TODO(danakj): Don't do this last... we prepared the wrong things. D:
573 layer_tree_host_impl_->Animate();
mithro719bf6792014-11-10 15:36:47574
enne98f3a6c2014-10-09 20:09:44575 LayerTreeHostImpl::FrameData frame;
mithro248d1722015-05-05 05:23:45576 DoComposite(&frame);
enne98f3a6c2014-10-09 20:09:44577
578 // DoComposite could abort, but because this is a synchronous composite
579 // another draw will never be scheduled, so break remaining promises.
580 layer_tree_host_impl_->active_tree()->BreakSwapPromises(
581 SwapPromise::SWAP_FAILS);
mithroc76d70312015-05-04 23:51:13582
mithro51693e382015-05-07 23:52:41583 DidFinishImplFrame();
enne98f3a6c2014-10-09 20:09:44584 }
[email protected]74d9063c2013-01-18 03:14:47585}
586
[email protected]5d8bec72014-07-03 03:03:11587bool SingleThreadProxy::SupportsImplScrolling() const {
588 return false;
589}
590
[email protected]3d9f7432013-04-06 00:35:18591bool SingleThreadProxy::ShouldComposite() const {
592 DCHECK(Proxy::IsImplThread());
593 return layer_tree_host_impl_->visible() &&
594 layer_tree_host_impl_->CanDraw();
595}
596
jbauman8ab0f9e2014-10-15 02:30:34597void SingleThreadProxy::ScheduleRequestNewOutputSurface() {
598 if (output_surface_creation_callback_.IsCancelled() &&
599 !output_surface_creation_requested_) {
600 output_surface_creation_callback_.Reset(
601 base::Bind(&SingleThreadProxy::RequestNewOutputSurface,
602 weak_factory_.GetWeakPtr()));
603 MainThreadTaskRunner()->PostTask(
604 FROM_HERE, output_surface_creation_callback_.callback());
605 }
606}
607
mithro248d1722015-05-05 05:23:45608DrawResult SingleThreadProxy::DoComposite(LayerTreeHostImpl::FrameData* frame) {
[email protected]ccc08dc2014-01-30 07:33:20609 TRACE_EVENT0("cc", "SingleThreadProxy::DoComposite");
[email protected]04049fc2013-05-01 03:13:20610 DCHECK(!layer_tree_host_->output_surface_lost());
611
enne98f3a6c2014-10-09 20:09:44612 DrawResult draw_result;
613 bool draw_frame;
[email protected]a8a049c2013-03-11 23:27:06614 {
615 DebugScopedSetImplThread impl(this);
616 base::AutoReset<bool> mark_inside(&inside_draw_, true);
617
robliao27728e62015-03-21 07:39:34618 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
619 // is fixed.
620 tracked_objects::ScopedTracker tracking_profile1(
621 FROM_HERE_WITH_EXPLICIT_FUNCTION(
622 "461509 SingleThreadProxy::DoComposite1"));
623
[email protected]3d9f7432013-04-06 00:35:18624 // We guard PrepareToDraw() with CanDraw() because it always returns a valid
625 // frame, so can only be used when such a frame is possible. Since
626 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on
627 // CanDraw() as well.
[email protected]2aae96792014-05-15 23:10:50628 if (!ShouldComposite()) {
[email protected]aeeedad2014-08-22 18:16:22629 return DRAW_ABORTED_CANT_DRAW;
[email protected]3d9f7432013-04-06 00:35:18630 }
[email protected]a8a049c2013-03-11 23:27:06631
robliao27728e62015-03-21 07:39:34632 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
633 // is fixed.
634 tracked_objects::ScopedTracker tracking_profile2(
635 FROM_HERE_WITH_EXPLICIT_FUNCTION(
636 "461509 SingleThreadProxy::DoComposite2"));
enne98f3a6c2014-10-09 20:09:44637 draw_result = layer_tree_host_impl_->PrepareToDraw(frame);
638 draw_frame = draw_result == DRAW_SUCCESS;
robliao27728e62015-03-21 07:39:34639 if (draw_frame) {
640 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
641 // is fixed.
642 tracked_objects::ScopedTracker tracking_profile3(
643 FROM_HERE_WITH_EXPLICIT_FUNCTION(
644 "461509 SingleThreadProxy::DoComposite3"));
mithro248d1722015-05-05 05:23:45645 layer_tree_host_impl_->DrawLayers(frame);
robliao27728e62015-03-21 07:39:34646 }
647 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
648 // is fixed.
649 tracked_objects::ScopedTracker tracking_profile4(
650 FROM_HERE_WITH_EXPLICIT_FUNCTION(
651 "461509 SingleThreadProxy::DoComposite4"));
dnetob71e30c2014-08-25 23:27:20652 layer_tree_host_impl_->DidDrawAllLayers(*frame);
[email protected]a8a049c2013-03-11 23:27:06653
enne98f3a6c2014-10-09 20:09:44654 bool start_ready_animations = draw_frame;
robliao27728e62015-03-21 07:39:34655 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
656 // is fixed.
657 tracked_objects::ScopedTracker tracking_profile5(
658 FROM_HERE_WITH_EXPLICIT_FUNCTION(
659 "461509 SingleThreadProxy::DoComposite5"));
[email protected]3d9f7432013-04-06 00:35:18660 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations);
[email protected]aeeedad2014-08-22 18:16:22661
robliao27728e62015-03-21 07:39:34662 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
663 // is fixed.
664 tracked_objects::ScopedTracker tracking_profile7(
665 FROM_HERE_WITH_EXPLICIT_FUNCTION(
666 "461509 SingleThreadProxy::DoComposite7"));
[email protected]a8a049c2013-03-11 23:27:06667 }
668
enne98f3a6c2014-10-09 20:09:44669 if (draw_frame) {
[email protected]aeeedad2014-08-22 18:16:22670 DebugScopedSetImplThread impl(this);
[email protected]174c6d42014-08-12 01:43:06671
dnetob71e30c2014-08-25 23:27:20672 // This CapturePostTasks should be destroyed before
673 // DidCommitAndDrawFrame() is called since that goes out to the
674 // embedder,
675 // and we want the embedder to receive its callbacks before that.
676 // NOTE: This maintains consistent ordering with the ThreadProxy since
677 // the DidCommitAndDrawFrame() must be post-tasked from the impl thread
678 // there as the main thread is not blocked, so any posted tasks inside
679 // the swap buffers will execute first.
680 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
[email protected]aeeedad2014-08-22 18:16:22681
skyostil3976a3f2014-09-04 22:07:23682 BlockingTaskRunner::CapturePostTasks blocked(
683 blocking_main_thread_task_runner());
robliao27728e62015-03-21 07:39:34684 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509
685 // is fixed.
686 tracked_objects::ScopedTracker tracking_profile8(
687 FROM_HERE_WITH_EXPLICIT_FUNCTION(
688 "461509 SingleThreadProxy::DoComposite8"));
dnetob71e30c2014-08-25 23:27:20689 layer_tree_host_impl_->SwapBuffers(*frame);
[email protected]aeeedad2014-08-22 18:16:22690 }
robliao27728e62015-03-21 07:39:34691 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/461509 is
692 // fixed.
693 tracked_objects::ScopedTracker tracking_profile9(
694 FROM_HERE_WITH_EXPLICIT_FUNCTION(
695 "461509 SingleThreadProxy::DoComposite9"));
[email protected]aeeedad2014-08-22 18:16:22696 DidCommitAndDrawFrame();
697
enne98f3a6c2014-10-09 20:09:44698 return draw_result;
[email protected]a8a049c2013-03-11 23:27:06699}
700
[email protected]aeeedad2014-08-22 18:16:22701void SingleThreadProxy::DidCommitAndDrawFrame() {
[email protected]a8a049c2013-03-11 23:27:06702 if (next_frame_is_newly_committed_frame_) {
[email protected]aeeedad2014-08-22 18:16:22703 DebugScopedSetMainThread main(this);
[email protected]a8a049c2013-03-11 23:27:06704 next_frame_is_newly_committed_frame_ = false;
[email protected]804c8982013-03-13 16:32:21705 layer_tree_host_->DidCommitAndDrawFrame();
[email protected]a8a049c2013-03-11 23:27:06706 }
707}
708
[email protected]4ea293f72014-08-13 03:03:17709bool SingleThreadProxy::MainFrameWillHappenForTesting() {
danakjfcdaba122015-04-24 21:41:52710 if (layer_tree_host_->output_surface_lost())
711 return false;
712 if (!scheduler_on_impl_thread_)
713 return false;
714 return scheduler_on_impl_thread_->MainFrameForTestingWillHappen();
[email protected]4ea293f72014-08-13 03:03:17715}
[email protected]a8a049c2013-03-11 23:27:06716
simonhongd3d5f7f2014-11-21 16:38:03717void SingleThreadProxy::SetChildrenNeedBeginFrames(
718 bool children_need_begin_frames) {
719 scheduler_on_impl_thread_->SetChildrenNeedBeginFrames(
720 children_need_begin_frames);
721}
722
simonhong298590fe2015-03-25 06:51:13723void SingleThreadProxy::SetAuthoritativeVSyncInterval(
724 const base::TimeDelta& interval) {
725 scheduler_on_impl_thread_->SetAuthoritativeVSyncInterval(interval);
726}
727
[email protected]aeeedad2014-08-22 18:16:22728void SingleThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) {
mithro51693e382015-05-07 23:52:41729#if DCHECK_IS_ON()
mithro69fd3bb52015-05-01 03:45:02730 DCHECK(!inside_impl_frame_)
731 << "WillBeginImplFrame called while already inside an impl frame!";
732 inside_impl_frame_ = true;
mithro51693e382015-05-07 23:52:41733#endif
[email protected]aeeedad2014-08-22 18:16:22734 layer_tree_host_impl_->WillBeginImplFrame(args);
735}
736
737void SingleThreadProxy::ScheduledActionSendBeginMainFrame() {
738 TRACE_EVENT0("cc", "SingleThreadProxy::ScheduledActionSendBeginMainFrame");
739 // Although this proxy is single-threaded, it's problematic to synchronously
740 // have BeginMainFrame happen after ScheduledActionSendBeginMainFrame. This
741 // could cause a commit to occur in between a series of SetNeedsCommit calls
742 // (i.e. property modifications) causing some to fall on one frame and some to
743 // fall on the next. Doing it asynchronously instead matches the semantics of
744 // ThreadProxy::SetNeedsCommit where SetNeedsCommit will not cause a
745 // synchronous commit.
mithro51693e382015-05-07 23:52:41746#if DCHECK_IS_ON()
mithro69fd3bb52015-05-01 03:45:02747 DCHECK(inside_impl_frame_)
748 << "BeginMainFrame should only be sent inside a BeginImplFrame";
mithro51693e382015-05-07 23:52:41749#endif
mithro69fd3bb52015-05-01 03:45:02750 const BeginFrameArgs& begin_frame_args =
751 layer_tree_host_impl_->CurrentBeginFrameArgs();
752
[email protected]aeeedad2014-08-22 18:16:22753 MainThreadTaskRunner()->PostTask(
mithro69fd3bb52015-05-01 03:45:02754 FROM_HERE, base::Bind(&SingleThreadProxy::BeginMainFrame,
755 weak_factory_.GetWeakPtr(), begin_frame_args));
[email protected]aeeedad2014-08-22 18:16:22756}
757
rmcilroy0a19362a2015-02-18 12:34:25758void SingleThreadProxy::SendBeginMainFrameNotExpectedSoon() {
759 layer_tree_host_->BeginMainFrameNotExpectedSoon();
760}
761
mithro69fd3bb52015-05-01 03:45:02762void SingleThreadProxy::BeginMainFrame(const BeginFrameArgs& begin_frame_args) {
danakjfcdaba122015-04-24 21:41:52763 commit_requested_ = false;
brianderson49e101d22015-04-29 00:05:33764 animate_requested_ = false;
danakjfcdaba122015-04-24 21:41:52765
[email protected]aeeedad2014-08-22 18:16:22766 if (defer_commits_) {
simonhongc6309f792015-01-31 15:47:15767 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit",
768 TRACE_EVENT_SCOPE_THREAD);
769 BeginMainFrameAbortedOnImplThread(
770 CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT);
[email protected]aeeedad2014-08-22 18:16:22771 return;
772 }
773
enne98f3a6c2014-10-09 20:09:44774 // This checker assumes NotifyReadyToCommit in this stack causes a synchronous
775 // commit.
[email protected]aeeedad2014-08-22 18:16:22776 ScopedAbortRemainingSwapPromises swap_promise_checker(layer_tree_host_);
777
778 if (!layer_tree_host_->visible()) {
779 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD);
mithrof7a21502014-12-17 03:24:48780 BeginMainFrameAbortedOnImplThread(
781 CommitEarlyOutReason::ABORTED_NOT_VISIBLE);
[email protected]aeeedad2014-08-22 18:16:22782 return;
783 }
784
785 if (layer_tree_host_->output_surface_lost()) {
786 TRACE_EVENT_INSTANT0(
787 "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD);
mithrof7a21502014-12-17 03:24:48788 BeginMainFrameAbortedOnImplThread(
789 CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST);
[email protected]aeeedad2014-08-22 18:16:22790 return;
791 }
792
danakjfcdaba122015-04-24 21:41:52793 // Prevent new commits from being requested inside DoBeginMainFrame.
brianderson49e101d22015-04-29 00:05:33794 // Note: We do not want to prevent SetNeedsAnimate from requesting
795 // a commit here.
danakjfcdaba122015-04-24 21:41:52796 commit_requested_ = true;
797
enne98f3a6c2014-10-09 20:09:44798 DoBeginMainFrame(begin_frame_args);
799}
800
801void SingleThreadProxy::DoBeginMainFrame(
802 const BeginFrameArgs& begin_frame_args) {
803 layer_tree_host_->WillBeginMainFrame();
804 layer_tree_host_->BeginMainFrame(begin_frame_args);
805 layer_tree_host_->AnimateLayers(begin_frame_args.frame_time);
806 layer_tree_host_->Layout();
807
danakjfcdaba122015-04-24 21:41:52808 // New commits requested inside UpdateLayers should be respected.
809 commit_requested_ = false;
810
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
enne98f3a6c2014-10-09 20:09:44816 if (scheduler_on_impl_thread_) {
817 scheduler_on_impl_thread_->NotifyBeginMainFrameStarted();
818 scheduler_on_impl_thread_->NotifyReadyToCommit();
819 }
[email protected]aeeedad2014-08-22 18:16:22820}
821
mithrof7a21502014-12-17 03:24:48822void SingleThreadProxy::BeginMainFrameAbortedOnImplThread(
823 CommitEarlyOutReason reason) {
[email protected]aeeedad2014-08-22 18:16:22824 DebugScopedSetImplThread impl(this);
825 DCHECK(scheduler_on_impl_thread_->CommitPending());
826 DCHECK(!layer_tree_host_impl_->pending_tree());
827
mithrof7a21502014-12-17 03:24:48828 layer_tree_host_impl_->BeginMainFrameAborted(reason);
829 scheduler_on_impl_thread_->BeginMainFrameAborted(reason);
[email protected]aeeedad2014-08-22 18:16:22830}
831
832DrawResult SingleThreadProxy::ScheduledActionDrawAndSwapIfPossible() {
833 DebugScopedSetImplThread impl(this);
[email protected]aeeedad2014-08-22 18:16:22834 LayerTreeHostImpl::FrameData frame;
mithro248d1722015-05-05 05:23:45835 return DoComposite(&frame);
[email protected]aeeedad2014-08-22 18:16:22836}
837
838DrawResult SingleThreadProxy::ScheduledActionDrawAndSwapForced() {
839 NOTREACHED();
840 return INVALID_RESULT;
841}
842
843void SingleThreadProxy::ScheduledActionCommit() {
844 DebugScopedSetMainThread main(this);
enne98f3a6c2014-10-09 20:09:44845 DoCommit();
[email protected]aeeedad2014-08-22 18:16:22846}
847
848void SingleThreadProxy::ScheduledActionAnimate() {
849 TRACE_EVENT0("cc", "ScheduledActionAnimate");
mithro719bf6792014-11-10 15:36:47850 DebugScopedSetImplThread impl(this);
danakj12e2f6e2015-08-19 22:25:44851 layer_tree_host_impl_->Animate();
[email protected]aeeedad2014-08-22 18:16:22852}
853
[email protected]aeeedad2014-08-22 18:16:22854void SingleThreadProxy::ScheduledActionActivateSyncTree() {
enne98f3a6c2014-10-09 20:09:44855 DebugScopedSetImplThread impl(this);
856 layer_tree_host_impl_->ActivateSyncTree();
[email protected]aeeedad2014-08-22 18:16:22857}
858
859void SingleThreadProxy::ScheduledActionBeginOutputSurfaceCreation() {
860 DebugScopedSetMainThread main(this);
861 DCHECK(scheduler_on_impl_thread_);
862 // If possible, create the output surface in a post task. Synchronously
863 // creating the output surface makes tests more awkward since this differs
864 // from the ThreadProxy behavior. However, sometimes there is no
865 // task runner.
866 if (Proxy::MainThreadTaskRunner()) {
jbauman8ab0f9e2014-10-15 02:30:34867 ScheduleRequestNewOutputSurface();
[email protected]aeeedad2014-08-22 18:16:22868 } else {
enne2097cab2014-09-25 20:16:31869 RequestNewOutputSurface();
[email protected]aeeedad2014-08-22 18:16:22870 }
871}
872
vmiura59ea9b4042014-12-09 20:50:39873void SingleThreadProxy::ScheduledActionPrepareTiles() {
874 TRACE_EVENT0("cc", "SingleThreadProxy::ScheduledActionPrepareTiles");
enne98f3a6c2014-10-09 20:09:44875 DebugScopedSetImplThread impl(this);
vmiura59ea9b4042014-12-09 20:50:39876 layer_tree_host_impl_->PrepareTiles();
[email protected]aeeedad2014-08-22 18:16:22877}
878
sunnypseab5ac92015-04-02 20:26:13879void SingleThreadProxy::ScheduledActionInvalidateOutputSurface() {
880 NOTREACHED();
881}
882
khushalsagarc646cd62015-10-17 00:05:48883void SingleThreadProxy::UpdateTopControlsState(TopControlsState constraints,
884 TopControlsState current,
885 bool animate) {
886 NOTREACHED() << "Top Controls are used only in threaded mode";
887}
888
mithro51693e382015-05-07 23:52:41889void SingleThreadProxy::DidFinishImplFrame() {
890 layer_tree_host_impl_->DidFinishImplFrame();
891#if DCHECK_IS_ON()
mithro69fd3bb52015-05-01 03:45:02892 DCHECK(inside_impl_frame_)
mithro51693e382015-05-07 23:52:41893 << "DidFinishImplFrame called while not inside an impl frame!";
mithro69fd3bb52015-05-01 03:45:02894 inside_impl_frame_ = false;
mithro51693e382015-05-07 23:52:41895#endif
[email protected]aeeedad2014-08-22 18:16:22896}
897
simonhongd3d5f7f2014-11-21 16:38:03898void SingleThreadProxy::SendBeginFramesToChildren(const BeginFrameArgs& args) {
899 layer_tree_host_->SendBeginFramesToChildren(args);
900}
901
[email protected]bc5e77c2012-11-05 20:00:49902} // namespace cc