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..b308c52d9b2e8ac868e2f64741ce35177e80be29 100644 |
--- a/content/browser/renderer_host/compositor_impl_android.cc |
+++ b/content/browser/renderer_host/compositor_impl_android.cc |
@@ -7,7 +7,7 @@ |
#include <android/bitmap.h> |
#include <android/native_window_jni.h> |
#include <stdint.h> |
- |
+#include <unordered_set> |
#include <utility> |
#include "base/android/jni_android.h" |
@@ -81,23 +81,40 @@ 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::unordered_set<cc::BeginFrameObserver*> observers_; |
+ cc::BeginFrameArgs last_begin_frame_args_; |
+}; |
+ |
+void ExternalBeginFrameSource::AddObserver(cc::BeginFrameObserver* obs) { |
+ DCHECK(obs); |
+ DCHECK(observers_.find(obs) == observers_.end()); |
+ |
+ 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 +129,27 @@ 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_); |
- } |
+ 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::unordered_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, |