Index: content/renderer/gpu/compositor_external_begin_frame_source.cc |
diff --git a/content/renderer/gpu/compositor_external_begin_frame_source.cc b/content/renderer/gpu/compositor_external_begin_frame_source.cc |
index a8b76cf2e87366d30dde269a15e5a982054592ba..e2d13608ac781ece2ba7576d23a3ef8cade0cfb6 100644 |
--- a/content/renderer/gpu/compositor_external_begin_frame_source.cc |
+++ b/content/renderer/gpu/compositor_external_begin_frame_source.cc |
@@ -32,19 +32,19 @@ CompositorExternalBeginFrameSource::~CompositorExternalBeginFrameSource() { |
} |
} |
-void CompositorExternalBeginFrameSource::OnNeedsBeginFramesChanged( |
- bool needs_begin_frames) { |
- DCHECK(CalledOnValidThread()); |
- if (!needs_begin_frames) |
- missed_begin_frame_args_ = cc::BeginFrameArgs(); |
- Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, needs_begin_frames)); |
-} |
- |
void CompositorExternalBeginFrameSource::AddObserver( |
cc::BeginFrameObserver* obs) { |
DCHECK(CalledOnValidThread()); |
+ DCHECK(obs); |
+ DCHECK(observers_.find(obs) == observers_.end()); |
+ |
SetClientReady(); |
- BeginFrameSourceBase::AddObserver(obs); |
+ bool observers_was_empty = observers_.empty(); |
+ observers_.insert(obs); |
+ obs->OnBeginFrameSourcePausedChanged(paused_); |
+ if (observers_was_empty) |
+ Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, true)); |
+ |
// Send a MISSED begin frame if necessary. |
if (missed_begin_frame_args_.IsValid()) { |
cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs(); |
@@ -55,6 +55,18 @@ void CompositorExternalBeginFrameSource::AddObserver( |
} |
} |
+void CompositorExternalBeginFrameSource::RemoveObserver( |
+ cc::BeginFrameObserver* obs) { |
+ DCHECK(obs); |
+ DCHECK(observers_.find(obs) != observers_.end()); |
+ |
+ observers_.erase(obs); |
+ if (observers_.empty()) { |
+ missed_begin_frame_args_ = cc::BeginFrameArgs(); |
+ Send(new ViewHostMsg_SetNeedsBeginFrames(routing_id_, false)); |
+ } |
+} |
+ |
void CompositorExternalBeginFrameSource::SetClientReady() { |
DCHECK(CalledOnValidThread()); |
if (begin_frame_source_proxy_) |
@@ -74,17 +86,30 @@ void CompositorExternalBeginFrameSource::OnMessageReceived( |
DCHECK(CalledOnValidThread()); |
DCHECK(begin_frame_source_proxy_.get()); |
IPC_BEGIN_MESSAGE_MAP(CompositorExternalBeginFrameSource, message) |
- IPC_MESSAGE_HANDLER(ViewMsg_SetBeginFramePaused, SetBeginFrameSourcePaused) |
+ IPC_MESSAGE_HANDLER(ViewMsg_SetBeginFramePaused, |
+ OnSetBeginFrameSourcePaused) |
IPC_MESSAGE_HANDLER(ViewMsg_BeginFrame, OnBeginFrame) |
IPC_END_MESSAGE_MAP() |
} |
+void CompositorExternalBeginFrameSource::OnSetBeginFrameSourcePaused( |
+ bool paused) { |
+ if (paused_ == paused) |
+ return; |
+ paused_ = paused; |
+ std::unordered_set<cc::BeginFrameObserver*> observers(observers_); |
+ for (auto* obs : observers) |
+ obs->OnBeginFrameSourcePausedChanged(paused_); |
+} |
+ |
void CompositorExternalBeginFrameSource::OnBeginFrame( |
const cc::BeginFrameArgs& args) { |
DCHECK(CalledOnValidThread()); |
missed_begin_frame_args_ = args; |
missed_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; |
- CallOnBeginFrame(args); |
+ std::unordered_set<cc::BeginFrameObserver*> observers(observers_); |
+ for (auto* obs : observers) |
+ obs->OnBeginFrame(args); |
} |
bool CompositorExternalBeginFrameSource::Send(IPC::Message* message) { |