blob: f913c1f1a011994ba0baa9674946907a784e7e26 [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"
primianoc06e2382015-01-28 04:21:498#include "base/trace_event/trace_event.h"
[email protected]adbe30f2013-10-11 21:12:339#include "cc/debug/benchmark_instrumentation.h"
caseq7d2f4c92015-02-04 16:43:2710#include "cc/debug/devtools_instrumentation.h"
[email protected]7f0d825f2013-03-18 07:24:3011#include "cc/output/context_provider.h"
12#include "cc/output/output_surface.h"
[email protected]89e82672013-03-18 07:50:5613#include "cc/quads/draw_quad.h"
[email protected]e12dd0e2013-03-18 08:24:4014#include "cc/resources/prioritized_resource_manager.h"
15#include "cc/resources/resource_update_controller.h"
mithrof7a21502014-12-17 03:24:4816#include "cc/scheduler/commit_earlyout_reason.h"
[email protected]556fd292013-03-18 08:03:0417#include "cc/trees/layer_tree_host.h"
[email protected]943528e2013-11-07 05:01:3218#include "cc/trees/layer_tree_host_single_thread_client.h"
[email protected]556fd292013-03-18 08:03:0419#include "cc/trees/layer_tree_impl.h"
[email protected]aeeedad2014-08-22 18:16:2220#include "cc/trees/scoped_abort_remaining_swap_promises.h"
[email protected]de2cf8c2013-10-25 19:46:4621#include "ui/gfx/frame_time.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),
[email protected]aeeedad2014-08-22 18:16:2245 timing_history_(layer_tree_host->rendering_stats_instrumentation()),
[email protected]a8a049c2013-03-11 23:27:0646 next_frame_is_newly_committed_frame_(false),
[email protected]aeeedad2014-08-22 18:16:2247 inside_draw_(false),
48 defer_commits_(false),
[email protected]aeeedad2014-08-22 18:16:2249 commit_requested_(false),
jbauman399aec1a2014-10-25 02:33:3250 inside_synchronous_composite_(false),
jbauman8ab0f9e2014-10-15 02:30:3451 output_surface_creation_requested_(false),
simonhonga7e3ac42014-11-11 20:50:2252 external_begin_frame_source_(external_begin_frame_source.Pass()),
[email protected]aeeedad2014-08-22 18:16:2253 weak_factory_(this) {
[email protected]a8a049c2013-03-11 23:27:0654 TRACE_EVENT0("cc", "SingleThreadProxy::SingleThreadProxy");
55 DCHECK(Proxy::IsMainThread());
56 DCHECK(layer_tree_host);
[email protected]94f206c12012-08-25 00:09:1457}
58
[email protected]e96e3432013-12-19 18:56:0759void SingleThreadProxy::Start() {
[email protected]a8a049c2013-03-11 23:27:0660 DebugScopedSetImplThread impl(this);
[email protected]804c8982013-03-13 16:32:2161 layer_tree_host_impl_ = layer_tree_host_->CreateLayerTreeHostImpl(this);
[email protected]a8a049c2013-03-11 23:27:0662}
63
64SingleThreadProxy::~SingleThreadProxy() {
65 TRACE_EVENT0("cc", "SingleThreadProxy::~SingleThreadProxy");
66 DCHECK(Proxy::IsMainThread());
[email protected]04049fc2013-05-01 03:13:2067 // Make sure Stop() got called or never Started.
68 DCHECK(!layer_tree_host_impl_);
[email protected]a8a049c2013-03-11 23:27:0669}
70
[email protected]a8a049c2013-03-11 23:27:0671void SingleThreadProxy::FinishAllRendering() {
[email protected]ccc08dc2014-01-30 07:33:2072 TRACE_EVENT0("cc", "SingleThreadProxy::FinishAllRendering");
[email protected]a8a049c2013-03-11 23:27:0673 DCHECK(Proxy::IsMainThread());
74 {
[email protected]61de5812012-11-08 07:03:4475 DebugScopedSetImplThread impl(this);
[email protected]c1bb5af2013-03-13 19:06:2776 layer_tree_host_impl_->FinishAllRendering();
[email protected]a8a049c2013-03-11 23:27:0677 }
[email protected]94f206c12012-08-25 00:09:1478}
79
[email protected]a8a049c2013-03-11 23:27:0680bool SingleThreadProxy::IsStarted() const {
81 DCHECK(Proxy::IsMainThread());
[email protected]3209161d2013-03-29 19:17:3482 return layer_tree_host_impl_;
[email protected]94f206c12012-08-25 00:09:1483}
84
[email protected]14bd5542013-05-08 21:51:3085void SingleThreadProxy::SetLayerTreeHostClientReady() {
[email protected]ccc08dc2014-01-30 07:33:2086 TRACE_EVENT0("cc", "SingleThreadProxy::SetLayerTreeHostClientReady");
[email protected]a8a049c2013-03-11 23:27:0687 // Scheduling is controlled by the embedder in the single thread case, so
88 // nothing to do.
[email protected]aeeedad2014-08-22 18:16:2289 DCHECK(Proxy::IsMainThread());
90 DebugScopedSetImplThread impl(this);
91 if (layer_tree_host_->settings().single_thread_proxy_scheduler &&
92 !scheduler_on_impl_thread_) {
93 SchedulerSettings scheduler_settings(layer_tree_host_->settings());
weiliangc5efa0a12015-01-29 19:56:4694 // SingleThreadProxy should run in main thread low latency mode.
weiliangc57b14e4a2014-12-04 22:59:0995 scheduler_settings.main_thread_should_always_be_low_latency = true;
simonhonga7e3ac42014-11-11 20:50:2296 scheduler_on_impl_thread_ =
97 Scheduler::Create(this,
98 scheduler_settings,
99 layer_tree_host_->id(),
100 MainThreadTaskRunner(),
101 base::PowerMonitor::Get(),
102 external_begin_frame_source_.Pass());
[email protected]aeeedad2014-08-22 18:16:22103 scheduler_on_impl_thread_->SetCanStart();
104 scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible());
105 }
[email protected]a8a049c2013-03-11 23:27:06106}
107
108void SingleThreadProxy::SetVisible(bool visible) {
mithro46adf5a2014-11-19 14:52:40109 TRACE_EVENT1("cc", "SingleThreadProxy::SetVisible", "visible", visible);
[email protected]f7c01c82013-07-02 22:58:46110 DebugScopedSetImplThread impl(this);
[email protected]c1bb5af2013-03-13 19:06:27111 layer_tree_host_impl_->SetVisible(visible);
[email protected]aeeedad2014-08-22 18:16:22112 if (scheduler_on_impl_thread_)
113 scheduler_on_impl_thread_->SetVisible(layer_tree_host_impl_->visible());
[email protected]8ea875b2013-08-07 00:32:12114 // Changing visibility could change ShouldComposite().
[email protected]a8a049c2013-03-11 23:27:06115}
116
bajones274110612015-01-06 20:53:59117void SingleThreadProxy::SetThrottleFrameProduction(bool throttle) {
118 TRACE_EVENT1("cc", "SingleThreadProxy::SetThrottleFrameProduction",
119 "throttle", throttle);
120 DebugScopedSetImplThread impl(this);
121 if (scheduler_on_impl_thread_)
122 scheduler_on_impl_thread_->SetThrottleFrameProduction(throttle);
123}
124
enne2097cab2014-09-25 20:16:31125void SingleThreadProxy::RequestNewOutputSurface() {
[email protected]a8a049c2013-03-11 23:27:06126 DCHECK(Proxy::IsMainThread());
[email protected]497edf82014-05-20 21:53:15127 DCHECK(layer_tree_host_->output_surface_lost());
jbauman8ab0f9e2014-10-15 02:30:34128 output_surface_creation_callback_.Cancel();
129 if (output_surface_creation_requested_)
130 return;
131 output_surface_creation_requested_ = true;
enne2097cab2014-09-25 20:16:31132 layer_tree_host_->RequestNewOutputSurface();
133}
[email protected]94f206c12012-08-25 00:09:14134
enne2097cab2014-09-25 20:16:31135void SingleThreadProxy::SetOutputSurface(
136 scoped_ptr<OutputSurface> output_surface) {
137 DCHECK(Proxy::IsMainThread());
138 DCHECK(layer_tree_host_->output_surface_lost());
enne5232fbb2015-01-27 21:22:41139 DCHECK(output_surface_creation_requested_);
[email protected]da8e3b72b2014-04-25 02:33:45140 renderer_capabilities_for_main_thread_ = RendererCapabilities();
141
enne7f8fdde2014-12-10 21:32:09142 bool success;
143 {
[email protected]819b9f52013-09-22 23:29:51144 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
[email protected]a8a049c2013-03-11 23:27:06145 DebugScopedSetImplThread impl(this);
[email protected]804c8982013-03-13 16:32:21146 layer_tree_host_->DeleteContentsTexturesOnImplThread(
[email protected]c1bb5af2013-03-13 19:06:27147 layer_tree_host_impl_->resource_provider());
[email protected]da8e3b72b2014-04-25 02:33:45148 success = layer_tree_host_impl_->InitializeRenderer(output_surface.Pass());
[email protected]04049fc2013-05-01 03:13:20149 }
150
[email protected]aeeedad2014-08-22 18:16:22151 if (success) {
enne7f8fdde2014-12-10 21:32:09152 layer_tree_host_->DidInitializeOutputSurface();
[email protected]aeeedad2014-08-22 18:16:22153 if (scheduler_on_impl_thread_)
154 scheduler_on_impl_thread_->DidCreateAndInitializeOutputSurface();
jbauman399aec1a2014-10-25 02:33:32155 else if (!inside_synchronous_composite_)
156 SetNeedsCommit();
enne5232fbb2015-01-27 21:22:41157 output_surface_creation_requested_ = false;
enne7f8fdde2014-12-10 21:32:09158 } else {
enne5232fbb2015-01-27 21:22:41159 // DidFailToInitializeOutputSurface is treated as a RequestNewOutputSurface,
160 // and so output_surface_creation_requested remains true.
enne7f8fdde2014-12-10 21:32:09161 layer_tree_host_->DidFailToInitializeOutputSurface();
[email protected]04049fc2013-05-01 03:13:20162 }
[email protected]94f206c12012-08-25 00:09:14163}
164
[email protected]a8a049c2013-03-11 23:27:06165const RendererCapabilities& SingleThreadProxy::GetRendererCapabilities() const {
[email protected]04049fc2013-05-01 03:13:20166 DCHECK(Proxy::IsMainThread());
167 DCHECK(!layer_tree_host_->output_surface_lost());
[email protected]a8a049c2013-03-11 23:27:06168 return renderer_capabilities_for_main_thread_;
[email protected]94f206c12012-08-25 00:09:14169}
170
[email protected]8b9e52b2014-01-17 16:35:31171void SingleThreadProxy::SetNeedsAnimate() {
[email protected]ccc08dc2014-01-30 07:33:20172 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsAnimate");
[email protected]c5134172013-12-11 06:19:48173 DCHECK(Proxy::IsMainThread());
[email protected]06cbc31b2014-01-17 06:43:20174 client_->ScheduleAnimation();
[email protected]aeeedad2014-08-22 18:16:22175 SetNeedsCommit();
[email protected]c5134172013-12-11 06:19:48176}
177
[email protected]8b9e52b2014-01-17 16:35:31178void SingleThreadProxy::SetNeedsUpdateLayers() {
[email protected]ccc08dc2014-01-30 07:33:20179 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsUpdateLayers");
[email protected]8b9e52b2014-01-17 16:35:31180 DCHECK(Proxy::IsMainThread());
[email protected]aeeedad2014-08-22 18:16:22181 SetNeedsCommit();
[email protected]8b9e52b2014-01-17 16:35:31182}
183
mithro719bf6792014-11-10 15:36:47184void SingleThreadProxy::DoAnimate() {
185 // Don't animate if there is no root layer.
186 // TODO(mithro): Both Animate and UpdateAnimationState already have a
187 // "!active_tree_->root_layer()" check?
188 if (!layer_tree_host_impl_->active_tree()->root_layer()) {
189 return;
190 }
191
192 layer_tree_host_impl_->Animate(
193 layer_tree_host_impl_->CurrentBeginFrameArgs().frame_time);
194
195 // If animations are not visible, update the animation state now as it
196 // won't happen in DoComposite.
197 if (!layer_tree_host_impl_->AnimationsAreVisible()) {
198 layer_tree_host_impl_->UpdateAnimationState(true);
199 }
200}
201
enne98f3a6c2014-10-09 20:09:44202void SingleThreadProxy::DoCommit() {
[email protected]ccc08dc2014-01-30 07:33:20203 TRACE_EVENT0("cc", "SingleThreadProxy::DoCommit");
[email protected]a8a049c2013-03-11 23:27:06204 DCHECK(Proxy::IsMainThread());
enne98f3a6c2014-10-09 20:09:44205
[email protected]aeeedad2014-08-22 18:16:22206 commit_requested_ = false;
[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 {
[email protected]819b9f52013-09-22 23:29:51213 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
[email protected]f7c01c82013-07-02 22:58:46214 DebugScopedSetImplThread impl(this);
215
[email protected]9794fb32013-08-29 09:49:59216 // This CapturePostTasks should be destroyed before CommitComplete() is
217 // called since that goes out to the embedder, and we want the embedder
218 // to receive its callbacks before that.
enne98f3a6c2014-10-09 20:09:44219 commit_blocking_task_runner_.reset(new BlockingTaskRunner::CapturePostTasks(
220 blocking_main_thread_task_runner()));
[email protected]9794fb32013-08-29 09:49:59221
[email protected]c1bb5af2013-03-13 19:06:27222 layer_tree_host_impl_->BeginCommit();
[email protected]94f206c12012-08-25 00:09:14223
[email protected]5d2fec02013-11-28 20:08:33224 if (PrioritizedResourceManager* contents_texture_manager =
225 layer_tree_host_->contents_texture_manager()) {
226 contents_texture_manager->PushTexturePrioritiesToBackings();
[email protected]6e8c54922013-06-02 19:17:35227 }
[email protected]804c8982013-03-13 16:32:21228 layer_tree_host_->BeginCommitOnImplThread(layer_tree_host_impl_.get());
[email protected]94f206c12012-08-25 00:09:14229
[email protected]ed511b8d2013-03-25 03:29:29230 scoped_ptr<ResourceUpdateController> update_controller =
[email protected]a8a049c2013-03-11 23:27:06231 ResourceUpdateController::Create(
232 NULL,
[email protected]aeeedad2014-08-22 18:16:22233 MainThreadTaskRunner(),
enne98f3a6c2014-10-09 20:09:44234 queue_for_commit_.Pass(),
[email protected]c1bb5af2013-03-13 19:06:27235 layer_tree_host_impl_->resource_provider());
[email protected]ed511b8d2013-03-25 03:29:29236 update_controller->Finalize();
[email protected]94f206c12012-08-25 00:09:14237
[email protected]127bdc1a2013-09-11 01:44:48238 if (layer_tree_host_impl_->EvictedUIResourcesExist())
239 layer_tree_host_->RecreateUIResources();
240
[email protected]804c8982013-03-13 16:32:21241 layer_tree_host_->FinishCommitOnImplThread(layer_tree_host_impl_.get());
[email protected]94f206c12012-08-25 00:09:14242
[email protected]c1bb5af2013-03-13 19:06:27243 layer_tree_host_impl_->CommitComplete();
[email protected]94f206c12012-08-25 00:09:14244
danakje649f572015-01-08 23:35:58245#if DCHECK_IS_ON()
[email protected]3519b872013-07-30 07:17:50246 // In the single-threaded case, the scale and scroll deltas should never be
[email protected]a8a049c2013-03-11 23:27:06247 // touched on the impl layer tree.
[email protected]ed511b8d2013-03-25 03:29:29248 scoped_ptr<ScrollAndScaleSet> scroll_info =
[email protected]c1bb5af2013-03-13 19:06:27249 layer_tree_host_impl_->ProcessScrollDeltas();
[email protected]ed511b8d2013-03-25 03:29:29250 DCHECK(!scroll_info->scrolls.size());
[email protected]3519b872013-07-30 07:17:50251 DCHECK_EQ(1.f, scroll_info->page_scale_delta);
[email protected]94f206c12012-08-25 00:09:14252#endif
[email protected]a8a049c2013-03-11 23:27:06253 }
enne98f3a6c2014-10-09 20:09:44254
255 if (layer_tree_host_->settings().impl_side_painting) {
256 // TODO(enne): just commit directly to the active tree.
257 //
258 // Synchronously activate during commit to satisfy any potential
259 // SetNextCommitWaitsForActivation calls. Unfortunately, the tree
260 // might not be ready to draw, so DidActivateSyncTree must set
261 // the flag to force the tree to not draw until textures are ready.
262 NotifyReadyToActivate();
263 } else {
264 CommitComplete();
265 }
266}
267
268void SingleThreadProxy::CommitComplete() {
269 DCHECK(!layer_tree_host_impl_->pending_tree())
270 << "Activation is expected to have synchronously occurred by now.";
271 DCHECK(commit_blocking_task_runner_);
272
273 DebugScopedSetMainThread main(this);
274 commit_blocking_task_runner_.reset();
[email protected]804c8982013-03-13 16:32:21275 layer_tree_host_->CommitComplete();
[email protected]aeeedad2014-08-22 18:16:22276 layer_tree_host_->DidBeginMainFrame();
277 timing_history_.DidCommit();
278
[email protected]a8a049c2013-03-11 23:27:06279 next_frame_is_newly_committed_frame_ = true;
[email protected]94f206c12012-08-25 00:09:14280}
281
[email protected]a8a049c2013-03-11 23:27:06282void SingleThreadProxy::SetNeedsCommit() {
283 DCHECK(Proxy::IsMainThread());
[email protected]aeeedad2014-08-22 18:16:22284 DebugScopedSetImplThread impl(this);
[email protected]943528e2013-11-07 05:01:32285 client_->ScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22286 if (scheduler_on_impl_thread_)
287 scheduler_on_impl_thread_->SetNeedsCommit();
288 commit_requested_ = true;
[email protected]94f206c12012-08-25 00:09:14289}
290
[email protected]0023fc72014-01-10 20:05:06291void SingleThreadProxy::SetNeedsRedraw(const gfx::Rect& damage_rect) {
[email protected]ccc08dc2014-01-30 07:33:20292 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsRedraw");
[email protected]aeeedad2014-08-22 18:16:22293 DCHECK(Proxy::IsMainThread());
294 DebugScopedSetImplThread impl(this);
[email protected]2decdd782014-08-13 22:36:06295 client_->ScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22296 SetNeedsRedrawRectOnImplThread(damage_rect);
[email protected]94f206c12012-08-25 00:09:14297}
298
[email protected]74b43cc2013-08-30 06:29:27299void SingleThreadProxy::SetNextCommitWaitsForActivation() {
enne98f3a6c2014-10-09 20:09:44300 // Activation always forced in commit, so nothing to do.
[email protected]aeeedad2014-08-22 18:16:22301 DCHECK(Proxy::IsMainThread());
[email protected]74b43cc2013-08-30 06:29:27302}
303
[email protected]a8a049c2013-03-11 23:27:06304void SingleThreadProxy::SetDeferCommits(bool defer_commits) {
[email protected]aeeedad2014-08-22 18:16:22305 DCHECK(Proxy::IsMainThread());
306 // Deferring commits only makes sense if there's a scheduler.
307 if (!scheduler_on_impl_thread_)
308 return;
309 if (defer_commits_ == defer_commits)
310 return;
311
312 if (defer_commits)
313 TRACE_EVENT_ASYNC_BEGIN0("cc", "SingleThreadProxy::SetDeferCommits", this);
314 else
315 TRACE_EVENT_ASYNC_END0("cc", "SingleThreadProxy::SetDeferCommits", this);
316
317 defer_commits_ = defer_commits;
simonhongc6309f792015-01-31 15:47:15318 scheduler_on_impl_thread_->SetDeferCommits(defer_commits);
[email protected]6b16679e2012-10-27 00:44:28319}
320
[email protected]174c6d42014-08-12 01:43:06321bool SingleThreadProxy::CommitRequested() const {
[email protected]aeeedad2014-08-22 18:16:22322 DCHECK(Proxy::IsMainThread());
323 return commit_requested_;
[email protected]174c6d42014-08-12 01:43:06324}
[email protected]a8a049c2013-03-11 23:27:06325
[email protected]174c6d42014-08-12 01:43:06326bool SingleThreadProxy::BeginMainFrameRequested() const {
[email protected]aeeedad2014-08-22 18:16:22327 DCHECK(Proxy::IsMainThread());
328 // If there is no scheduler, then there can be no pending begin frame,
329 // as all frames are all manually initiated by the embedder of cc.
330 if (!scheduler_on_impl_thread_)
331 return false;
332 return commit_requested_;
[email protected]174c6d42014-08-12 01:43:06333}
[email protected]971728d2013-10-26 10:39:31334
[email protected]a8a049c2013-03-11 23:27:06335size_t SingleThreadProxy::MaxPartialTextureUpdates() const {
336 return std::numeric_limits<size_t>::max();
337}
338
339void SingleThreadProxy::Stop() {
340 TRACE_EVENT0("cc", "SingleThreadProxy::stop");
341 DCHECK(Proxy::IsMainThread());
342 {
[email protected]819b9f52013-09-22 23:29:51343 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
[email protected]a8a049c2013-03-11 23:27:06344 DebugScopedSetImplThread impl(this);
345
skyostil3976a3f2014-09-04 22:07:23346 BlockingTaskRunner::CapturePostTasks blocked(
347 blocking_main_thread_task_runner());
[email protected]804c8982013-03-13 16:32:21348 layer_tree_host_->DeleteContentsTexturesOnImplThread(
[email protected]c1bb5af2013-03-13 19:06:27349 layer_tree_host_impl_->resource_provider());
danakjf446a072014-09-27 21:55:48350 scheduler_on_impl_thread_ = nullptr;
351 layer_tree_host_impl_ = nullptr;
[email protected]a8a049c2013-03-11 23:27:06352 }
[email protected]7aba6662013-03-12 10:17:34353 layer_tree_host_ = NULL;
[email protected]a8a049c2013-03-11 23:27:06354}
355
[email protected]3d9f7432013-04-06 00:35:18356void SingleThreadProxy::OnCanDrawStateChanged(bool can_draw) {
[email protected]ccc08dc2014-01-30 07:33:20357 TRACE_EVENT1(
358 "cc", "SingleThreadProxy::OnCanDrawStateChanged", "can_draw", can_draw);
[email protected]3d9f7432013-04-06 00:35:18359 DCHECK(Proxy::IsImplThread());
[email protected]aeeedad2014-08-22 18:16:22360 if (scheduler_on_impl_thread_)
361 scheduler_on_impl_thread_->SetCanDraw(can_draw);
[email protected]3d9f7432013-04-06 00:35:18362}
363
[email protected]4f48f6e2013-08-27 06:33:38364void SingleThreadProxy::NotifyReadyToActivate() {
enne98f3a6c2014-10-09 20:09:44365 TRACE_EVENT0("cc", "SingleThreadProxy::NotifyReadyToActivate");
366 DebugScopedSetImplThread impl(this);
367 if (scheduler_on_impl_thread_)
368 scheduler_on_impl_thread_->NotifyReadyToActivate();
[email protected]4f48f6e2013-08-27 06:33:38369}
370
ernstmdfac03e2014-11-11 20:18:05371void SingleThreadProxy::NotifyReadyToDraw() {
372}
373
[email protected]c1bb5af2013-03-13 19:06:27374void SingleThreadProxy::SetNeedsRedrawOnImplThread() {
[email protected]943528e2013-11-07 05:01:32375 client_->ScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22376 if (scheduler_on_impl_thread_)
377 scheduler_on_impl_thread_->SetNeedsRedraw();
[email protected]a8a049c2013-03-11 23:27:06378}
379
[email protected]43b8f982014-04-30 21:24:33380void SingleThreadProxy::SetNeedsAnimateOnImplThread() {
mithro719bf6792014-11-10 15:36:47381 client_->ScheduleComposite();
382 if (scheduler_on_impl_thread_)
383 scheduler_on_impl_thread_->SetNeedsAnimate();
[email protected]43b8f982014-04-30 21:24:33384}
385
vmiura59ea9b4042014-12-09 20:50:39386void SingleThreadProxy::SetNeedsPrepareTilesOnImplThread() {
387 TRACE_EVENT0("cc", "SingleThreadProxy::SetNeedsPrepareTilesOnImplThread");
enne98f3a6c2014-10-09 20:09:44388 if (scheduler_on_impl_thread_)
vmiura59ea9b4042014-12-09 20:50:39389 scheduler_on_impl_thread_->SetNeedsPrepareTiles();
[email protected]c48536a52013-09-14 00:02:08390}
391
[email protected]0023fc72014-01-10 20:05:06392void SingleThreadProxy::SetNeedsRedrawRectOnImplThread(
393 const gfx::Rect& damage_rect) {
[email protected]1cd9f5552013-04-26 04:22:03394 layer_tree_host_impl_->SetViewportDamage(damage_rect);
[email protected]aeeedad2014-08-22 18:16:22395 SetNeedsRedrawOnImplThread();
[email protected]1cd9f5552013-04-26 04:22:03396}
397
[email protected]c1bb5af2013-03-13 19:06:27398void SingleThreadProxy::SetNeedsCommitOnImplThread() {
[email protected]943528e2013-11-07 05:01:32399 client_->ScheduleComposite();
[email protected]aeeedad2014-08-22 18:16:22400 if (scheduler_on_impl_thread_)
401 scheduler_on_impl_thread_->SetNeedsCommit();
[email protected]a8a049c2013-03-11 23:27:06402}
403
[email protected]c1bb5af2013-03-13 19:06:27404void SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread(
[email protected]85b57502014-03-11 15:37:48405 scoped_ptr<AnimationEventsVector> events) {
[email protected]ccc08dc2014-01-30 07:33:20406 TRACE_EVENT0(
407 "cc", "SingleThreadProxy::PostAnimationEventsToMainThreadOnImplThread");
[email protected]a8a049c2013-03-11 23:27:06408 DCHECK(Proxy::IsImplThread());
409 DebugScopedSetMainThread main(this);
[email protected]85b57502014-03-11 15:37:48410 layer_tree_host_->SetAnimationEvents(events.Pass());
[email protected]a8a049c2013-03-11 23:27:06411}
412
[email protected]c1bb5af2013-03-13 19:06:27413bool SingleThreadProxy::ReduceContentsTextureMemoryOnImplThread(
[email protected]a8a049c2013-03-11 23:27:06414 size_t limit_bytes,
415 int priority_cutoff) {
416 DCHECK(IsImplThread());
[email protected]5d2fec02013-11-28 20:08:33417 PrioritizedResourceManager* contents_texture_manager =
418 layer_tree_host_->contents_texture_manager();
419
420 ResourceProvider* resource_provider =
421 layer_tree_host_impl_->resource_provider();
422
423 if (!contents_texture_manager || !resource_provider)
[email protected]e7595ead2013-10-10 10:10:07424 return false;
[email protected]a8a049c2013-03-11 23:27:06425
[email protected]5d2fec02013-11-28 20:08:33426 return contents_texture_manager->ReduceMemoryOnImplThread(
427 limit_bytes, priority_cutoff, resource_provider);
[email protected]94f206c12012-08-25 00:09:14428}
429
[email protected]c1bb5af2013-03-13 19:06:27430bool SingleThreadProxy::IsInsideDraw() { return inside_draw_; }
[email protected]a8a049c2013-03-11 23:27:06431
enne98f3a6c2014-10-09 20:09:44432void SingleThreadProxy::DidActivateSyncTree() {
433 // Non-impl-side painting finishes commit in DoCommit. Impl-side painting
434 // defers until here to simulate SetNextCommitWaitsForActivation.
435 if (layer_tree_host_impl_->settings().impl_side_painting) {
436 // This is required because NotifyReadyToActivate gets called when
437 // the pending tree is not actually ready in the SingleThreadProxy.
438 layer_tree_host_impl_->SetRequiresHighResToDraw();
439
weiliangc5efa0a12015-01-29 19:56:46440 // Synchronously call to CommitComplete. Resetting
441 // |commit_blocking_task_runner| would make sure all tasks posted during
442 // commit/activation before CommitComplete.
enne5bea30e72014-12-18 00:36:17443 CommitComplete();
enne98f3a6c2014-10-09 20:09:44444 }
445
enne98f3a6c2014-10-09 20:09:44446 timing_history_.DidActivateSyncTree();
447}
448
vmiura59ea9b4042014-12-09 20:50:39449void SingleThreadProxy::DidPrepareTiles() {
enne98f3a6c2014-10-09 20:09:44450 DCHECK(layer_tree_host_impl_->settings().impl_side_painting);
451 DCHECK(Proxy::IsImplThread());
452 if (scheduler_on_impl_thread_)
vmiura59ea9b4042014-12-09 20:50:39453 scheduler_on_impl_thread_->DidPrepareTiles();
enne98f3a6c2014-10-09 20:09:44454}
455
rouslanf7ebd8832015-01-22 01:54:14456void SingleThreadProxy::DidCompletePageScaleAnimationOnImplThread() {
457 layer_tree_host_->DidCompletePageScaleAnimation();
458}
459
[email protected]fa339032014-02-18 22:11:59460void SingleThreadProxy::UpdateRendererCapabilitiesOnImplThread() {
461 DCHECK(IsImplThread());
462 renderer_capabilities_for_main_thread_ =
463 layer_tree_host_impl_->GetRendererCapabilities().MainThreadCapabilities();
464}
465
[email protected]c1bb5af2013-03-13 19:06:27466void SingleThreadProxy::DidLoseOutputSurfaceOnImplThread() {
[email protected]ccc08dc2014-01-30 07:33:20467 TRACE_EVENT0("cc", "SingleThreadProxy::DidLoseOutputSurfaceOnImplThread");
[email protected]aeeedad2014-08-22 18:16:22468 {
469 DebugScopedSetMainThread main(this);
470 // This must happen before we notify the scheduler as it may try to recreate
471 // the output surface if already in BEGIN_IMPL_FRAME_STATE_IDLE.
472 layer_tree_host_->DidLoseOutputSurface();
473 }
[email protected]4d7e46a2013-11-08 05:33:40474 client_->DidAbortSwapBuffers();
[email protected]aeeedad2014-08-22 18:16:22475 if (scheduler_on_impl_thread_)
476 scheduler_on_impl_thread_->DidLoseOutputSurface();
[email protected]4d7e46a2013-11-08 05:33:40477}
478
weiliangcaf17af42014-12-15 22:17:02479void SingleThreadProxy::CommitVSyncParameters(base::TimeTicks timebase,
480 base::TimeDelta interval) {
481 if (scheduler_on_impl_thread_)
482 scheduler_on_impl_thread_->CommitVSyncParameters(timebase, interval);
483}
484
[email protected]4d7e46a2013-11-08 05:33:40485void SingleThreadProxy::DidSwapBuffersOnImplThread() {
[email protected]aeeedad2014-08-22 18:16:22486 TRACE_EVENT0("cc", "SingleThreadProxy::DidSwapBuffersOnImplThread");
487 if (scheduler_on_impl_thread_)
488 scheduler_on_impl_thread_->DidSwapBuffers();
[email protected]4d7e46a2013-11-08 05:33:40489 client_->DidPostSwapBuffers();
490}
491
[email protected]c14902662014-04-18 05:06:11492void SingleThreadProxy::DidSwapBuffersCompleteOnImplThread() {
miletusfed8c43b2015-01-26 20:04:52493 TRACE_EVENT0("cc,benchmark",
494 "SingleThreadProxy::DidSwapBuffersCompleteOnImplThread");
[email protected]aeeedad2014-08-22 18:16:22495 if (scheduler_on_impl_thread_)
496 scheduler_on_impl_thread_->DidSwapBuffersComplete();
497 layer_tree_host_->DidCompleteSwapBuffers();
[email protected]493067512012-09-19 23:34:10498}
499
[email protected]f0c2a242013-03-15 19:34:52500void SingleThreadProxy::CompositeImmediately(base::TimeTicks frame_begin_time) {
miletusfed8c43b2015-01-26 20:04:52501 TRACE_EVENT0("cc,benchmark", "SingleThreadProxy::CompositeImmediately");
[email protected]51f81da2014-05-16 21:29:26502 DCHECK(Proxy::IsMainThread());
jbauman399aec1a2014-10-25 02:33:32503 base::AutoReset<bool> inside_composite(&inside_synchronous_composite_, true);
504
505 if (layer_tree_host_->output_surface_lost()) {
506 RequestNewOutputSurface();
507 // RequestNewOutputSurface could have synchronously created an output
508 // surface, so check again before returning.
509 if (layer_tree_host_->output_surface_lost())
510 return;
511 }
[email protected]51f81da2014-05-16 21:29:26512
enne98f3a6c2014-10-09 20:09:44513 {
mithrobfa0ec02014-11-21 15:13:49514 BeginFrameArgs begin_frame_args(BeginFrameArgs::Create(
mithro06d1f3bf2014-12-02 02:19:15515 BEGINFRAME_FROM_HERE, frame_begin_time, base::TimeTicks(),
516 BeginFrameArgs::DefaultInterval(), BeginFrameArgs::SYNCHRONOUS));
enne98f3a6c2014-10-09 20:09:44517 DoBeginMainFrame(begin_frame_args);
518 DoCommit();
[email protected]e0341352013-04-06 05:01:20519
enne98f3a6c2014-10-09 20:09:44520 DCHECK_EQ(0u, layer_tree_host_->num_queued_swap_promises())
521 << "Commit should always succeed and transfer promises.";
522 }
523
524 {
525 DebugScopedSetImplThread impl(const_cast<SingleThreadProxy*>(this));
enne69277cb2014-10-29 23:03:40526 if (layer_tree_host_impl_->settings().impl_side_painting) {
527 layer_tree_host_impl_->ActivateSyncTree();
528 layer_tree_host_impl_->active_tree()->UpdateDrawProperties();
vmiura59ea9b4042014-12-09 20:50:39529 layer_tree_host_impl_->PrepareTiles();
enne69277cb2014-10-29 23:03:40530 layer_tree_host_impl_->SynchronouslyInitializeAllTiles();
531 }
532
mithro719bf6792014-11-10 15:36:47533 DoAnimate();
534
enne98f3a6c2014-10-09 20:09:44535 LayerTreeHostImpl::FrameData frame;
536 DoComposite(frame_begin_time, &frame);
537
538 // DoComposite could abort, but because this is a synchronous composite
539 // another draw will never be scheduled, so break remaining promises.
540 layer_tree_host_impl_->active_tree()->BreakSwapPromises(
541 SwapPromise::SWAP_FAILS);
542 }
[email protected]74d9063c2013-01-18 03:14:47543}
544
[email protected]d12aa932014-08-01 13:10:38545void SingleThreadProxy::AsValueInto(base::debug::TracedValue* state) const {
546 // The following line casts away const modifiers because it is just
547 // setting debug state. We still want the AsValue() function and its
548 // call chain to be const throughout.
549 DebugScopedSetImplThread impl(const_cast<SingleThreadProxy*>(this));
[email protected]a8a049c2013-03-11 23:27:06550
[email protected]d12aa932014-08-01 13:10:38551 state->BeginDictionary("layer_tree_host_impl");
552 layer_tree_host_impl_->AsValueInto(state);
553 state->EndDictionary();
[email protected]493067512012-09-19 23:34:10554}
555
[email protected]a8a049c2013-03-11 23:27:06556void SingleThreadProxy::ForceSerializeOnSwapBuffers() {
557 {
558 DebugScopedSetImplThread impl(this);
[email protected]04049fc2013-05-01 03:13:20559 if (layer_tree_host_impl_->renderer()) {
560 DCHECK(!layer_tree_host_->output_surface_lost());
[email protected]a8a049c2013-03-11 23:27:06561 layer_tree_host_impl_->renderer()->DoNoOp();
[email protected]04049fc2013-05-01 03:13:20562 }
[email protected]a8a049c2013-03-11 23:27:06563 }
[email protected]8947cbe2012-11-28 05:27:43564}
565
[email protected]5d8bec72014-07-03 03:03:11566bool SingleThreadProxy::SupportsImplScrolling() const {
567 return false;
568}
569
[email protected]3d9f7432013-04-06 00:35:18570bool SingleThreadProxy::ShouldComposite() const {
571 DCHECK(Proxy::IsImplThread());
572 return layer_tree_host_impl_->visible() &&
573 layer_tree_host_impl_->CanDraw();
574}
575
jbauman8ab0f9e2014-10-15 02:30:34576void SingleThreadProxy::ScheduleRequestNewOutputSurface() {
577 if (output_surface_creation_callback_.IsCancelled() &&
578 !output_surface_creation_requested_) {
579 output_surface_creation_callback_.Reset(
580 base::Bind(&SingleThreadProxy::RequestNewOutputSurface,
581 weak_factory_.GetWeakPtr()));
582 MainThreadTaskRunner()->PostTask(
583 FROM_HERE, output_surface_creation_callback_.callback());
584 }
585}
586
[email protected]aeeedad2014-08-22 18:16:22587DrawResult SingleThreadProxy::DoComposite(base::TimeTicks frame_begin_time,
588 LayerTreeHostImpl::FrameData* frame) {
[email protected]ccc08dc2014-01-30 07:33:20589 TRACE_EVENT0("cc", "SingleThreadProxy::DoComposite");
[email protected]04049fc2013-05-01 03:13:20590 DCHECK(!layer_tree_host_->output_surface_lost());
591
enne98f3a6c2014-10-09 20:09:44592 DrawResult draw_result;
593 bool draw_frame;
[email protected]a8a049c2013-03-11 23:27:06594 {
595 DebugScopedSetImplThread impl(this);
596 base::AutoReset<bool> mark_inside(&inside_draw_, true);
597
[email protected]3d9f7432013-04-06 00:35:18598 // We guard PrepareToDraw() with CanDraw() because it always returns a valid
599 // frame, so can only be used when such a frame is possible. Since
600 // DrawLayers() depends on the result of PrepareToDraw(), it is guarded on
601 // CanDraw() as well.
[email protected]2aae96792014-05-15 23:10:50602 if (!ShouldComposite()) {
[email protected]aeeedad2014-08-22 18:16:22603 return DRAW_ABORTED_CANT_DRAW;
[email protected]3d9f7432013-04-06 00:35:18604 }
[email protected]a8a049c2013-03-11 23:27:06605
[email protected]aeeedad2014-08-22 18:16:22606 timing_history_.DidStartDrawing();
607
enne98f3a6c2014-10-09 20:09:44608 draw_result = layer_tree_host_impl_->PrepareToDraw(frame);
609 draw_frame = draw_result == DRAW_SUCCESS;
610 if (draw_frame)
611 layer_tree_host_impl_->DrawLayers(frame, frame_begin_time);
dnetob71e30c2014-08-25 23:27:20612 layer_tree_host_impl_->DidDrawAllLayers(*frame);
[email protected]a8a049c2013-03-11 23:27:06613
enne98f3a6c2014-10-09 20:09:44614 bool start_ready_animations = draw_frame;
[email protected]3d9f7432013-04-06 00:35:18615 layer_tree_host_impl_->UpdateAnimationState(start_ready_animations);
[email protected]04c5900d2014-08-18 13:38:36616 layer_tree_host_impl_->ResetCurrentBeginFrameArgsForNextFrame();
[email protected]aeeedad2014-08-22 18:16:22617
618 timing_history_.DidFinishDrawing();
[email protected]a8a049c2013-03-11 23:27:06619 }
620
enne98f3a6c2014-10-09 20:09:44621 if (draw_frame) {
[email protected]aeeedad2014-08-22 18:16:22622 DebugScopedSetImplThread impl(this);
[email protected]174c6d42014-08-12 01:43:06623
dnetob71e30c2014-08-25 23:27:20624 // This CapturePostTasks should be destroyed before
625 // DidCommitAndDrawFrame() is called since that goes out to the
626 // embedder,
627 // and we want the embedder to receive its callbacks before that.
628 // NOTE: This maintains consistent ordering with the ThreadProxy since
629 // the DidCommitAndDrawFrame() must be post-tasked from the impl thread
630 // there as the main thread is not blocked, so any posted tasks inside
631 // the swap buffers will execute first.
632 DebugScopedSetMainThreadBlocked main_thread_blocked(this);
[email protected]aeeedad2014-08-22 18:16:22633
skyostil3976a3f2014-09-04 22:07:23634 BlockingTaskRunner::CapturePostTasks blocked(
635 blocking_main_thread_task_runner());
dnetob71e30c2014-08-25 23:27:20636 layer_tree_host_impl_->SwapBuffers(*frame);
[email protected]aeeedad2014-08-22 18:16:22637 }
638 DidCommitAndDrawFrame();
639
enne98f3a6c2014-10-09 20:09:44640 return draw_result;
[email protected]a8a049c2013-03-11 23:27:06641}
642
[email protected]aeeedad2014-08-22 18:16:22643void SingleThreadProxy::DidCommitAndDrawFrame() {
[email protected]a8a049c2013-03-11 23:27:06644 if (next_frame_is_newly_committed_frame_) {
[email protected]aeeedad2014-08-22 18:16:22645 DebugScopedSetMainThread main(this);
[email protected]a8a049c2013-03-11 23:27:06646 next_frame_is_newly_committed_frame_ = false;
[email protected]804c8982013-03-13 16:32:21647 layer_tree_host_->DidCommitAndDrawFrame();
[email protected]a8a049c2013-03-11 23:27:06648 }
649}
650
[email protected]4ea293f72014-08-13 03:03:17651bool SingleThreadProxy::MainFrameWillHappenForTesting() {
652 return false;
653}
[email protected]a8a049c2013-03-11 23:27:06654
simonhongd3d5f7f2014-11-21 16:38:03655void SingleThreadProxy::SetChildrenNeedBeginFrames(
656 bool children_need_begin_frames) {
657 scheduler_on_impl_thread_->SetChildrenNeedBeginFrames(
658 children_need_begin_frames);
659}
660
[email protected]aeeedad2014-08-22 18:16:22661void SingleThreadProxy::WillBeginImplFrame(const BeginFrameArgs& args) {
662 layer_tree_host_impl_->WillBeginImplFrame(args);
663}
664
665void SingleThreadProxy::ScheduledActionSendBeginMainFrame() {
666 TRACE_EVENT0("cc", "SingleThreadProxy::ScheduledActionSendBeginMainFrame");
667 // Although this proxy is single-threaded, it's problematic to synchronously
668 // have BeginMainFrame happen after ScheduledActionSendBeginMainFrame. This
669 // could cause a commit to occur in between a series of SetNeedsCommit calls
670 // (i.e. property modifications) causing some to fall on one frame and some to
671 // fall on the next. Doing it asynchronously instead matches the semantics of
672 // ThreadProxy::SetNeedsCommit where SetNeedsCommit will not cause a
673 // synchronous commit.
674 MainThreadTaskRunner()->PostTask(
675 FROM_HERE,
676 base::Bind(&SingleThreadProxy::BeginMainFrame,
677 weak_factory_.GetWeakPtr()));
678}
679
680void SingleThreadProxy::BeginMainFrame() {
681 if (defer_commits_) {
simonhongc6309f792015-01-31 15:47:15682 TRACE_EVENT_INSTANT0("cc", "EarlyOut_DeferCommit",
683 TRACE_EVENT_SCOPE_THREAD);
684 BeginMainFrameAbortedOnImplThread(
685 CommitEarlyOutReason::ABORTED_DEFERRED_COMMIT);
[email protected]aeeedad2014-08-22 18:16:22686 return;
687 }
688
enne98f3a6c2014-10-09 20:09:44689 // This checker assumes NotifyReadyToCommit in this stack causes a synchronous
690 // commit.
[email protected]aeeedad2014-08-22 18:16:22691 ScopedAbortRemainingSwapPromises swap_promise_checker(layer_tree_host_);
692
693 if (!layer_tree_host_->visible()) {
694 TRACE_EVENT_INSTANT0("cc", "EarlyOut_NotVisible", TRACE_EVENT_SCOPE_THREAD);
mithrof7a21502014-12-17 03:24:48695 BeginMainFrameAbortedOnImplThread(
696 CommitEarlyOutReason::ABORTED_NOT_VISIBLE);
[email protected]aeeedad2014-08-22 18:16:22697 return;
698 }
699
700 if (layer_tree_host_->output_surface_lost()) {
701 TRACE_EVENT_INSTANT0(
702 "cc", "EarlyOut_OutputSurfaceLost", TRACE_EVENT_SCOPE_THREAD);
mithrof7a21502014-12-17 03:24:48703 BeginMainFrameAbortedOnImplThread(
704 CommitEarlyOutReason::ABORTED_OUTPUT_SURFACE_LOST);
[email protected]aeeedad2014-08-22 18:16:22705 return;
706 }
707
enne98f3a6c2014-10-09 20:09:44708 const BeginFrameArgs& begin_frame_args =
709 layer_tree_host_impl_->CurrentBeginFrameArgs();
710 DoBeginMainFrame(begin_frame_args);
711}
712
713void SingleThreadProxy::DoBeginMainFrame(
714 const BeginFrameArgs& begin_frame_args) {
715 layer_tree_host_->WillBeginMainFrame();
716 layer_tree_host_->BeginMainFrame(begin_frame_args);
717 layer_tree_host_->AnimateLayers(begin_frame_args.frame_time);
718 layer_tree_host_->Layout();
719
720 if (PrioritizedResourceManager* contents_texture_manager =
721 layer_tree_host_->contents_texture_manager()) {
722 contents_texture_manager->UnlinkAndClearEvictedBackings();
723 contents_texture_manager->SetMaxMemoryLimitBytes(
724 layer_tree_host_impl_->memory_allocation_limit_bytes());
725 contents_texture_manager->SetExternalPriorityCutoff(
726 layer_tree_host_impl_->memory_allocation_priority_cutoff());
727 }
728
729 DCHECK(!queue_for_commit_);
730 queue_for_commit_ = make_scoped_ptr(new ResourceUpdateQueue);
731
732 layer_tree_host_->UpdateLayers(queue_for_commit_.get());
733
[email protected]aeeedad2014-08-22 18:16:22734 timing_history_.DidBeginMainFrame();
735
mithrof7a21502014-12-17 03:24:48736 // TODO(enne): SingleThreadProxy does not support cancelling commits yet,
737 // search for CommitEarlyOutReason::FINISHED_NO_UPDATES inside
738 // thread_proxy.cc
enne98f3a6c2014-10-09 20:09:44739 if (scheduler_on_impl_thread_) {
740 scheduler_on_impl_thread_->NotifyBeginMainFrameStarted();
741 scheduler_on_impl_thread_->NotifyReadyToCommit();
742 }
[email protected]aeeedad2014-08-22 18:16:22743}
744
mithrof7a21502014-12-17 03:24:48745void SingleThreadProxy::BeginMainFrameAbortedOnImplThread(
746 CommitEarlyOutReason reason) {
[email protected]aeeedad2014-08-22 18:16:22747 DebugScopedSetImplThread impl(this);
748 DCHECK(scheduler_on_impl_thread_->CommitPending());
749 DCHECK(!layer_tree_host_impl_->pending_tree());
750
mithrof7a21502014-12-17 03:24:48751 layer_tree_host_impl_->BeginMainFrameAborted(reason);
752 scheduler_on_impl_thread_->BeginMainFrameAborted(reason);
[email protected]aeeedad2014-08-22 18:16:22753}
754
755DrawResult SingleThreadProxy::ScheduledActionDrawAndSwapIfPossible() {
756 DebugScopedSetImplThread impl(this);
[email protected]aeeedad2014-08-22 18:16:22757 LayerTreeHostImpl::FrameData frame;
758 return DoComposite(layer_tree_host_impl_->CurrentBeginFrameArgs().frame_time,
759 &frame);
760}
761
762DrawResult SingleThreadProxy::ScheduledActionDrawAndSwapForced() {
763 NOTREACHED();
764 return INVALID_RESULT;
765}
766
767void SingleThreadProxy::ScheduledActionCommit() {
768 DebugScopedSetMainThread main(this);
enne98f3a6c2014-10-09 20:09:44769 DoCommit();
[email protected]aeeedad2014-08-22 18:16:22770}
771
772void SingleThreadProxy::ScheduledActionAnimate() {
773 TRACE_EVENT0("cc", "ScheduledActionAnimate");
mithro719bf6792014-11-10 15:36:47774 DebugScopedSetImplThread impl(this);
775 DoAnimate();
[email protected]aeeedad2014-08-22 18:16:22776}
777
[email protected]aeeedad2014-08-22 18:16:22778void SingleThreadProxy::ScheduledActionActivateSyncTree() {
enne98f3a6c2014-10-09 20:09:44779 DebugScopedSetImplThread impl(this);
780 layer_tree_host_impl_->ActivateSyncTree();
[email protected]aeeedad2014-08-22 18:16:22781}
782
783void SingleThreadProxy::ScheduledActionBeginOutputSurfaceCreation() {
784 DebugScopedSetMainThread main(this);
785 DCHECK(scheduler_on_impl_thread_);
786 // If possible, create the output surface in a post task. Synchronously
787 // creating the output surface makes tests more awkward since this differs
788 // from the ThreadProxy behavior. However, sometimes there is no
789 // task runner.
790 if (Proxy::MainThreadTaskRunner()) {
jbauman8ab0f9e2014-10-15 02:30:34791 ScheduleRequestNewOutputSurface();
[email protected]aeeedad2014-08-22 18:16:22792 } else {
enne2097cab2014-09-25 20:16:31793 RequestNewOutputSurface();
[email protected]aeeedad2014-08-22 18:16:22794 }
795}
796
vmiura59ea9b4042014-12-09 20:50:39797void SingleThreadProxy::ScheduledActionPrepareTiles() {
798 TRACE_EVENT0("cc", "SingleThreadProxy::ScheduledActionPrepareTiles");
enne98f3a6c2014-10-09 20:09:44799 DCHECK(layer_tree_host_impl_->settings().impl_side_painting);
800 DebugScopedSetImplThread impl(this);
vmiura59ea9b4042014-12-09 20:50:39801 layer_tree_host_impl_->PrepareTiles();
[email protected]aeeedad2014-08-22 18:16:22802}
803
804void SingleThreadProxy::DidAnticipatedDrawTimeChange(base::TimeTicks time) {
805}
806
807base::TimeDelta SingleThreadProxy::DrawDurationEstimate() {
808 return timing_history_.DrawDurationEstimate();
809}
810
811base::TimeDelta SingleThreadProxy::BeginMainFrameToCommitDurationEstimate() {
812 return timing_history_.BeginMainFrameToCommitDurationEstimate();
813}
814
815base::TimeDelta SingleThreadProxy::CommitToActivateDurationEstimate() {
816 return timing_history_.CommitToActivateDurationEstimate();
817}
818
819void SingleThreadProxy::DidBeginImplFrameDeadline() {
820 layer_tree_host_impl_->ResetCurrentBeginFrameArgsForNextFrame();
821}
822
simonhongd3d5f7f2014-11-21 16:38:03823void SingleThreadProxy::SendBeginFramesToChildren(const BeginFrameArgs& args) {
824 layer_tree_host_->SendBeginFramesToChildren(args);
825}
826
[email protected]bc5e77c2012-11-05 20:00:49827} // namespace cc