Chromium Code Reviews| Index: cc/scheduler/scheduler.cc |
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
| index a20bfd2b3b0e2c6eece49c94fcfd66258bc5f5f3..9e8923fa9aa5ced5ecb6083c8916ef1c838e6777 100644 |
| --- a/cc/scheduler/scheduler.cc |
| +++ b/cc/scheduler/scheduler.cc |
| @@ -91,6 +91,7 @@ Scheduler::Scheduler( |
| state_machine_(scheduler_settings), |
| inside_process_scheduled_actions_(false), |
| inside_action_(SchedulerStateMachine::ACTION_NONE), |
| + begin_frame_requested_(false), |
| weak_factory_(this) { |
| TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), |
| "Scheduler::Scheduler", |
| @@ -299,7 +300,10 @@ void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingEnabled( |
| // Always request the BeginFrame immediately if it wasn't needed before. |
| (needs_begin_frame && !last_set_needs_begin_frame_) || |
| // Only stop requesting BeginFrames after a deadline. |
| - (!needs_begin_frame && last_set_needs_begin_frame_ && at_end_of_deadline); |
| + (!needs_begin_frame && |
| + last_set_needs_begin_frame_ && |
| + at_end_of_deadline && |
| + !begin_frame_requested_); |
|
brianderson
2014/08/21 00:13:59
Instead of taking begin_frame_requested_ into acco
simonhong
2014/08/26 08:24:47
Yeap, handling this state by SchdulerStateMachine
|
| if (should_call_set_needs_begin_frame) { |
| if (settings_.begin_frame_scheduling_enabled) { |
| @@ -408,6 +412,13 @@ void Scheduler::BeginFrame(const BeginFrameArgs& args) { |
| DCHECK(settings_.throttle_frame_production); |
| BeginFrameArgs adjusted_args(args); |
| + |
| + if (settings_.begin_frame_publisher && begin_frame_requested_) { |
| + // |arg.deadline| should be adjusted by subscribed Scheduler. |
| + client_->SendBeginFrame(args); |
| + begin_frame_requested_ = false; |
|
brianderson
2014/08/21 00:13:59
The child Schedulers should be setting begin_frame
simonhong
2014/08/26 08:24:47
Yeap, calling SetChildrenNeedBeginFrames() from Be
|
| + } |
| + |
| adjusted_args.deadline -= EstimatedParentDrawTime(); |
| bool should_defer_begin_frame; |
| @@ -612,6 +623,20 @@ bool Scheduler::IsBeginMainFrameSent() const { |
| SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT; |
| } |
| +void Scheduler::BeginFrameRequested() { |
| + DCHECK(settings_.begin_frame_publisher); |
| + DCHECK(!begin_frame_requested_); |
| + |
| + begin_frame_requested_ = true; |
| + |
| + // If frame source is already activated, next BeginFrame will be scheduled. |
| + if (synthetic_begin_frame_source_->IsActive()) |
| + return; |
| + |
| + synthetic_begin_frame_source_->SetNeedsBeginFrame(true, |
|
brianderson
2014/08/21 00:13:59
Instead of calling SetNeedsBeginFrame direcly here
simonhong
2014/08/26 08:24:47
Done.
|
| + &begin_retro_frame_args_); |
| +} |
| + |
| void Scheduler::DrawAndSwapIfPossible() { |
| DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); |
| state_machine_.DidDrawIfPossibleCompleted(result); |