Chromium Code Reviews| 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..45149d1fb9e80363d88fbdfd1c14cf23bc25ea3b 100644 |
| --- a/content/renderer/gpu/compositor_external_begin_frame_source.cc |
| +++ b/content/renderer/gpu/compositor_external_begin_frame_source.cc |
| @@ -32,19 +32,21 @@ 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()); |
| + |
| + DEBUG_FRAMES("CompositorExternalBeginFrameSource::AddObserver", |
| + "num observers", observers_.size(), "to add observer", obs); |
| 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 +57,20 @@ void CompositorExternalBeginFrameSource::AddObserver( |
| } |
| } |
| +void CompositorExternalBeginFrameSource::RemoveObserver( |
| + cc::BeginFrameObserver* obs) { |
| + DCHECK(obs); |
| + DCHECK(observers_.find(obs) != observers_.end()); |
| + |
| + DEBUG_FRAMES("CompositorExternalBeginFrameSource::RemoveObserver", |
| + "num observers", observers_.size(), "removed observer", obs); |
| + 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 +90,35 @@ 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; |
| + DEBUG_FRAMES( |
| + "CompositorExternalBeginFrameSource::OnSetBeginFrameSourcePaused", |
| + "num observers", observers_.size(), "paused", paused); |
| + paused_ = paused; |
| + std::set<cc::BeginFrameObserver*> observers(observers_); |
|
piman
2016/06/15 19:48:14
Would it make sense to use ObserverList + FOR_EACH
danakj
2016/06/15 19:56:05
I think it didn't work because of OnBeginFrame bei
danakj
2016/06/15 19:58:00
OK.. so I found the email and it said:
"The impor
danakj
2016/06/15 20:23:41
It gets sketchy around "if the list was empty then
|
| + for (auto* obs : observers) |
| + obs->OnBeginFrameSourcePausedChanged(paused_); |
| +} |
| + |
| void CompositorExternalBeginFrameSource::OnBeginFrame( |
| const cc::BeginFrameArgs& args) { |
| + DEBUG_FRAMES("CompositorExternalBeginFrameSource::OnBeginFrame", |
| + "num observers", observers_.size(), "args", args.AsValue()); |
| DCHECK(CalledOnValidThread()); |
| missed_begin_frame_args_ = args; |
| missed_begin_frame_args_.type = cc::BeginFrameArgs::MISSED; |
| - CallOnBeginFrame(args); |
| + std::set<cc::BeginFrameObserver*> observers(observers_); |
| + for (auto* obs : observers) |
| + obs->OnBeginFrame(args); |
| } |
| bool CompositorExternalBeginFrameSource::Send(IPC::Message* message) { |