| 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) {
|
|
|