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

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

Issue 817603002: cc: Make scheduling be driven by vsync for android webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years 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 8
9 #include "base/auto_reset.h" 9 #include "base/auto_reset.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
99 "Scheduler::Scheduler", 99 "Scheduler::Scheduler",
100 "settings", 100 "settings",
101 settings_.AsValue()); 101 settings_.AsValue());
102 DCHECK(client_); 102 DCHECK(client_);
103 DCHECK(!state_machine_.BeginFrameNeeded()); 103 DCHECK(!state_machine_.BeginFrameNeeded());
104 104
105 begin_retro_frame_closure_ = 105 begin_retro_frame_closure_ =
106 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); 106 base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr());
107 begin_impl_frame_deadline_closure_ = base::Bind( 107 begin_impl_frame_deadline_closure_ = base::Bind(
108 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr()); 108 &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr());
109 poll_for_draw_triggers_closure_ = base::Bind(
110 &Scheduler::PollForAnticipatedDrawTriggers, weak_factory_.GetWeakPtr());
111 advance_commit_state_closure_ = base::Bind( 109 advance_commit_state_closure_ = base::Bind(
112 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); 110 &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr());
113 111
114 frame_source_ = BeginFrameSourceMultiplexer::Create(); 112 frame_source_ = BeginFrameSourceMultiplexer::Create();
115 frame_source_->AddObserver(this); 113 frame_source_->AddObserver(this);
116 114
117 // Primary frame source 115 // Primary frame source
118 primary_frame_source_ = 116 primary_frame_source_ =
119 frame_sources_constructor->ConstructPrimaryFrameSource(this); 117 frame_sources_constructor->ConstructPrimaryFrameSource(this);
120 frame_source_->AddSource(primary_frame_source_); 118 frame_source_->AddSource(primary_frame_source_);
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
212 void Scheduler::SetNeedsCommit() { 210 void Scheduler::SetNeedsCommit() {
213 state_machine_.SetNeedsCommit(); 211 state_machine_.SetNeedsCommit();
214 ProcessScheduledActions(); 212 ProcessScheduledActions();
215 } 213 }
216 214
217 void Scheduler::SetNeedsRedraw() { 215 void Scheduler::SetNeedsRedraw() {
218 state_machine_.SetNeedsRedraw(); 216 state_machine_.SetNeedsRedraw();
219 ProcessScheduledActions(); 217 ProcessScheduledActions();
220 } 218 }
221 219
220 void Scheduler::OutputSurfaceDidRequestDraw() {
221 state_machine_.OutputSurfaceDidRequestDraw();
222 ProcessScheduledActions();
223 }
224
222 void Scheduler::SetNeedsAnimate() { 225 void Scheduler::SetNeedsAnimate() {
223 state_machine_.SetNeedsAnimate(); 226 state_machine_.SetNeedsAnimate();
224 ProcessScheduledActions(); 227 ProcessScheduledActions();
225 } 228 }
226 229
227 void Scheduler::SetNeedsPrepareTiles() { 230 void Scheduler::SetNeedsPrepareTiles() {
228 DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_PREPARE_TILES)); 231 DCHECK(!IsInsideAction(SchedulerStateMachine::ACTION_PREPARE_TILES));
229 state_machine_.SetNeedsPrepareTiles(); 232 state_machine_.SetNeedsPrepareTiles();
230 ProcessScheduledActions(); 233 ProcessScheduledActions();
231 } 234 }
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
333 frame_source_->DidFinishFrame(begin_retro_frame_args_.size()); 336 frame_source_->DidFinishFrame(begin_retro_frame_args_.size());
334 } 337 }
335 338
336 PostBeginRetroFrameIfNeeded(); 339 PostBeginRetroFrameIfNeeded();
337 SetupPollingMechanisms(needs_begin_frame); 340 SetupPollingMechanisms(needs_begin_frame);
338 } 341 }
339 342
340 // We may need to poll when we can't rely on BeginFrame to advance certain 343 // We may need to poll when we can't rely on BeginFrame to advance certain
341 // state or to avoid deadlock. 344 // state or to avoid deadlock.
342 void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) { 345 void Scheduler::SetupPollingMechanisms(bool needs_begin_frame) {
343 bool needs_advance_commit_state_timer = false; 346 // At this point we'd prefer to advance through the commit flow by
344 // Setup PollForAnticipatedDrawTriggers if we need to monitor state but 347 // drawing a frame, however it's possible that the frame rate controller
brianderson 2014/12/20 00:34:13 frame rate controller doesn't exist anymore. Since
sunnyps 2014/12/20 00:39:30 Acknowledged.
345 // aren't expecting any more BeginFrames. This should only be needed by 348 // will not give us a BeginFrame until the commit completes. See
346 // the synchronous compositor when BeginFrameNeeded is false. 349 // crbug.com/317430 for an example of a swap ack being held on commit. Thus
347 if (state_machine_.ShouldPollForAnticipatedDrawTriggers()) { 350 // we set a repeating timer to poll on ProcessScheduledActions until we
348 DCHECK(!state_machine_.SupportsProactiveBeginFrame()); 351 // successfully reach BeginFrame. Synchronous compositor does not use
349 DCHECK(!needs_begin_frame); 352 // frame rate controller or have the circular wait in the bug.
350 if (poll_for_draw_triggers_task_.IsCancelled()) { 353 if (IsBeginMainFrameSentOrStarted() &&
351 poll_for_draw_triggers_task_.Reset(poll_for_draw_triggers_closure_); 354 !settings_.using_synchronous_renderer_compositor) {
352 base::TimeDelta delay = begin_impl_frame_args_.IsValid()
353 ? begin_impl_frame_args_.interval
354 : BeginFrameArgs::DefaultInterval();
355 task_runner_->PostDelayedTask(
356 FROM_HERE, poll_for_draw_triggers_task_.callback(), delay);
357 }
358 } else {
359 poll_for_draw_triggers_task_.Cancel();
360
361 // At this point we'd prefer to advance through the commit flow by
362 // drawing a frame, however it's possible that the frame rate controller
363 // will not give us a BeginFrame until the commit completes. See
364 // crbug.com/317430 for an example of a swap ack being held on commit. Thus
365 // we set a repeating timer to poll on ProcessScheduledActions until we
366 // successfully reach BeginFrame. Synchronous compositor does not use
367 // frame rate controller or have the circular wait in the bug.
368 if (IsBeginMainFrameSentOrStarted() &&
369 !settings_.using_synchronous_renderer_compositor) {
370 needs_advance_commit_state_timer = true;
371 }
372 }
373
374 if (needs_advance_commit_state_timer) {
375 if (advance_commit_state_task_.IsCancelled() && 355 if (advance_commit_state_task_.IsCancelled() &&
376 begin_impl_frame_args_.IsValid()) { 356 begin_impl_frame_args_.IsValid()) {
377 // Since we'd rather get a BeginImplFrame by the normal mechanism, we 357 // Since we'd rather get a BeginImplFrame by the normal mechanism, we
378 // set the interval to twice the interval from the previous frame. 358 // set the interval to twice the interval from the previous frame.
379 advance_commit_state_task_.Reset(advance_commit_state_closure_); 359 advance_commit_state_task_.Reset(advance_commit_state_closure_);
380 task_runner_->PostDelayedTask(FROM_HERE, 360 task_runner_->PostDelayedTask(FROM_HERE,
381 advance_commit_state_task_.callback(), 361 advance_commit_state_task_.callback(),
382 begin_impl_frame_args_.interval * 2); 362 begin_impl_frame_args_.interval * 2);
383 } 363 }
384 } else { 364 } else {
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 } 533 }
554 534
555 client_->WillBeginImplFrame(begin_impl_frame_args_); 535 client_->WillBeginImplFrame(begin_impl_frame_args_);
556 state_machine_.OnBeginImplFrame(begin_impl_frame_args_); 536 state_machine_.OnBeginImplFrame(begin_impl_frame_args_);
557 devtools_instrumentation::DidBeginFrame(layer_tree_host_id_); 537 devtools_instrumentation::DidBeginFrame(layer_tree_host_id_);
558 538
559 ProcessScheduledActions(); 539 ProcessScheduledActions();
560 540
561 state_machine_.OnBeginImplFrameDeadlinePending(); 541 state_machine_.OnBeginImplFrameDeadlinePending();
562 542
563 if (settings_.using_synchronous_renderer_compositor) { 543 ProcessScheduledActions();
brianderson 2014/12/20 00:34:13 Nice.
564 // The synchronous renderer compositor has to make its GL calls
565 // within this call.
566 // TODO(brianderson): Have the OutputSurface initiate the deadline tasks
567 // so the synchronous renderer compositor can take advantage of splitting
568 // up the BeginImplFrame and deadline as well.
569 OnBeginImplFrameDeadline();
570 } else {
571 ScheduleBeginImplFrameDeadline();
572 }
573 } 544 }
574 545
575 void Scheduler::ScheduleBeginImplFrameDeadline() { 546 void Scheduler::ScheduleBeginImplFrameDeadline() {
576 // The synchronous compositor does not post a deadline task.
577 DCHECK(!settings_.using_synchronous_renderer_compositor);
578
579 begin_impl_frame_deadline_task_.Cancel(); 547 begin_impl_frame_deadline_task_.Cancel();
580 begin_impl_frame_deadline_task_.Reset(begin_impl_frame_deadline_closure_); 548 begin_impl_frame_deadline_task_.Reset(begin_impl_frame_deadline_closure_);
581 549
582 begin_impl_frame_deadline_mode_ = 550 begin_impl_frame_deadline_mode_ =
583 state_machine_.CurrentBeginImplFrameDeadlineMode(); 551 state_machine_.CurrentBeginImplFrameDeadlineMode();
584 552
585 base::TimeTicks deadline; 553 base::TimeTicks deadline;
586 switch (begin_impl_frame_deadline_mode_) { 554 switch (begin_impl_frame_deadline_mode_) {
587 case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE: 555 case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE_SYNCHRO NOUS:
556 // The synchronous renderer compositor has to make its GL calls
557 // within this call.
558 OnBeginImplFrameDeadline();
559 return;
560 case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_IMMEDIATE_ASYNCHR ONOUS:
588 // We are ready to draw a new active tree immediately. 561 // We are ready to draw a new active tree immediately.
589 // We don't use Now() here because it's somewhat expensive to call. 562 // We don't use Now() here because it's somewhat expensive to call.
590 deadline = base::TimeTicks(); 563 deadline = base::TimeTicks();
591 break; 564 break;
592 case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_REGULAR: 565 case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_REGULAR:
593 // We are animating on the impl thread but we can wait for some time. 566 // We are animating on the impl thread but we can wait for some time.
594 deadline = begin_impl_frame_args_.deadline; 567 deadline = begin_impl_frame_args_.deadline;
595 break; 568 break;
596 case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_LATE: 569 case SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_LATE:
597 // We are blocked for one reason or another and we should wait. 570 // We are blocked for one reason or another and we should wait.
598 // TODO(brianderson): Handle long deadlines (that are past the next 571 // TODO(brianderson): Handle long deadlines (that are past the next
599 // frame's frame time) properly instead of using this hack. 572 // frame's frame time) properly instead of using this hack.
600 deadline = 573 deadline =
601 begin_impl_frame_args_.frame_time + begin_impl_frame_args_.interval; 574 begin_impl_frame_args_.frame_time + begin_impl_frame_args_.interval;
602 break; 575 break;
603 } 576 }
604 577
605 TRACE_EVENT1( 578 TRACE_EVENT2(
606 "cc", "Scheduler::ScheduleBeginImplFrameDeadline", "deadline", deadline); 579 "cc",
580 "Scheduler::ScheduleBeginImplFrameDeadline",
581 "mode",
582 SchedulerStateMachine::BeginImplFrameDeadlineModeToString(
583 begin_impl_frame_deadline_mode_),
584 "deadline",
585 deadline);
607 586
608 base::TimeDelta delta = deadline - Now(); 587 base::TimeDelta delta = std::max(deadline - Now(), base::TimeDelta());
609 if (delta <= base::TimeDelta())
610 delta = base::TimeDelta();
611 task_runner_->PostDelayedTask( 588 task_runner_->PostDelayedTask(
612 FROM_HERE, begin_impl_frame_deadline_task_.callback(), delta); 589 FROM_HERE, begin_impl_frame_deadline_task_.callback(), delta);
613 } 590 }
614 591
615 void Scheduler::RescheduleBeginImplFrameDeadlineIfNeeded() { 592 void Scheduler::ScheduleBeginImplFrameDeadlineIfNeeded() {
616 if (settings_.using_synchronous_renderer_compositor)
617 return;
618
619 if (state_machine_.begin_impl_frame_state() != 593 if (state_machine_.begin_impl_frame_state() !=
620 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME) 594 SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME)
621 return; 595 return;
622 596
623 if (begin_impl_frame_deadline_mode_ != 597 if (begin_impl_frame_deadline_mode_ == state_machine_.CurrentBeginImplFrameDea dlineMode() &&
624 state_machine_.CurrentBeginImplFrameDeadlineMode()) 598 BeginImplFrameDeadlinePending())
625 ScheduleBeginImplFrameDeadline(); 599 return;
600
601 ScheduleBeginImplFrameDeadline();
626 } 602 }
627 603
628 void Scheduler::OnBeginImplFrameDeadline() { 604 void Scheduler::OnBeginImplFrameDeadline() {
629 TRACE_EVENT0("cc", "Scheduler::OnBeginImplFrameDeadline"); 605 TRACE_EVENT0("cc", "Scheduler::OnBeginImplFrameDeadline");
630 begin_impl_frame_deadline_task_.Cancel(); 606 begin_impl_frame_deadline_task_.Cancel();
631 // We split the deadline actions up into two phases so the state machine 607 // We split the deadline actions up into two phases so the state machine
632 // has a chance to trigger actions that should occur durring and after 608 // has a chance to trigger actions that should occur durring and after
633 // the deadline separately. For example: 609 // the deadline separately. For example:
634 // * Sending the BeginMainFrame will not occur after the deadline in 610 // * Sending the BeginMainFrame will not occur after the deadline in
635 // order to wait for more user-input before starting the next commit. 611 // order to wait for more user-input before starting the next commit.
636 // * Creating a new OuputSurface will not occur during the deadline in 612 // * Creating a new OuputSurface will not occur during the deadline in
637 // order to allow the state machine to "settle" first. 613 // order to allow the state machine to "settle" first.
638 state_machine_.OnBeginImplFrameDeadline(); 614 state_machine_.OnBeginImplFrameDeadline();
639 ProcessScheduledActions(); 615 ProcessScheduledActions();
640 state_machine_.OnBeginImplFrameIdle(); 616 state_machine_.OnBeginImplFrameIdle();
641 ProcessScheduledActions(); 617 ProcessScheduledActions();
642 618
643 client_->DidBeginImplFrameDeadline(); 619 client_->DidBeginImplFrameDeadline();
644 } 620 }
645 621
646 void Scheduler::PollForAnticipatedDrawTriggers() {
647 TRACE_EVENT0("cc", "Scheduler::PollForAnticipatedDrawTriggers");
648 poll_for_draw_triggers_task_.Cancel();
649 state_machine_.DidEnterPollForAnticipatedDrawTriggers();
650 ProcessScheduledActions();
651 state_machine_.DidLeavePollForAnticipatedDrawTriggers();
652 }
653 622
654 void Scheduler::PollToAdvanceCommitState() { 623 void Scheduler::PollToAdvanceCommitState() {
655 TRACE_EVENT0("cc", "Scheduler::PollToAdvanceCommitState"); 624 TRACE_EVENT0("cc", "Scheduler::PollToAdvanceCommitState");
656 advance_commit_state_task_.Cancel(); 625 advance_commit_state_task_.Cancel();
657 ProcessScheduledActions(); 626 ProcessScheduledActions();
658 } 627 }
659 628
660 void Scheduler::DrawAndSwapIfPossible() { 629 void Scheduler::DrawAndSwapIfPossible() {
661 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); 630 DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible();
662 state_machine_.DidDrawIfPossibleCompleted(result); 631 state_machine_.DidDrawIfPossibleCompleted(result);
663 } 632 }
664 633
665 void Scheduler::ProcessScheduledActions() { 634 void Scheduler::ProcessScheduledActions() {
666 // We do not allow ProcessScheduledActions to be recursive. 635 // We do not allow ProcessScheduledActions to be recursive.
667 // The top-level call will iteratively execute the next action for us anyway. 636 // The top-level call will iteratively execute the next action for us anyway.
668 if (inside_process_scheduled_actions_) 637 if (inside_process_scheduled_actions_)
669 return; 638 return;
639 {
640 // Separate scope for mark_inside.
brianderson 2014/12/20 00:34:13 Do you only need this to allow re-entrancy when Sc
641 base::AutoReset<bool> mark_inside(&inside_process_scheduled_actions_, true);
670 642
671 base::AutoReset<bool> mark_inside(&inside_process_scheduled_actions_, true); 643 SchedulerStateMachine::Action action;
672 644 do {
673 SchedulerStateMachine::Action action; 645 action = state_machine_.NextAction();
674 do { 646 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"),
675 action = state_machine_.NextAction(); 647 "SchedulerStateMachine",
676 TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), 648 "state",
677 "SchedulerStateMachine", 649 AsValue());
678 "state", 650 VLOG(2) << "Scheduler::ProcessScheduledActions: "
679 AsValue()); 651 << SchedulerStateMachine::ActionToString(action) << " "
680 VLOG(2) << "Scheduler::ProcessScheduledActions: " 652 << state_machine_.GetStatesForDebugging();
681 << SchedulerStateMachine::ActionToString(action) << " " 653 state_machine_.UpdateState(action);
682 << state_machine_.GetStatesForDebugging(); 654 base::AutoReset<SchedulerStateMachine::Action>
683 state_machine_.UpdateState(action); 655 mark_inside_action(&inside_action_, action);
684 base::AutoReset<SchedulerStateMachine::Action> 656 switch (action) {
685 mark_inside_action(&inside_action_, action); 657 case SchedulerStateMachine::ACTION_NONE:
686 switch (action) { 658 break;
687 case SchedulerStateMachine::ACTION_NONE: 659 case SchedulerStateMachine::ACTION_ANIMATE:
688 break; 660 client_->ScheduledActionAnimate();
689 case SchedulerStateMachine::ACTION_ANIMATE: 661 break;
690 client_->ScheduledActionAnimate(); 662 case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME:
691 break; 663 client_->ScheduledActionSendBeginMainFrame();
692 case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME: 664 break;
693 client_->ScheduledActionSendBeginMainFrame(); 665 case SchedulerStateMachine::ACTION_COMMIT:
694 break; 666 client_->ScheduledActionCommit();
695 case SchedulerStateMachine::ACTION_COMMIT: 667 break;
696 client_->ScheduledActionCommit(); 668 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE:
697 break; 669 client_->ScheduledActionActivateSyncTree();
698 case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE: 670 break;
699 client_->ScheduledActionActivateSyncTree(); 671 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE:
700 break; 672 DrawAndSwapIfPossible();
701 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: 673 break;
702 DrawAndSwapIfPossible(); 674 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED:
703 break; 675 client_->ScheduledActionDrawAndSwapForced();
704 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED: 676 break;
705 client_->ScheduledActionDrawAndSwapForced(); 677 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT:
706 break; 678 // No action is actually performed, but this allows the state machine
707 case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: 679 // to advance out of it's waiting to draw state without actually
brianderson 2014/12/20 00:34:13 it's -> its
sunnyps 2014/12/20 00:39:30 Acknowledged.
708 // No action is actually performed, but this allows the state machine to 680 // drawing.
709 // advance out of its waiting to draw state without actually drawing. 681 break;
710 break; 682 case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION:
711 case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION: 683 client_->ScheduledActionBeginOutputSurfaceCreation();
712 client_->ScheduledActionBeginOutputSurfaceCreation(); 684 break;
713 break; 685 case SchedulerStateMachine::ACTION_PREPARE_TILES:
714 case SchedulerStateMachine::ACTION_PREPARE_TILES: 686 client_->ScheduledActionPrepareTiles();
715 client_->ScheduledActionPrepareTiles(); 687 break;
716 break; 688 case SchedulerStateMachine::ACTION_INVALIDATE_OUTPUT_SURFACE:
717 } 689 client_->ScheduledActionInvalidateOutputSurface();
718 } while (action != SchedulerStateMachine::ACTION_NONE); 690 break;
691 }
692 } while (action != SchedulerStateMachine::ACTION_NONE);
693 }
719 694
720 SetupNextBeginFrameIfNeeded(); 695 SetupNextBeginFrameIfNeeded();
721 client_->DidAnticipatedDrawTimeChange(AnticipatedDrawTime()); 696 client_->DidAnticipatedDrawTimeChange(AnticipatedDrawTime());
722 697
723 RescheduleBeginImplFrameDeadlineIfNeeded(); 698 ScheduleBeginImplFrameDeadlineIfNeeded();
724 } 699 }
725 700
726 bool Scheduler::WillDrawIfNeeded() const { 701 bool Scheduler::WillDrawIfNeeded() const {
727 return !state_machine_.PendingDrawsShouldBeAborted(); 702 return !state_machine_.PendingDrawsShouldBeAborted();
728 } 703 }
729 704
730 scoped_refptr<base::debug::ConvertableToTraceFormat> Scheduler::AsValue() 705 scoped_refptr<base::debug::ConvertableToTraceFormat> Scheduler::AsValue()
731 const { 706 const {
732 scoped_refptr<base::debug::TracedValue> state = 707 scoped_refptr<base::debug::TracedValue> state =
733 new base::debug::TracedValue(); 708 new base::debug::TracedValue();
(...skipping 21 matching lines...) Expand all
755 state->SetDouble("time_until_anticipated_draw_time_ms", 730 state->SetDouble("time_until_anticipated_draw_time_ms",
756 (AnticipatedDrawTime() - Now()).InMillisecondsF()); 731 (AnticipatedDrawTime() - Now()).InMillisecondsF());
757 state->SetDouble("estimated_parent_draw_time_ms", 732 state->SetDouble("estimated_parent_draw_time_ms",
758 estimated_parent_draw_time_.InMillisecondsF()); 733 estimated_parent_draw_time_.InMillisecondsF());
759 state->SetBoolean("last_set_needs_begin_frame_", 734 state->SetBoolean("last_set_needs_begin_frame_",
760 frame_source_->NeedsBeginFrames()); 735 frame_source_->NeedsBeginFrames());
761 state->SetBoolean("begin_retro_frame_posted_", begin_retro_frame_posted_); 736 state->SetBoolean("begin_retro_frame_posted_", begin_retro_frame_posted_);
762 state->SetInteger("begin_retro_frame_args_", begin_retro_frame_args_.size()); 737 state->SetInteger("begin_retro_frame_args_", begin_retro_frame_args_.size());
763 state->SetBoolean("begin_impl_frame_deadline_task_", 738 state->SetBoolean("begin_impl_frame_deadline_task_",
764 !begin_impl_frame_deadline_task_.IsCancelled()); 739 !begin_impl_frame_deadline_task_.IsCancelled());
765 state->SetBoolean("poll_for_draw_triggers_task_",
766 !poll_for_draw_triggers_task_.IsCancelled());
767 state->SetBoolean("advance_commit_state_task_", 740 state->SetBoolean("advance_commit_state_task_",
768 !advance_commit_state_task_.IsCancelled()); 741 !advance_commit_state_task_.IsCancelled());
769 state->BeginDictionary("begin_impl_frame_args"); 742 state->BeginDictionary("begin_impl_frame_args");
770 begin_impl_frame_args_.AsValueInto(state); 743 begin_impl_frame_args_.AsValueInto(state);
771 state->EndDictionary(); 744 state->EndDictionary();
772 745
773 state->EndDictionary(); 746 state->EndDictionary();
774 747
775 state->BeginDictionary("client_state"); 748 state->BeginDictionary("client_state");
776 state->SetDouble("draw_duration_estimate_ms", 749 state->SetDouble("draw_duration_estimate_ms",
(...skipping 27 matching lines...) Expand all
804 } 777 }
805 778
806 bool Scheduler::IsBeginMainFrameSentOrStarted() const { 779 bool Scheduler::IsBeginMainFrameSentOrStarted() const {
807 return (state_machine_.commit_state() == 780 return (state_machine_.commit_state() ==
808 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT || 781 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT ||
809 state_machine_.commit_state() == 782 state_machine_.commit_state() ==
810 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED); 783 SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED);
811 } 784 }
812 785
813 } // namespace cc 786 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698