| Index: cc/scheduler/scheduler.cc
|
| diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc
|
| index a3db945a29b1610ed50ed3106d499f755518df9c..5e9cd4de514a59a5fdbe66a7d18295891fda8f72 100644
|
| --- a/cc/scheduler/scheduler.cc
|
| +++ b/cc/scheduler/scheduler.cc
|
| @@ -18,98 +18,70 @@
|
|
|
| namespace cc {
|
|
|
| -BeginFrameSource* SchedulerFrameSourcesConstructor::ConstructPrimaryFrameSource(
|
| - Scheduler* scheduler) {
|
| - if (scheduler->settings_.use_external_begin_frame_source) {
|
| - TRACE_EVENT1("cc",
|
| - "Scheduler::Scheduler()",
|
| - "PrimaryFrameSource",
|
| - "ExternalBeginFrameSource");
|
| - DCHECK(scheduler->primary_frame_source_internal_)
|
| - << "Need external BeginFrameSource";
|
| - return scheduler->primary_frame_source_internal_.get();
|
| - } else {
|
| - TRACE_EVENT1("cc",
|
| - "Scheduler::Scheduler()",
|
| - "PrimaryFrameSource",
|
| - "SyntheticBeginFrameSource");
|
| - scoped_ptr<SyntheticBeginFrameSource> synthetic_source =
|
| - SyntheticBeginFrameSource::Create(scheduler->task_runner_.get(),
|
| - scheduler->Now(),
|
| - BeginFrameArgs::DefaultInterval());
|
| -
|
| - DCHECK(!scheduler->vsync_observer_);
|
| - scheduler->vsync_observer_ = synthetic_source.get();
|
| -
|
| - DCHECK(!scheduler->primary_frame_source_internal_);
|
| - scheduler->primary_frame_source_internal_ = synthetic_source.Pass();
|
| - return scheduler->primary_frame_source_internal_.get();
|
| +scoped_ptr<Scheduler> Scheduler::Create(
|
| + SchedulerClient* client,
|
| + const SchedulerSettings& settings,
|
| + int layer_tree_host_id,
|
| + const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| + BeginFrameSource* external_frame_source) {
|
| + scoped_ptr<SyntheticBeginFrameSource> synthetic_frame_source;
|
| + if (!settings.use_external_begin_frame_source) {
|
| + synthetic_frame_source = SyntheticBeginFrameSource::Create(
|
| + task_runner.get(), BeginFrameArgs::DefaultInterval());
|
| }
|
| -}
|
| -
|
| -BeginFrameSource*
|
| -SchedulerFrameSourcesConstructor::ConstructUnthrottledFrameSource(
|
| - Scheduler* scheduler) {
|
| - TRACE_EVENT1("cc", "Scheduler::Scheduler()", "UnthrottledFrameSource",
|
| - "BackToBackBeginFrameSource");
|
| - DCHECK(!scheduler->unthrottled_frame_source_internal_);
|
| - scheduler->unthrottled_frame_source_internal_ =
|
| - BackToBackBeginFrameSource::Create(scheduler->task_runner_.get());
|
| - return scheduler->unthrottled_frame_source_internal_.get();
|
| + scoped_ptr<BackToBackBeginFrameSource> unthrottled_frame_source =
|
| + BackToBackBeginFrameSource::Create(task_runner.get());
|
| + return make_scoped_ptr(new Scheduler(
|
| + client, settings, layer_tree_host_id, task_runner, external_frame_source,
|
| + synthetic_frame_source.Pass(), unthrottled_frame_source.Pass()));
|
| }
|
|
|
| Scheduler::Scheduler(
|
| SchedulerClient* client,
|
| - const SchedulerSettings& scheduler_settings,
|
| + const SchedulerSettings& settings,
|
| int layer_tree_host_id,
|
| const scoped_refptr<base::SingleThreadTaskRunner>& task_runner,
|
| - scoped_ptr<BeginFrameSource> external_begin_frame_source,
|
| - SchedulerFrameSourcesConstructor* frame_sources_constructor)
|
| - : frame_source_(),
|
| - primary_frame_source_(NULL),
|
| - primary_frame_source_internal_(external_begin_frame_source.Pass()),
|
| - vsync_observer_(NULL),
|
| - authoritative_vsync_interval_(base::TimeDelta()),
|
| - last_vsync_timebase_(base::TimeTicks()),
|
| - throttle_frame_production_(false),
|
| - settings_(scheduler_settings),
|
| + BeginFrameSource* external_frame_source,
|
| + scoped_ptr<SyntheticBeginFrameSource> synthetic_frame_source,
|
| + scoped_ptr<BackToBackBeginFrameSource> unthrottled_frame_source)
|
| + : settings_(settings),
|
| client_(client),
|
| layer_tree_host_id_(layer_tree_host_id),
|
| task_runner_(task_runner),
|
| + external_frame_source_(external_frame_source),
|
| + synthetic_frame_source_(synthetic_frame_source.Pass()),
|
| + unthrottled_frame_source_(unthrottled_frame_source.Pass()),
|
| + frame_source_(BeginFrameSourceMultiplexer::Create()),
|
| + throttle_frame_production_(false),
|
| begin_impl_frame_deadline_mode_(
|
| SchedulerStateMachine::BEGIN_IMPL_FRAME_DEADLINE_MODE_NONE),
|
| begin_impl_frame_tracker_(BEGINFRAMETRACKER_FROM_HERE),
|
| - state_machine_(scheduler_settings),
|
| + state_machine_(settings),
|
| inside_process_scheduled_actions_(false),
|
| inside_action_(SchedulerStateMachine::ACTION_NONE),
|
| weak_factory_(this) {
|
| - TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler"),
|
| - "Scheduler::Scheduler",
|
| - "settings",
|
| - settings_.AsValue());
|
| + TRACE_EVENT1("cc", "Scheduler::Scheduler", "settings", settings_.AsValue());
|
| DCHECK(client_);
|
| DCHECK(!state_machine_.BeginFrameNeeded());
|
| + DCHECK_IMPLIES(settings_.use_external_begin_frame_source,
|
| + external_frame_source_);
|
| + DCHECK_IMPLIES(!settings_.use_external_begin_frame_source,
|
| + synthetic_frame_source_);
|
| + DCHECK(unthrottled_frame_source_);
|
|
|
| begin_retro_frame_closure_ =
|
| base::Bind(&Scheduler::BeginRetroFrame, weak_factory_.GetWeakPtr());
|
| begin_impl_frame_deadline_closure_ = base::Bind(
|
| &Scheduler::OnBeginImplFrameDeadline, weak_factory_.GetWeakPtr());
|
|
|
| - frame_source_ = BeginFrameSourceMultiplexer::Create();
|
| frame_source_->AddObserver(this);
|
| + frame_source_->AddSource(primary_frame_source());
|
| + primary_frame_source()->SetClientReady();
|
|
|
| - // Primary frame source
|
| - primary_frame_source_ =
|
| - frame_sources_constructor->ConstructPrimaryFrameSource(this);
|
| - frame_source_->AddSource(primary_frame_source_);
|
| - primary_frame_source_->SetClientReady();
|
| + frame_source_->AddSource(unthrottled_frame_source_.get());
|
| + unthrottled_frame_source_->SetClientReady();
|
|
|
| - // Unthrottled frame source
|
| - unthrottled_frame_source_ =
|
| - frame_sources_constructor->ConstructUnthrottledFrameSource(this);
|
| - frame_source_->AddSource(unthrottled_frame_source_);
|
| -
|
| - SetThrottleFrameProduction(scheduler_settings.throttle_frame_production);
|
| + SetThrottleFrameProduction(settings_.throttle_frame_production);
|
| }
|
|
|
| Scheduler::~Scheduler() {
|
| @@ -138,8 +110,8 @@ void Scheduler::CommitVSyncParameters(base::TimeTicks timebase,
|
|
|
| last_vsync_timebase_ = timebase;
|
|
|
| - if (vsync_observer_)
|
| - vsync_observer_->OnUpdateVSyncParameters(timebase, interval);
|
| + if (synthetic_frame_source_)
|
| + synthetic_frame_source_->OnUpdateVSyncParameters(timebase, interval);
|
| }
|
|
|
| void Scheduler::SetEstimatedParentDrawTime(base::TimeDelta draw_time) {
|
| @@ -176,9 +148,9 @@ void Scheduler::NotifyReadyToDraw() {
|
| void Scheduler::SetThrottleFrameProduction(bool throttle) {
|
| throttle_frame_production_ = throttle;
|
| if (throttle) {
|
| - frame_source_->SetActiveSource(primary_frame_source_);
|
| + frame_source_->SetActiveSource(primary_frame_source());
|
| } else {
|
| - frame_source_->SetActiveSource(unthrottled_frame_source_);
|
| + frame_source_->SetActiveSource(unthrottled_frame_source_.get());
|
| }
|
| ProcessScheduledActions();
|
| }
|
| @@ -360,8 +332,10 @@ void Scheduler::SetChildrenNeedBeginFrames(bool children_need_begin_frames) {
|
|
|
| void Scheduler::SetAuthoritativeVSyncInterval(const base::TimeDelta& interval) {
|
| authoritative_vsync_interval_ = interval;
|
| - if (vsync_observer_)
|
| - vsync_observer_->OnUpdateVSyncParameters(last_vsync_timebase_, interval);
|
| + if (synthetic_frame_source_) {
|
| + synthetic_frame_source_->OnUpdateVSyncParameters(last_vsync_timebase_,
|
| + interval);
|
| + }
|
| }
|
|
|
| void Scheduler::SetVideoNeedsBeginFrames(bool video_needs_begin_frames) {
|
|
|