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

Side by Side Diff: cc/scheduler/scheduler.cc

Issue 222003007: cc: Advance commit state with a CancelableClosure (Closed) Base URL: http://git.chromium.org/chromium/src.git@schedAsValue
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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"
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 // will not give us a BeginImplFrame until the commit completes. See 194 // will not give us a BeginImplFrame until the commit completes. See
195 // crbug.com/317430 for an example of a swap ack being held on commit. Thus 195 // crbug.com/317430 for an example of a swap ack being held on commit. Thus
196 // we set a repeating timer to poll on ProcessScheduledActions until we 196 // we set a repeating timer to poll on ProcessScheduledActions until we
197 // successfully reach BeginImplFrame. Synchronous compositor does not use 197 // successfully reach BeginImplFrame. Synchronous compositor does not use
198 // frame rate controller or have the circular wait in the bug. 198 // frame rate controller or have the circular wait in the bug.
199 if (IsBeginMainFrameSentOrStarted() && 199 if (IsBeginMainFrameSentOrStarted() &&
200 !settings_.using_synchronous_renderer_compositor) { 200 !settings_.using_synchronous_renderer_compositor) {
201 needs_advance_commit_state_timer = true; 201 needs_advance_commit_state_timer = true;
202 } 202 }
203 } 203 }
204 if (needs_advance_commit_state_timer != 204
205 advance_commit_state_timer_.IsRunning()) { 205 if (needs_advance_commit_state_timer) {
206 if (needs_advance_commit_state_timer && 206 if (advance_commit_state_closure_.IsCancelled() &&
207 last_begin_impl_frame_args_.IsValid()) { 207 last_begin_impl_frame_args_.IsValid()) {
208 // Since we'd rather get a BeginImplFrame by the normal mechanism, we 208 // Since we'd rather get a BeginImplFrame by the normal mechanism, we
209 // set the interval to twice the interval from the previous frame. 209 // set the interval to twice the interval from the previous frame.
210 advance_commit_state_timer_.Start( 210 advance_commit_state_closure_.Reset(base::Bind(
211 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()));
212 impl_task_runner_->PostDelayedTask(
211 FROM_HERE, 213 FROM_HERE,
212 last_begin_impl_frame_args_.interval * 2, 214 advance_commit_state_closure_.callback(),
213 base::Bind(&Scheduler::ProcessScheduledActions, 215 last_begin_impl_frame_args_.interval * 2);
214 base::Unretained(this)));
215 } else {
216 advance_commit_state_timer_.Stop();
217 } 216 }
217 } else {
218 advance_commit_state_closure_.Cancel();
218 } 219 }
219 } 220 }
220 221
221 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) { 222 void Scheduler::BeginImplFrame(const BeginFrameArgs& args) {
222 TRACE_EVENT0("cc", "Scheduler::BeginImplFrame"); 223 TRACE_EVENT0("cc", "Scheduler::BeginImplFrame");
223 DCHECK(state_machine_.begin_impl_frame_state() == 224 DCHECK(state_machine_.begin_impl_frame_state() ==
224 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE); 225 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
225 DCHECK(state_machine_.HasInitializedOutputSurface()); 226 DCHECK(state_machine_.HasInitializedOutputSurface());
226 227
228 advance_commit_state_closure_.Cancel();
229
227 last_begin_impl_frame_args_ = args; 230 last_begin_impl_frame_args_ = args;
228 last_begin_impl_frame_args_.deadline -= client_->DrawDurationEstimate(); 231 last_begin_impl_frame_args_.deadline -= client_->DrawDurationEstimate();
229 232
230 if (!state_machine_.smoothness_takes_priority() && 233 if (!state_machine_.smoothness_takes_priority() &&
231 state_machine_.MainThreadIsInHighLatencyMode() && 234 state_machine_.MainThreadIsInHighLatencyMode() &&
232 CanCommitAndActivateBeforeDeadline()) { 235 CanCommitAndActivateBeforeDeadline()) {
233 state_machine_.SetSkipNextBeginMainFrameToReduceLatency(); 236 state_machine_.SetSkipNextBeginMainFrameToReduceLatency();
234 } 237 }
235 238
236 state_machine_.OnBeginImplFrame(last_begin_impl_frame_args_); 239 state_machine_.OnBeginImplFrame(last_begin_impl_frame_args_);
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 } 315 }
313 316
314 void Scheduler::PollForAnticipatedDrawTriggers() { 317 void Scheduler::PollForAnticipatedDrawTriggers() {
315 TRACE_EVENT0("cc", "Scheduler::PollForAnticipatedDrawTriggers"); 318 TRACE_EVENT0("cc", "Scheduler::PollForAnticipatedDrawTriggers");
316 poll_for_draw_triggers_closure_.Cancel(); 319 poll_for_draw_triggers_closure_.Cancel();
317 state_machine_.DidEnterPollForAnticipatedDrawTriggers(); 320 state_machine_.DidEnterPollForAnticipatedDrawTriggers();
318 ProcessScheduledActions(); 321 ProcessScheduledActions();
319 state_machine_.DidLeavePollForAnticipatedDrawTriggers(); 322 state_machine_.DidLeavePollForAnticipatedDrawTriggers();
320 } 323 }
321 324
325 void Scheduler::PollToAdvanceCommitState() {
326 TRACE_EVENT0("cc", "Scheduler::PollToAdvanceCommitState");
327 advance_commit_state_closure_.Cancel();
328 ProcessScheduledActions();
329 }
330
322 bool Scheduler::IsBeginMainFrameSent() const { 331 bool Scheduler::IsBeginMainFrameSent() const {
323 return state_machine_.commit_state() == 332 return state_machine_.commit_state() ==
324 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT; 333 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT;
325 } 334 }
326 335
327 void Scheduler::DrawAndSwapIfPossible() { 336 void Scheduler::DrawAndSwapIfPossible() {
328 DrawSwapReadbackResult result = 337 DrawSwapReadbackResult result =
329 client_->ScheduledActionDrawAndSwapIfPossible(); 338 client_->ScheduledActionDrawAndSwapIfPossible();
330 state_machine_.DidDrawIfPossibleCompleted(result.draw_result); 339 state_machine_.DidDrawIfPossibleCompleted(result.draw_result);
331 } 340 }
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 scheduler_state->SetDouble( 428 scheduler_state->SetDouble(
420 "time_until_anticipated_draw_time_ms", 429 "time_until_anticipated_draw_time_ms",
421 (AnticipatedDrawTime() - base::TimeTicks::Now()).InMillisecondsF()); 430 (AnticipatedDrawTime() - base::TimeTicks::Now()).InMillisecondsF());
422 scheduler_state->SetBoolean("last_set_needs_begin_impl_frame_", 431 scheduler_state->SetBoolean("last_set_needs_begin_impl_frame_",
423 last_set_needs_begin_impl_frame_); 432 last_set_needs_begin_impl_frame_);
424 scheduler_state->SetBoolean( 433 scheduler_state->SetBoolean(
425 "begin_impl_frame_deadline_closure_", 434 "begin_impl_frame_deadline_closure_",
426 !begin_impl_frame_deadline_closure_.IsCancelled()); 435 !begin_impl_frame_deadline_closure_.IsCancelled());
427 scheduler_state->SetBoolean("poll_for_draw_triggers_closure_", 436 scheduler_state->SetBoolean("poll_for_draw_triggers_closure_",
428 !poll_for_draw_triggers_closure_.IsCancelled()); 437 !poll_for_draw_triggers_closure_.IsCancelled());
429 scheduler_state->SetBoolean("advance_commit_state_timer_", 438 scheduler_state->SetBoolean("advance_commit_state_closure_",
430 advance_commit_state_timer_.IsRunning()); 439 !advance_commit_state_closure_.IsCancelled());
431 state->Set("scheduler_state", scheduler_state.release()); 440 state->Set("scheduler_state", scheduler_state.release());
432 441
433 scoped_ptr<base::DictionaryValue> client_state(new base::DictionaryValue); 442 scoped_ptr<base::DictionaryValue> client_state(new base::DictionaryValue);
434 client_state->SetDouble("draw_duration_estimate_ms", 443 client_state->SetDouble("draw_duration_estimate_ms",
435 client_->DrawDurationEstimate().InMillisecondsF()); 444 client_->DrawDurationEstimate().InMillisecondsF());
436 client_state->SetDouble( 445 client_state->SetDouble(
437 "begin_main_frame_to_commit_duration_estimate_ms", 446 "begin_main_frame_to_commit_duration_estimate_ms",
438 client_->BeginMainFrameToCommitDurationEstimate().InMillisecondsF()); 447 client_->BeginMainFrameToCommitDurationEstimate().InMillisecondsF());
439 client_state->SetDouble( 448 client_state->SetDouble(
440 "commit_to_activate_duration_estimate_ms", 449 "commit_to_activate_duration_estimate_ms",
(...skipping 22 matching lines...) Expand all
463 } 472 }
464 473
465 bool Scheduler::IsBeginMainFrameSentOrStarted() const { 474 bool Scheduler::IsBeginMainFrameSentOrStarted() const {
466 return (state_machine_.commit_state() == 475 return (state_machine_.commit_state() ==
467 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || 476 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT ||
468 state_machine_.commit_state() == 477 state_machine_.commit_state() ==
469 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); 478 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED);
470 } 479 }
471 480
472 } // namespace cc 481 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698