OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "cc/scheduler/scheduler.h" | 5 #include "cc/scheduler/scheduler.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
9 #include "base/debug/trace_event.h" | 9 #include "base/debug/trace_event.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "cc/debug/devtools_instrumentation.h" | 11 #include "cc/debug/devtools_instrumentation.h" |
12 #include "cc/debug/traced_value.h" | 12 #include "cc/debug/traced_value.h" |
13 #include "cc/scheduler/delay_based_time_source.h" | |
13 #include "ui/gfx/frame_time.h" | 14 #include "ui/gfx/frame_time.h" |
14 | 15 |
15 namespace cc { | 16 namespace cc { |
16 | 17 |
18 class SyntheticBeginFrameSource : public TimeSourceClient { | |
19 public: | |
20 SyntheticBeginFrameSource(Scheduler* scheduler, | |
21 base::SingleThreadTaskRunner* task_runner) | |
22 : scheduler_(scheduler) { | |
23 if (gfx::FrameTime::TimestampsAreHighRes()) { | |
24 time_source_ = DelayBasedTimeSourceHighRes::Create( | |
25 scheduler_->VSyncInterval(), task_runner); | |
26 } else { | |
27 time_source_ = DelayBasedTimeSource::Create(scheduler_->VSyncInterval(), | |
28 task_runner); | |
29 } | |
30 time_source_->SetClient(this); | |
31 } | |
32 | |
33 virtual ~SyntheticBeginFrameSource() {} | |
34 | |
35 // Updates the phase and frequency of the timer. | |
36 void CommitVSyncParameters(base::TimeTicks timebase, | |
37 base::TimeDelta interval) { | |
38 time_source_->SetTimebaseAndInterval(timebase, interval); | |
39 } | |
40 | |
41 // Activates future BeginFrames and, if activating, pushes the most | |
42 // recently missed BeginFrame to the back of a retroactive queue. | |
43 void SetNeedsBeginFrame(bool needs_begin_frame, | |
44 std::deque<BeginFrameArgs>* begin_retro_frame_args) { | |
45 base::TimeTicks missed_tick_time = | |
46 time_source_->SetActive(needs_begin_frame); | |
47 if (!missed_tick_time.is_null()) { | |
48 begin_retro_frame_args->push_back( | |
49 CreateSyntheticBeginFrameArgs(missed_tick_time)); | |
50 } | |
51 } | |
52 | |
53 // TimeSourceClient implementation of OnTimerTick triggers a BeginFrame. | |
54 virtual void OnTimerTick() OVERRIDE { | |
55 BeginFrameArgs begin_frame_args( | |
56 CreateSyntheticBeginFrameArgs(time_source_->LastTickTime())); | |
57 scheduler_->BeginFrame(begin_frame_args); | |
58 } | |
59 | |
60 protected: | |
Sami
2014/04/16 17:48:23
Could be private?
brianderson
2014/04/16 21:51:31
Yes.
| |
61 BeginFrameArgs CreateSyntheticBeginFrameArgs(base::TimeTicks frame_time) { | |
62 base::TimeTicks deadline = | |
63 time_source_->NextTickTime() - scheduler_->EstimatedParentDrawTime(); | |
64 return BeginFrameArgs::Create( | |
65 frame_time, deadline, scheduler_->VSyncInterval()); | |
66 } | |
67 | |
68 Scheduler* scheduler_; | |
69 scoped_refptr<TimeSource> time_source_; | |
70 }; | |
71 | |
17 Scheduler::Scheduler( | 72 Scheduler::Scheduler( |
18 SchedulerClient* client, | 73 SchedulerClient* client, |
19 const SchedulerSettings& scheduler_settings, | 74 const SchedulerSettings& scheduler_settings, |
20 int layer_tree_host_id, | 75 int layer_tree_host_id, |
21 const scoped_refptr<base::SequencedTaskRunner>& impl_task_runner) | 76 const scoped_refptr<base::SingleThreadTaskRunner>& impl_task_runner) |
22 : settings_(scheduler_settings), | 77 : settings_(scheduler_settings), |
23 client_(client), | 78 client_(client), |
24 layer_tree_host_id_(layer_tree_host_id), | 79 layer_tree_host_id_(layer_tree_host_id), |
25 impl_task_runner_(impl_task_runner), | 80 impl_task_runner_(impl_task_runner), |
81 vsync_interval_(BeginFrameArgs::DefaultInterval()), | |
26 last_set_needs_begin_frame_(false), | 82 last_set_needs_begin_frame_(false), |
83 begin_unthrottled_frame_posted_(false), | |
27 begin_retro_frame_posted_(false), | 84 begin_retro_frame_posted_(false), |
28 state_machine_(scheduler_settings), | 85 state_machine_(scheduler_settings), |
29 inside_process_scheduled_actions_(false), | 86 inside_process_scheduled_actions_(false), |
30 inside_action_(SchedulerStateMachine::ACTION_NONE), | 87 inside_action_(SchedulerStateMachine::ACTION_NONE), |
31 weak_factory_(this) { | 88 weak_factory_(this) { |
32 DCHECK(client_); | 89 DCHECK(client_); |
33 DCHECK(!state_machine_.BeginFrameNeeded()); | 90 DCHECK(!state_machine_.BeginFrameNeeded()); |
34 if (settings_.main_frame_before_activation_enabled) { | 91 if (settings_.main_frame_before_activation_enabled) { |
35 DCHECK(settings_.main_frame_before_draw_enabled); | 92 DCHECK(settings_.main_frame_before_draw_enabled); |
36 } | 93 } |
37 | 94 |
38 begin_retro_frame_closure_ = | 95 begin_retro_frame_closure_ = |
39 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); | 96 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); |
97 begin_unthrottled_frame_closure_ = | |
98 base::Bind(&Scheduler::BeginUnthrottledFrame, weak_factory_.GetWeakPtr()); | |
40 begin_impl_frame_deadline_closure_ = base::Bind( | 99 begin_impl_frame_deadline_closure_ = base::Bind( |
41 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); | 100 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); |
42 poll_for_draw_triggers_closure_ = base::Bind( | 101 poll_for_draw_triggers_closure_ = base::Bind( |
43 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr()); | 102 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr()); |
44 advance_commit_state_closure_ = base::Bind( | 103 advance_commit_state_closure_ = base::Bind( |
45 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); | 104 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); |
105 | |
106 if (!settings_.begin_frame_scheduling_enabled) { | |
107 SetupSyntheticBeginFrames(); | |
108 } | |
46 } | 109 } |
47 | 110 |
48 Scheduler::~Scheduler() {} | 111 Scheduler::~Scheduler() { |
112 if (synthetic_begin_frame_source_) { | |
113 synthetic_begin_frame_source_->SetNeedsBeginFrame(false, | |
114 &begin_retro_frame_args_); | |
115 } | |
116 } | |
117 | |
118 void Scheduler::SetupSyntheticBeginFrames() { | |
119 DCHECK(!synthetic_begin_frame_source_); | |
120 synthetic_begin_frame_source_.reset( | |
121 new SyntheticBeginFrameSource(this, impl_task_runner_.get())); | |
122 } | |
123 | |
124 void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, | |
125 base::TimeDelta interval) { | |
126 vsync_interval_ = interval; | |
127 if (!settings_.begin_frame_scheduling_enabled) | |
128 synthetic_begin_frame_source_->CommitVSyncParameters(timebase, interval); | |
129 } | |
130 | |
131 void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { | |
132 estimated_parent_draw_time_ = draw_time; | |
133 } | |
49 | 134 |
50 void Scheduler::SetCanStart() { | 135 void Scheduler::SetCanStart() { |
51 state_machine_.SetCanStart(); | 136 state_machine_.SetCanStart(); |
52 ProcessScheduledActions(); | 137 ProcessScheduledActions(); |
53 } | 138 } |
54 | 139 |
55 void Scheduler::SetVisible(bool visible) { | 140 void Scheduler::SetVisible(bool visible) { |
56 state_machine_.SetVisible(visible); | 141 state_machine_.SetVisible(visible); |
57 ProcessScheduledActions(); | 142 ProcessScheduledActions(); |
58 } | 143 } |
(...skipping 30 matching lines...) Expand all Loading... | |
89 void Scheduler::SetNeedsManageTiles() { | 174 void Scheduler::SetNeedsManageTiles() { |
90 DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_MANAGE_TILES)); | 175 DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_MANAGE_TILES)); |
91 state_machine_.SetNeedsManageTiles(); | 176 state_machine_.SetNeedsManageTiles(); |
92 ProcessScheduledActions(); | 177 ProcessScheduledActions(); |
93 } | 178 } |
94 | 179 |
95 void Scheduler::SetMaxSwapsPending(int max) { | 180 void Scheduler::SetMaxSwapsPending(int max) { |
96 state_machine_.SetMaxSwapsPending(max); | 181 state_machine_.SetMaxSwapsPending(max); |
97 } | 182 } |
98 | 183 |
99 void Scheduler::DidSwapBuffers() { state_machine_.DidSwapBuffers(); } | 184 void Scheduler::DidSwapBuffers() { |
185 DCHECK(state_machine_.HasInitializedOutputSurface()); | |
186 state_machine_.DidSwapBuffers(); | |
187 } | |
100 | 188 |
101 void Scheduler::SetSwapUsedIncompleteTile(bool used_incomplete_tile) { | 189 void Scheduler::SetSwapUsedIncompleteTile(bool used_incomplete_tile) { |
102 state_machine_.SetSwapUsedIncompleteTile(used_incomplete_tile); | 190 state_machine_.SetSwapUsedIncompleteTile(used_incomplete_tile); |
103 ProcessScheduledActions(); | 191 ProcessScheduledActions(); |
104 } | 192 } |
105 | 193 |
106 void Scheduler::DidSwapBuffersComplete() { | 194 void Scheduler::DidSwapBuffersComplete() { |
195 DCHECK(state_machine_.HasInitializedOutputSurface()); | |
107 state_machine_.DidSwapBuffersComplete(); | 196 state_machine_.DidSwapBuffersComplete(); |
108 ProcessScheduledActions(); | 197 ProcessScheduledActions(); |
109 } | 198 } |
110 | 199 |
111 void Scheduler::SetSmoothnessTakesPriority(bool smoothness_takes_priority) { | 200 void Scheduler::SetSmoothnessTakesPriority(bool smoothness_takes_priority) { |
112 state_machine_.SetSmoothnessTakesPriority(smoothness_takes_priority); | 201 state_machine_.SetSmoothnessTakesPriority(smoothness_takes_priority); |
113 ProcessScheduledActions(); | 202 ProcessScheduledActions(); |
114 } | 203 } |
115 | 204 |
116 void Scheduler::NotifyReadyToCommit() { | 205 void Scheduler::NotifyReadyToCommit() { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
162 return timebase + (begin_impl_frame_args_.interval * intervals); | 251 return timebase + (begin_impl_frame_args_.interval * intervals); |
163 } | 252 } |
164 | 253 |
165 base::TimeTicks Scheduler::LastBeginImplFrameTime() { | 254 base::TimeTicks Scheduler::LastBeginImplFrameTime() { |
166 return begin_impl_frame_args_.frame_time; | 255 return begin_impl_frame_args_.frame_time; |
167 } | 256 } |
168 | 257 |
169 void Scheduler::SetupNextBeginFrameIfNeeded() { | 258 void Scheduler::SetupNextBeginFrameIfNeeded() { |
170 bool needs_begin_frame = state_machine_.BeginFrameNeeded(); | 259 bool needs_begin_frame = state_machine_.BeginFrameNeeded(); |
171 | 260 |
261 if (settings_.throttle_frame_production) { | |
262 SetupNextBeginFrameWhenVSyncThrottlingEnabled(needs_begin_frame); | |
263 } else { | |
264 SetupNextBeginFrameWhenVSyncThrottlingDisabled(needs_begin_frame); | |
265 } | |
266 SetupPollingMechanisms(needs_begin_frame); | |
267 } | |
268 | |
269 // When we are throttling frame production, we request BeginFrames | |
270 // from the OutputSurface. | |
271 void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingEnabled( | |
272 bool needs_begin_frame) { | |
172 bool at_end_of_deadline = | 273 bool at_end_of_deadline = |
173 state_machine_.begin_impl_frame_state() == | 274 state_machine_.begin_impl_frame_state() == |
174 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; | 275 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE; |
175 | 276 |
176 bool should_call_set_needs_begin_frame = | 277 bool should_call_set_needs_begin_frame = |
177 // Always request the BeginFrame immediately if it wasn't needed before. | 278 // Always request the BeginFrame immediately if it wasn't needed before. |
178 (needs_begin_frame && !last_set_needs_begin_frame_) || | 279 (needs_begin_frame && !last_set_needs_begin_frame_) || |
179 // We always need to explicitly request our next BeginFrame. | 280 // Only stop requesting BeginFrames after a deadline. |
180 at_end_of_deadline; | 281 (!needs_begin_frame && last_set_needs_begin_frame_ && at_end_of_deadline); |
181 | 282 |
182 if (should_call_set_needs_begin_frame) { | 283 if (should_call_set_needs_begin_frame) { |
183 client_->SetNeedsBeginFrame(needs_begin_frame); | 284 if (settings_.begin_frame_scheduling_enabled) { |
285 client_->SetNeedsBeginFrame(needs_begin_frame); | |
286 } else { | |
287 synthetic_begin_frame_source_->SetNeedsBeginFrame( | |
288 needs_begin_frame, &begin_retro_frame_args_); | |
289 } | |
184 last_set_needs_begin_frame_ = needs_begin_frame; | 290 last_set_needs_begin_frame_ = needs_begin_frame; |
185 } | 291 } |
186 | 292 |
187 // Handle retroactive BeginFrames. | 293 PostBeginRetroFrameIfNeeded(); |
188 if (last_set_needs_begin_frame_) | 294 } |
189 PostBeginRetroFrameIfNeeded(); | |
190 | 295 |
296 // When we aren't throttling frame production, we create our own | |
297 // BeginImplFrames as soon as we go idle, using the BeginRetroFrame logic. | |
298 void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingDisabled( | |
299 bool needs_begin_frame) { | |
300 last_set_needs_begin_frame_ = needs_begin_frame; | |
301 | |
302 if (!needs_begin_frame || begin_unthrottled_frame_posted_) | |
303 return; | |
304 | |
305 if (state_machine_.begin_impl_frame_state() != | |
306 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE && | |
307 state_machine_.begin_impl_frame_state() != | |
308 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE) { | |
309 return; | |
310 } | |
311 | |
312 begin_unthrottled_frame_posted_ = true; | |
313 impl_task_runner_->PostTask(FROM_HERE, begin_unthrottled_frame_closure_); | |
314 } | |
315 | |
316 // BeginUnthrottledFrame is used when we aren't throttling frame production. | |
317 // This will usually be because VSync is disabled. | |
318 void Scheduler::BeginUnthrottledFrame() { | |
319 DCHECK(!settings_.throttle_frame_production); | |
320 DCHECK(begin_retro_frame_args_.empty()); | |
321 | |
322 base::TimeTicks now = gfx::FrameTime::Now(); | |
323 base::TimeDelta interval = vsync_interval_ > base::TimeDelta() | |
Sami
2014/04/16 17:48:23
When would the vsync interval be zero?
brianderson
2014/04/16 21:51:31
I guess it shouldn't be. I'll DCHECK in the Commit
| |
324 ? vsync_interval_ | |
325 : BeginFrameArgs::DefaultInterval(); | |
326 base::TimeTicks deadline = now + interval; | |
327 | |
328 BeginFrameArgs begin_frame_args = | |
329 BeginFrameArgs::Create(now, deadline, interval); | |
330 BeginImplFrame(begin_frame_args); | |
331 | |
332 begin_unthrottled_frame_posted_ = false; | |
333 } | |
334 | |
335 void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) { | |
191 bool needs_advance_commit_state_timer = false; | 336 bool needs_advance_commit_state_timer = false; |
192 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but | 337 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but |
193 // aren't expecting any more BeginFrames. This should only be needed by | 338 // aren't expecting any more BeginFrames. This should only be needed by |
194 // the synchronous compositor when BeginFrameNeeded is false. | 339 // the synchronous compositor when BeginFrameNeeded is false. |
195 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { | 340 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { |
196 DCHECK(!state_machine_.SupportsProactiveBeginFrame()); | 341 DCHECK(!state_machine_.SupportsProactiveBeginFrame()); |
197 DCHECK(!needs_begin_frame); | 342 DCHECK(!needs_begin_frame); |
198 if (poll_for_draw_triggers_task_.IsCancelled()) { | 343 if (poll_for_draw_triggers_task_.IsCancelled()) { |
199 poll_for_draw_triggers_task_.Reset(poll_for_draw_triggers_closure_); | 344 poll_for_draw_triggers_task_.Reset(poll_for_draw_triggers_closure_); |
200 base::TimeDelta delay = begin_impl_frame_args_.IsValid() | 345 base::TimeDelta delay = begin_impl_frame_args_.IsValid() |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
232 } else { | 377 } else { |
233 advance_commit_state_task_.Cancel(); | 378 advance_commit_state_task_.Cancel(); |
234 } | 379 } |
235 } | 380 } |
236 | 381 |
237 // BeginFrame is the mechanism that tells us that now is a good time to start | 382 // BeginFrame is the mechanism that tells us that now is a good time to start |
238 // making a frame. Usually this means that user input for the frame is complete. | 383 // making a frame. Usually this means that user input for the frame is complete. |
239 // If the scheduler is busy, we queue the BeginFrame to be handled later as | 384 // If the scheduler is busy, we queue the BeginFrame to be handled later as |
240 // a BeginRetroFrame. | 385 // a BeginRetroFrame. |
241 void Scheduler::BeginFrame(const BeginFrameArgs& args) { | 386 void Scheduler::BeginFrame(const BeginFrameArgs& args) { |
387 DCHECK(settings_.throttle_frame_production); | |
388 | |
242 bool should_defer_begin_frame; | 389 bool should_defer_begin_frame; |
243 if (settings_.using_synchronous_renderer_compositor) { | 390 if (settings_.using_synchronous_renderer_compositor) { |
244 should_defer_begin_frame = false; | 391 should_defer_begin_frame = false; |
245 } else { | 392 } else { |
246 should_defer_begin_frame = | 393 should_defer_begin_frame = |
247 !begin_retro_frame_args_.empty() || begin_retro_frame_posted_ || | 394 !begin_retro_frame_args_.empty() || begin_retro_frame_posted_ || |
248 !last_set_needs_begin_frame_ || | 395 !last_set_needs_begin_frame_ || |
249 (state_machine_.begin_impl_frame_state() != | 396 (state_machine_.begin_impl_frame_state() != |
250 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 397 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
251 } | 398 } |
(...skipping 25 matching lines...) Expand all Loading... | |
277 // up, our fallback should be to lower our frame rate. | 424 // up, our fallback should be to lower our frame rate. |
278 base::TimeTicks now = gfx::FrameTime::Now(); | 425 base::TimeTicks now = gfx::FrameTime::Now(); |
279 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); | 426 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); |
280 while (!begin_retro_frame_args_.empty() && | 427 while (!begin_retro_frame_args_.empty() && |
281 now > AdjustedBeginImplFrameDeadline(begin_retro_frame_args_.front(), | 428 now > AdjustedBeginImplFrameDeadline(begin_retro_frame_args_.front(), |
282 draw_duration_estimate)) { | 429 draw_duration_estimate)) { |
283 begin_retro_frame_args_.pop_front(); | 430 begin_retro_frame_args_.pop_front(); |
284 } | 431 } |
285 | 432 |
286 if (begin_retro_frame_args_.empty()) { | 433 if (begin_retro_frame_args_.empty()) { |
434 DCHECK(settings_.throttle_frame_production); | |
287 TRACE_EVENT_INSTANT0( | 435 TRACE_EVENT_INSTANT0( |
288 "cc", "Scheduler::BeginRetroFrames expired", TRACE_EVENT_SCOPE_THREAD); | 436 "cc", "Scheduler::BeginRetroFrames expired", TRACE_EVENT_SCOPE_THREAD); |
289 } else { | 437 } else { |
290 BeginImplFrame(begin_retro_frame_args_.front()); | 438 BeginImplFrame(begin_retro_frame_args_.front()); |
291 begin_retro_frame_args_.pop_front(); | 439 begin_retro_frame_args_.pop_front(); |
292 } | 440 } |
293 | 441 |
294 begin_retro_frame_posted_ = false; | 442 begin_retro_frame_posted_ = false; |
295 } | 443 } |
296 | 444 |
297 // There could be a race between the posted BeginRetroFrame and a new | 445 // There could be a race between the posted BeginRetroFrame and a new |
298 // BeginFrame arriving via the normal mechanism. Scheduler::BeginFrame | 446 // BeginFrame arriving via the normal mechanism. Scheduler::BeginFrame |
299 // will check if there is a pending BeginRetroFrame to ensure we handle | 447 // will check if there is a pending BeginRetroFrame to ensure we handle |
300 // BeginFrames in FIFO order. | 448 // BeginFrames in FIFO order. |
301 void Scheduler::PostBeginRetroFrameIfNeeded() { | 449 void Scheduler::PostBeginRetroFrameIfNeeded() { |
450 if (!last_set_needs_begin_frame_) | |
451 return; | |
452 | |
302 if (begin_retro_frame_args_.empty() || begin_retro_frame_posted_) | 453 if (begin_retro_frame_args_.empty() || begin_retro_frame_posted_) |
303 return; | 454 return; |
304 | 455 |
305 // begin_retro_frame_args_ should always be empty for the | 456 // begin_retro_frame_args_ should always be empty for the |
306 // synchronous compositor. | 457 // synchronous compositor. |
307 DCHECK(!settings_.using_synchronous_renderer_compositor); | 458 DCHECK(!settings_.using_synchronous_renderer_compositor); |
308 | 459 |
309 if (state_machine_.begin_impl_frame_state() != | 460 if (state_machine_.begin_impl_frame_state() != |
310 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) | 461 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE) |
311 return; | 462 return; |
312 | 463 |
313 begin_retro_frame_posted_ = true; | 464 begin_retro_frame_posted_ = true; |
314 impl_task_runner_->PostTask(FROM_HERE, begin_retro_frame_closure_); | 465 impl_task_runner_->PostTask(FROM_HERE, begin_retro_frame_closure_); |
315 } | 466 } |
316 | 467 |
317 // BeginImplFrame starts a compositor frame that will wait up until a deadline | 468 // BeginImplFrame starts a compositor frame that will wait up until a deadline |
318 // for a BeginMainFrame+activation to complete before it times out and draws | 469 // for a BeginMainFrame+activation to complete before it times out and draws |
319 // any asynchronous animation and scroll/pinch updates. | 470 // any asynchronous animation and scroll/pinch updates. |
320 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { | 471 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { |
321 TRACE_EVENT0("cc", "Scheduler::BeginImplFrame"); | |
Sami
2014/04/16 17:48:23
Did you mean to remove this? Or is this redundant
brianderson
2014/04/16 21:51:31
Hmm, I should probably keep it since it won't be c
| |
322 DCHECK(state_machine_.begin_impl_frame_state() == | 472 DCHECK(state_machine_.begin_impl_frame_state() == |
323 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); | 473 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); |
324 DCHECK(state_machine_.HasInitializedOutputSurface()); | 474 DCHECK(state_machine_.HasInitializedOutputSurface()); |
325 | 475 |
326 advance_commit_state_task_.Cancel(); | 476 advance_commit_state_task_.Cancel(); |
327 | 477 |
328 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); | 478 base::TimeDelta draw_duration_estimate = client_->DrawDurationEstimate(); |
329 begin_impl_frame_args_ = args; | 479 begin_impl_frame_args_ = args; |
330 begin_impl_frame_args_.deadline -= draw_duration_estimate; | 480 begin_impl_frame_args_.deadline -= draw_duration_estimate; |
331 | 481 |
(...skipping 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
567 } | 717 } |
568 | 718 |
569 bool Scheduler::IsBeginMainFrameSentOrStarted() const { | 719 bool Scheduler::IsBeginMainFrameSentOrStarted() const { |
570 return (state_machine_.commit_state() == | 720 return (state_machine_.commit_state() == |
571 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || | 721 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || |
572 state_machine_.commit_state() == | 722 state_machine_.commit_state() == |
573 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); | 723 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); |
574 } | 724 } |
575 | 725 |
576 } // namespace cc | 726 } // namespace cc |
OLD | NEW |