Index: content/browser/renderer_host/compositor_impl_android.cc |
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc |
index 7150864019221e15ee2aeaf965e520ce9fcfae55..2edec3d8c7452964ab13e0e514b45b2fe759756d 100644 |
--- a/content/browser/renderer_host/compositor_impl_android.cc |
+++ b/content/browser/renderer_host/compositor_impl_android.cc |
@@ -81,23 +81,42 @@ namespace { |
const unsigned int kMaxDisplaySwapBuffers = 1U; |
-class ExternalBeginFrameSource : public cc::BeginFrameSourceBase, |
+class ExternalBeginFrameSource : public cc::BeginFrameSource, |
public CompositorImpl::VSyncObserver { |
public: |
- ExternalBeginFrameSource(CompositorImpl* compositor) |
+ explicit ExternalBeginFrameSource(CompositorImpl* compositor) |
: compositor_(compositor) { |
compositor_->AddObserver(this); |
} |
- |
~ExternalBeginFrameSource() override { compositor_->RemoveObserver(this); } |
- // cc::BeginFrameSourceBase implementation: |
- void AddObserver(cc::BeginFrameObserver* obs) override { |
- cc::BeginFrameSourceBase::AddObserver(obs); |
- DCHECK(needs_begin_frames()); |
- if (!last_begin_frame_args_.IsValid()) |
- return; |
+ // cc::BeginFrameSource implementation. |
+ void AddObserver(cc::BeginFrameObserver* obs) override; |
+ void RemoveObserver(cc::BeginFrameObserver* obs) override; |
+ void DidFinishFrame(cc::BeginFrameObserver* obs, |
+ size_t remaining_frames) override {} |
+ |
+ // CompositorImpl::VSyncObserver implementation. |
+ void OnVSync(base::TimeTicks frame_time, |
+ base::TimeDelta vsync_period) override; |
+ |
+ private: |
+ CompositorImpl* const compositor_; |
+ std::set<cc::BeginFrameObserver*> observers_; |
+ cc::BeginFrameArgs last_begin_frame_args_; |
+}; |
+ |
+void ExternalBeginFrameSource::AddObserver(cc::BeginFrameObserver* obs) { |
+ DCHECK(obs); |
+ DCHECK(observers_.find(obs) == observers_.end()); |
+ |
+ DEBUG_FRAMES("ExternalBeginFrameSource::AddObserver", "num observers", |
+ observers_.size(), "to add observer", obs); |
+ observers_.insert(obs); |
+ obs->OnBeginFrameSourcePausedChanged(false); |
+ compositor_->OnNeedsBeginFramesChange(true); |
+ if (last_begin_frame_args_.IsValid()) { |
// Send a MISSED begin frame if necessary. |
cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); |
if (!last_args.IsValid() || |
@@ -112,27 +131,29 @@ class ExternalBeginFrameSource : public cc::BeginFrameSourceBase, |
obs->OnBeginFrame(last_begin_frame_args_); |
} |
} |
+} |
- void OnNeedsBeginFramesChanged(bool needs_begin_frames) override { |
- TRACE_EVENT1("compositor", "OnNeedsBeginFramesChanged", |
- "needs_begin_frames", needs_begin_frames); |
- compositor_->OnNeedsBeginFramesChange(needs_begin_frames); |
- } |
+void ExternalBeginFrameSource::RemoveObserver(cc::BeginFrameObserver* obs) { |
+ DCHECK(obs); |
+ DCHECK(observers_.find(obs) != observers_.end()); |
- // CompositorImpl::VSyncObserver implementation: |
- void OnVSync(base::TimeTicks frame_time, |
- base::TimeDelta vsync_period) override { |
- base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time); |
- last_begin_frame_args_ = |
- cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
- vsync_period, cc::BeginFrameArgs::NORMAL); |
- CallOnBeginFrame(last_begin_frame_args_); |
- } |
+ DEBUG_FRAMES("ExternalBeginFrameSource::RemoveObserver", "num observers", |
+ observers_.size(), "removed observer", obs); |
+ observers_.erase(obs); |
+ if (observers_.empty()) |
+ compositor_->OnNeedsBeginFramesChange(false); |
+} |
- private: |
- CompositorImpl* compositor_; |
- cc::BeginFrameArgs last_begin_frame_args_; |
-}; |
+void ExternalBeginFrameSource::OnVSync(base::TimeTicks frame_time, |
+ base::TimeDelta vsync_period) { |
+ base::TimeTicks deadline = std::max(base::TimeTicks::Now(), frame_time); |
+ last_begin_frame_args_ = |
+ cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
+ vsync_period, cc::BeginFrameArgs::NORMAL); |
+ std::set<cc::BeginFrameObserver*> observers(observers_); |
+ for (auto* obs : observers) |
+ obs->OnBeginFrame(last_begin_frame_args_); |
+} |
// Used to override capabilities_.adjust_deadline_for_parent to false |
class OutputSurfaceWithoutParent : public cc::OutputSurface, |