Chromium Code Reviews| Index: cc/scheduler/scheduler.cc |
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc |
| index a20bfd2b3b0e2c6eece49c94fcfd66258bc5f5f3..aa2e93f0801c80daa4e4de195e872e959d5256de 100644 |
| --- a/cc/scheduler/scheduler.cc |
| +++ b/cc/scheduler/scheduler.cc |
| @@ -5,6 +5,7 @@ |
| #include "cc/scheduler/scheduler.h" |
| #include <algorithm> |
| + |
| #include "base/auto_reset.h" |
| #include "base/debug/trace_event.h" |
| #include "base/debug/trace_event_argument.h" |
| @@ -79,18 +80,21 @@ Scheduler::Scheduler( |
| SchedulerClient* client, |
| const SchedulerSettings& scheduler_settings, |
| int layer_tree_host_id, |
| - const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) |
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner, |
| + BeginFrameManager* begin_frame_manager) |
| : settings_(scheduler_settings), |
| client_(client), |
| layer_tree_host_id_(layer_tree_host_id), |
| task_runner_(task_runner), |
| vsync_interval_(BeginFrameArgs::DefaultInterval()), |
| + authoritative_vsync_interval_(base::TimeDelta()), |
| last_set_needs_begin_frame_(false), |
| begin_unthrottled_frame_posted_(false), |
| begin_retro_frame_posted_(false), |
| state_machine_(scheduler_settings), |
| inside_process_scheduled_actions_(false), |
| inside_action_(SchedulerStateMachine::ACTION_NONE), |
| + begin_frame_manager_(begin_frame_manager), |
| weak_factory_(this) { |
| TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"), |
| "Scheduler::Scheduler", |
| @@ -101,7 +105,10 @@ Scheduler::Scheduler( |
| if (settings_.main_frame_before_activation_enabled) { |
| DCHECK(settings_.main_frame_before_draw_enabled); |
| } |
| - |
| + if (settings_.begin_frame_publisher) { |
| + DCHECK(begin_frame_manager_); |
| + begin_frame_manager_->set_delegate(this); |
| + } |
| begin_retro_frame_closure_ = |
| base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr()); |
| begin_unthrottled_frame_closure_ = |
| @@ -113,9 +120,8 @@ Scheduler::Scheduler( |
| advance_commit_state_closure_ = base::Bind( |
| &Scheduler::PollToAdvanceCommitState, weak_factory_.GetWeakPtr()); |
| - if (!settings_.begin_frame_scheduling_enabled) { |
| + if (!settings_.begin_frame_receiver) |
| SetupSyntheticBeginFrames(); |
| - } |
| } |
| Scheduler::~Scheduler() { |
| @@ -136,9 +142,18 @@ void Scheduler::CommitVSyncParameters(base::TimeTicks timebase, |
| // TODO(brianderson): We should not be receiving 0 intervals. |
| if (interval == base::TimeDelta()) |
|
brianderson
2014/08/28 02:48:07
Might as well roll this condition into your if/els
simonhong
2014/09/03 21:02:22
Done.
|
| interval = BeginFrameArgs::DefaultInterval(); |
| - vsync_interval_ = interval; |
| - if (!settings_.begin_frame_scheduling_enabled) |
| - synthetic_begin_frame_source_->CommitVSyncParameters(timebase, interval); |
| + |
| + if (authoritative_vsync_interval_ == base::TimeDelta()) |
| + vsync_interval_ = interval; |
| + else |
| + vsync_interval_ = authoritative_vsync_interval_; |
| + |
| + last_timebase_ = timebase; |
| + |
| + if (!settings_.begin_frame_receiver) { |
| + synthetic_begin_frame_source_->CommitVSyncParameters(timebase, |
| + vsync_interval_); |
| + } |
| } |
| void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) { |
| @@ -236,7 +251,7 @@ void Scheduler::DidLoseOutputSurface() { |
| TRACE_EVENT0("cc", "Scheduler::DidLoseOutputSurface"); |
| state_machine_.DidLoseOutputSurface(); |
| last_set_needs_begin_frame_ = false; |
| - if (!settings_.begin_frame_scheduling_enabled) { |
| + if (!settings_.begin_frame_receiver) { |
| synthetic_begin_frame_source_->SetNeedsBeginFrame(false, |
| &begin_retro_frame_args_); |
| } |
| @@ -302,7 +317,7 @@ void Scheduler::SetupNextBeginFrameWhenVSyncThrottlingEnabled( |
| (!needs_begin_frame && last_set_needs_begin_frame_ && at_end_of_deadline); |
| if (should_call_set_needs_begin_frame) { |
| - if (settings_.begin_frame_scheduling_enabled) { |
| + if (settings_.begin_frame_receiver) { |
| client_->SetNeedsBeginFrame(needs_begin_frame); |
| } else { |
| synthetic_begin_frame_source_->SetNeedsBeginFrame( |
| @@ -408,6 +423,13 @@ void Scheduler::BeginFrame(const BeginFrameArgs& args) { |
| DCHECK(settings_.throttle_frame_production); |
| BeginFrameArgs adjusted_args(args); |
| + |
| + if (settings_.begin_frame_publisher && |
| + state_machine_.children_need_begin_frames()) { |
| + // |arg.deadline| should be adjusted by child Scheduler. |
|
brianderson
2014/08/28 02:48:07
Today, the deadline the Browser sends to the Rende
simonhong
2014/09/03 21:02:22
Done.
|
| + begin_frame_manager_->SendBeginFrameToChildren(args); |
| + } |
| + |
| adjusted_args.deadline -= EstimatedParentDrawTime(); |
| bool should_defer_begin_frame; |
| @@ -612,6 +634,28 @@ bool Scheduler::IsBeginMainFrameSent() const { |
| SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT; |
| } |
| +void Scheduler::SetChildrenNeedBeginFrames(bool need_begin_frame) { |
| + DCHECK(settings_.begin_frame_publisher); |
| + |
| + state_machine_.SetChildrenNeedBeginFrames(need_begin_frame); |
| + ProcessScheduledActions(); |
| +} |
| + |
| +void Scheduler::SetAuthoritativeVSyncInterval(base::TimeDelta interval) { |
| + authoritative_vsync_interval_ = interval; |
| + vsync_interval_ = interval; |
| + |
| + if (!settings_.begin_frame_receiver) { |
| + synthetic_begin_frame_source_->CommitVSyncParameters(last_timebase_, |
| + interval); |
| + } |
| +} |
| + |
| +void Scheduler::StartBeginFrame(const BeginFrameArgs& args) { |
| + DCHECK(settings_.begin_frame_publisher && settings_.using_platform_vsync); |
| + BeginFrame(args); |
| +} |
| + |
| void Scheduler::DrawAndSwapIfPossible() { |
| DrawResult result = client_->ScheduledActionDrawAndSwapIfPossible(); |
| state_machine_.DidDrawIfPossibleCompleted(result); |