| Index: cc/scheduler/begin_frame_source.cc
|
| diff --git a/cc/scheduler/begin_frame_source.cc b/cc/scheduler/begin_frame_source.cc
|
| deleted file mode 100644
|
| index 42b8f6f1c735db05dfca52c00ed6070bb8b63a36..0000000000000000000000000000000000000000
|
| --- a/cc/scheduler/begin_frame_source.cc
|
| +++ /dev/null
|
| @@ -1,480 +0,0 @@
|
| -// Copyright 2014 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "cc/scheduler/begin_frame_source.h"
|
| -
|
| -#include "base/auto_reset.h"
|
| -#include "base/location.h"
|
| -#include "base/logging.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/trace_event/trace_event.h"
|
| -#include "base/trace_event/trace_event_argument.h"
|
| -#include "cc/scheduler/delay_based_time_source.h"
|
| -#include "cc/scheduler/scheduler.h"
|
| -#include "ui/gfx/frame_time.h"
|
| -
|
| -#ifdef NDEBUG
|
| -#define DEBUG_FRAMES(...)
|
| -#else
|
| -#define DEBUG_FRAMES(name, arg1_name, arg1_val, arg2_name, arg2_val) \
|
| - TRACE_EVENT2(TRACE_DISABLED_BY_DEFAULT("cc.debug.scheduler.frames"), \
|
| - name, \
|
| - arg1_name, \
|
| - arg1_val, \
|
| - arg2_name, \
|
| - arg2_val);
|
| -#endif
|
| -
|
| -namespace cc {
|
| -
|
| -// BeginFrameObserverMixIn -----------------------------------------------
|
| -BeginFrameObserverMixIn::BeginFrameObserverMixIn()
|
| - : last_begin_frame_args_(), dropped_begin_frame_args_(0) {
|
| -}
|
| -
|
| -const BeginFrameArgs BeginFrameObserverMixIn::LastUsedBeginFrameArgs() const {
|
| - return last_begin_frame_args_;
|
| -}
|
| -void BeginFrameObserverMixIn::OnBeginFrame(const BeginFrameArgs& args) {
|
| - DEBUG_FRAMES("BeginFrameObserverMixIn::OnBeginFrame",
|
| - "last args",
|
| - last_begin_frame_args_.AsValue(),
|
| - "new args",
|
| - args.AsValue());
|
| - DCHECK(args.IsValid());
|
| - DCHECK(args.frame_time >= last_begin_frame_args_.frame_time);
|
| - bool used = OnBeginFrameMixInDelegate(args);
|
| - if (used) {
|
| - last_begin_frame_args_ = args;
|
| - } else {
|
| - ++dropped_begin_frame_args_;
|
| - }
|
| -}
|
| -
|
| -void BeginFrameObserverMixIn::AsValueInto(
|
| - base::trace_event::TracedValue* dict) const {
|
| - dict->BeginDictionary("last_begin_frame_args_");
|
| - last_begin_frame_args_.AsValueInto(dict);
|
| - dict->EndDictionary();
|
| - dict->SetInteger("dropped_begin_frame_args_", dropped_begin_frame_args_);
|
| -}
|
| -
|
| -// BeginFrameSourceMixIn ------------------------------------------------------
|
| -BeginFrameSourceMixIn::BeginFrameSourceMixIn()
|
| - : observer_(NULL),
|
| - needs_begin_frames_(false),
|
| - inside_as_value_into_(false) {
|
| - DCHECK(!observer_);
|
| - DCHECK_EQ(inside_as_value_into_, false);
|
| -}
|
| -
|
| -bool BeginFrameSourceMixIn::NeedsBeginFrames() const {
|
| - return needs_begin_frames_;
|
| -}
|
| -
|
| -void BeginFrameSourceMixIn::SetNeedsBeginFrames(bool needs_begin_frames) {
|
| - DEBUG_FRAMES("BeginFrameSourceMixIn::SetNeedsBeginFrames",
|
| - "current state",
|
| - needs_begin_frames_,
|
| - "new state",
|
| - needs_begin_frames);
|
| - if (needs_begin_frames_ != needs_begin_frames) {
|
| - needs_begin_frames_ = needs_begin_frames;
|
| - OnNeedsBeginFramesChange(needs_begin_frames);
|
| - }
|
| -}
|
| -
|
| -void BeginFrameSourceMixIn::AddObserver(BeginFrameObserver* obs) {
|
| - DEBUG_FRAMES("BeginFrameSourceMixIn::AddObserver",
|
| - "current observer",
|
| - observer_,
|
| - "to add observer",
|
| - obs);
|
| - DCHECK(!observer_);
|
| - observer_ = obs;
|
| -}
|
| -
|
| -void BeginFrameSourceMixIn::RemoveObserver(BeginFrameObserver* obs) {
|
| - DEBUG_FRAMES("BeginFrameSourceMixIn::RemoveObserver",
|
| - "current observer",
|
| - observer_,
|
| - "to remove observer",
|
| - obs);
|
| - DCHECK_EQ(observer_, obs);
|
| - observer_ = NULL;
|
| -}
|
| -
|
| -void BeginFrameSourceMixIn::CallOnBeginFrame(const BeginFrameArgs& args) {
|
| - DEBUG_FRAMES("BeginFrameSourceMixIn::CallOnBeginFrame",
|
| - "current observer",
|
| - observer_,
|
| - "args",
|
| - args.AsValue());
|
| - if (observer_) {
|
| - return observer_->OnBeginFrame(args);
|
| - }
|
| -}
|
| -
|
| -// Tracing support
|
| -void BeginFrameSourceMixIn::AsValueInto(
|
| - base::trace_event::TracedValue* dict) const {
|
| - // As the observer might try to trace the source, prevent an infinte loop
|
| - // from occuring.
|
| - if (inside_as_value_into_) {
|
| - dict->SetString("observer", "<loop detected>");
|
| - return;
|
| - }
|
| -
|
| - if (observer_) {
|
| - base::AutoReset<bool> prevent_loops(
|
| - const_cast<bool*>(&inside_as_value_into_), true);
|
| - dict->BeginDictionary("observer");
|
| - observer_->AsValueInto(dict);
|
| - dict->EndDictionary();
|
| - } else {
|
| - dict->SetString("observer", "NULL");
|
| - }
|
| - dict->SetBoolean("needs_begin_frames", NeedsBeginFrames());
|
| -}
|
| -
|
| -// BackToBackBeginFrameSourceMixIn --------------------------------------------
|
| -scoped_ptr<BackToBackBeginFrameSource> BackToBackBeginFrameSource::Create(
|
| - base::SingleThreadTaskRunner* task_runner) {
|
| - return make_scoped_ptr(new BackToBackBeginFrameSource(task_runner));
|
| -}
|
| -
|
| -BackToBackBeginFrameSource::BackToBackBeginFrameSource(
|
| - base::SingleThreadTaskRunner* task_runner)
|
| - : BeginFrameSourceMixIn(),
|
| - task_runner_(task_runner),
|
| - send_begin_frame_posted_(false),
|
| - weak_factory_(this) {
|
| - DCHECK(task_runner);
|
| - DCHECK_EQ(needs_begin_frames_, false);
|
| - DCHECK_EQ(send_begin_frame_posted_, false);
|
| -}
|
| -
|
| -BackToBackBeginFrameSource::~BackToBackBeginFrameSource() {
|
| -}
|
| -
|
| -base::TimeTicks BackToBackBeginFrameSource::Now() {
|
| - return gfx::FrameTime::Now();
|
| -}
|
| -
|
| -void BackToBackBeginFrameSource::OnNeedsBeginFramesChange(
|
| - bool needs_begin_frames) {
|
| - if (!needs_begin_frames)
|
| - return;
|
| -
|
| - if (send_begin_frame_posted_)
|
| - return;
|
| -
|
| - send_begin_frame_posted_ = true;
|
| - task_runner_->PostTask(FROM_HERE,
|
| - base::Bind(&BackToBackBeginFrameSource::BeginFrame,
|
| - weak_factory_.GetWeakPtr()));
|
| -}
|
| -
|
| -void BackToBackBeginFrameSource::BeginFrame() {
|
| - send_begin_frame_posted_ = false;
|
| -
|
| - if (!needs_begin_frames_)
|
| - return;
|
| -
|
| - base::TimeTicks now = Now();
|
| - BeginFrameArgs args = BeginFrameArgs::Create(
|
| - BEGINFRAME_FROM_HERE, now, now + BeginFrameArgs::DefaultInterval(),
|
| - BeginFrameArgs::DefaultInterval(), BeginFrameArgs::NORMAL);
|
| - CallOnBeginFrame(args);
|
| -}
|
| -
|
| -// BeginFrameSource support
|
| -
|
| -void BackToBackBeginFrameSource::DidFinishFrame(size_t remaining_frames) {
|
| - if (remaining_frames == 0) {
|
| - OnNeedsBeginFramesChange(NeedsBeginFrames());
|
| - }
|
| -}
|
| -
|
| -// Tracing support
|
| -void BackToBackBeginFrameSource::AsValueInto(
|
| - base::trace_event::TracedValue* dict) const {
|
| - dict->SetString("type", "BackToBackBeginFrameSource");
|
| - BeginFrameSourceMixIn::AsValueInto(dict);
|
| - dict->SetBoolean("send_begin_frame_posted_", send_begin_frame_posted_);
|
| -}
|
| -
|
| -// SyntheticBeginFrameSource ---------------------------------------------
|
| -scoped_ptr<SyntheticBeginFrameSource> SyntheticBeginFrameSource::Create(
|
| - base::SingleThreadTaskRunner* task_runner,
|
| - base::TimeTicks initial_vsync_timebase,
|
| - base::TimeDelta initial_vsync_interval) {
|
| - scoped_refptr<DelayBasedTimeSource> time_source;
|
| - if (gfx::FrameTime::TimestampsAreHighRes()) {
|
| - time_source = DelayBasedTimeSourceHighRes::Create(initial_vsync_interval,
|
| - task_runner);
|
| - } else {
|
| - time_source =
|
| - DelayBasedTimeSource::Create(initial_vsync_interval, task_runner);
|
| - }
|
| -
|
| - return make_scoped_ptr(new SyntheticBeginFrameSource(time_source));
|
| -}
|
| -
|
| -SyntheticBeginFrameSource::SyntheticBeginFrameSource(
|
| - scoped_refptr<DelayBasedTimeSource> time_source)
|
| - : BeginFrameSourceMixIn(), time_source_(time_source) {
|
| - time_source_->SetActive(false);
|
| - time_source_->SetClient(this);
|
| -}
|
| -
|
| -SyntheticBeginFrameSource::~SyntheticBeginFrameSource() {
|
| - if (NeedsBeginFrames())
|
| - time_source_->SetActive(false);
|
| -}
|
| -
|
| -void SyntheticBeginFrameSource::OnUpdateVSyncParameters(
|
| - base::TimeTicks new_vsync_timebase,
|
| - base::TimeDelta new_vsync_interval) {
|
| - time_source_->SetTimebaseAndInterval(new_vsync_timebase, new_vsync_interval);
|
| -}
|
| -
|
| -BeginFrameArgs SyntheticBeginFrameSource::CreateBeginFrameArgs(
|
| - base::TimeTicks frame_time,
|
| - BeginFrameArgs::BeginFrameArgsType type) {
|
| - base::TimeTicks deadline = time_source_->NextTickTime();
|
| - return BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline,
|
| - time_source_->Interval(), type);
|
| -}
|
| -
|
| -// TimeSourceClient support
|
| -void SyntheticBeginFrameSource::OnTimerTick() {
|
| - CallOnBeginFrame(CreateBeginFrameArgs(time_source_->LastTickTime(),
|
| - BeginFrameArgs::NORMAL));
|
| -}
|
| -
|
| -// BeginFrameSourceMixIn support
|
| -void SyntheticBeginFrameSource::OnNeedsBeginFramesChange(
|
| - bool needs_begin_frames) {
|
| - base::TimeTicks missed_tick_time =
|
| - time_source_->SetActive(needs_begin_frames);
|
| - if (!missed_tick_time.is_null()) {
|
| - CallOnBeginFrame(
|
| - CreateBeginFrameArgs(missed_tick_time, BeginFrameArgs::MISSED));
|
| - }
|
| -}
|
| -
|
| -// Tracing support
|
| -void SyntheticBeginFrameSource::AsValueInto(
|
| - base::trace_event::TracedValue* dict) const {
|
| - dict->SetString("type", "SyntheticBeginFrameSource");
|
| - BeginFrameSourceMixIn::AsValueInto(dict);
|
| -
|
| - dict->BeginDictionary("time_source");
|
| - time_source_->AsValueInto(dict);
|
| - dict->EndDictionary();
|
| -}
|
| -
|
| -// BeginFrameSourceMultiplexer -------------------------------------------
|
| -scoped_ptr<BeginFrameSourceMultiplexer> BeginFrameSourceMultiplexer::Create() {
|
| - return make_scoped_ptr(new BeginFrameSourceMultiplexer());
|
| -}
|
| -
|
| -BeginFrameSourceMultiplexer::BeginFrameSourceMultiplexer()
|
| - : BeginFrameSourceMixIn(),
|
| - minimum_interval_(base::TimeDelta()),
|
| - active_source_(NULL),
|
| - source_list_() {
|
| -}
|
| -
|
| -BeginFrameSourceMultiplexer::BeginFrameSourceMultiplexer(
|
| - base::TimeDelta minimum_interval)
|
| - : BeginFrameSourceMixIn(),
|
| - minimum_interval_(minimum_interval),
|
| - active_source_(NULL),
|
| - source_list_() {
|
| -}
|
| -
|
| -BeginFrameSourceMultiplexer::~BeginFrameSourceMultiplexer() {
|
| -}
|
| -
|
| -void BeginFrameSourceMultiplexer::SetMinimumInterval(
|
| - base::TimeDelta new_minimum_interval) {
|
| - DEBUG_FRAMES("BeginFrameSourceMultiplexer::SetMinimumInterval",
|
| - "current minimum (us)",
|
| - minimum_interval_.InMicroseconds(),
|
| - "new minimum (us)",
|
| - new_minimum_interval.InMicroseconds());
|
| - DCHECK_GE(new_minimum_interval.ToInternalValue(), 0);
|
| - minimum_interval_ = new_minimum_interval;
|
| -}
|
| -
|
| -void BeginFrameSourceMultiplexer::AddSource(BeginFrameSource* new_source) {
|
| - DEBUG_FRAMES("BeginFrameSourceMultiplexer::AddSource",
|
| - "current active",
|
| - active_source_,
|
| - "source to remove",
|
| - new_source);
|
| - DCHECK(new_source);
|
| - DCHECK(!HasSource(new_source));
|
| -
|
| - source_list_.insert(new_source);
|
| -
|
| - // If there is no active source, set the new one as the active one.
|
| - if (!active_source_)
|
| - SetActiveSource(new_source);
|
| -}
|
| -
|
| -void BeginFrameSourceMultiplexer::RemoveSource(
|
| - BeginFrameSource* existing_source) {
|
| - DEBUG_FRAMES("BeginFrameSourceMultiplexer::RemoveSource",
|
| - "current active",
|
| - active_source_,
|
| - "source to remove",
|
| - existing_source);
|
| - DCHECK(existing_source);
|
| - DCHECK(HasSource(existing_source));
|
| - DCHECK_NE(existing_source, active_source_);
|
| - source_list_.erase(existing_source);
|
| -}
|
| -
|
| -void BeginFrameSourceMultiplexer::SetActiveSource(
|
| - BeginFrameSource* new_source) {
|
| - DEBUG_FRAMES("BeginFrameSourceMultiplexer::SetActiveSource",
|
| - "current active",
|
| - active_source_,
|
| - "to become active",
|
| - new_source);
|
| -
|
| - DCHECK(HasSource(new_source) || new_source == NULL);
|
| -
|
| - bool needs_begin_frames = NeedsBeginFrames();
|
| - if (active_source_) {
|
| - if (needs_begin_frames)
|
| - SetNeedsBeginFrames(false);
|
| -
|
| - // Technically we shouldn't need to remove observation, but this prevents
|
| - // the case where SetNeedsBeginFrames message gets to the source after a
|
| - // message has already been sent.
|
| - active_source_->RemoveObserver(this);
|
| - active_source_ = NULL;
|
| - }
|
| - DCHECK(!active_source_);
|
| - active_source_ = new_source;
|
| -
|
| - if (active_source_) {
|
| - active_source_->AddObserver(this);
|
| -
|
| - if (needs_begin_frames) {
|
| - SetNeedsBeginFrames(true);
|
| - }
|
| - }
|
| -}
|
| -
|
| -const BeginFrameSource* BeginFrameSourceMultiplexer::ActiveSource() {
|
| - return active_source_;
|
| -}
|
| -
|
| -// BeginFrameObserver support
|
| -void BeginFrameSourceMultiplexer::OnBeginFrame(const BeginFrameArgs& args) {
|
| - if (!IsIncreasing(args)) {
|
| - DEBUG_FRAMES("BeginFrameSourceMultiplexer::OnBeginFrame",
|
| - "action",
|
| - "discarding",
|
| - "new args",
|
| - args.AsValue());
|
| - return;
|
| - }
|
| - DEBUG_FRAMES("BeginFrameSourceMultiplexer::OnBeginFrame",
|
| - "action",
|
| - "using",
|
| - "new args",
|
| - args.AsValue());
|
| - CallOnBeginFrame(args);
|
| -}
|
| -
|
| -const BeginFrameArgs BeginFrameSourceMultiplexer::LastUsedBeginFrameArgs()
|
| - const {
|
| - if (observer_)
|
| - return observer_->LastUsedBeginFrameArgs();
|
| - else
|
| - return BeginFrameArgs();
|
| -}
|
| -
|
| -// BeginFrameSource support
|
| -void BeginFrameSourceMultiplexer::OnNeedsBeginFramesChange(
|
| - bool needs_begin_frames) {
|
| - DEBUG_FRAMES("BeginFrameSourceMultiplexer::OnNeedsBeginFramesChange",
|
| - "active_source", active_source_, "needs_begin_frames",
|
| - needs_begin_frames);
|
| - if (active_source_) {
|
| - active_source_->SetNeedsBeginFrames(needs_begin_frames);
|
| - } else {
|
| - DCHECK(!needs_begin_frames);
|
| - }
|
| -}
|
| -
|
| -void BeginFrameSourceMultiplexer::DidFinishFrame(size_t remaining_frames) {
|
| - DEBUG_FRAMES("BeginFrameSourceMultiplexer::DidFinishFrame",
|
| - "active_source",
|
| - active_source_,
|
| - "remaining_frames",
|
| - remaining_frames);
|
| - if (active_source_) {
|
| - active_source_->DidFinishFrame(remaining_frames);
|
| - }
|
| -}
|
| -
|
| -// Tracing support
|
| -void BeginFrameSourceMultiplexer::AsValueInto(
|
| - base::trace_event::TracedValue* dict) const {
|
| - dict->SetString("type", "BeginFrameSourceMultiplexer");
|
| -
|
| - dict->SetInteger("minimum_interval_us", minimum_interval_.InMicroseconds());
|
| - if (observer_) {
|
| - dict->BeginDictionary("last_begin_frame_args");
|
| - observer_->LastUsedBeginFrameArgs().AsValueInto(dict);
|
| - dict->EndDictionary();
|
| - }
|
| -
|
| - if (active_source_) {
|
| - dict->BeginDictionary("active_source");
|
| - active_source_->AsValueInto(dict);
|
| - dict->EndDictionary();
|
| - } else {
|
| - dict->SetString("active_source", "NULL");
|
| - }
|
| -
|
| - dict->BeginArray("sources");
|
| - for (std::set<BeginFrameSource*>::const_iterator it = source_list_.begin();
|
| - it != source_list_.end();
|
| - ++it) {
|
| - dict->BeginDictionary();
|
| - (*it)->AsValueInto(dict);
|
| - dict->EndDictionary();
|
| - }
|
| - dict->EndArray();
|
| -}
|
| -
|
| -// protected methods
|
| -bool BeginFrameSourceMultiplexer::HasSource(BeginFrameSource* source) {
|
| - return (source_list_.find(source) != source_list_.end());
|
| -}
|
| -
|
| -bool BeginFrameSourceMultiplexer::IsIncreasing(const BeginFrameArgs& args) {
|
| - DCHECK(args.IsValid());
|
| - if (!observer_)
|
| - return false;
|
| -
|
| - // If the last begin frame is invalid, then any new begin frame is valid.
|
| - if (!observer_->LastUsedBeginFrameArgs().IsValid())
|
| - return true;
|
| -
|
| - // Only allow new args have a *strictly bigger* frame_time value and statisfy
|
| - // minimum interval requirement.
|
| - return (args.frame_time >=
|
| - observer_->LastUsedBeginFrameArgs().frame_time + minimum_interval_);
|
| -}
|
| -
|
| -} // namespace cc
|
|
|