Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1684)

Unified Diff: content/renderer/gpu/compositor_external_begin_frame_source.cc

Issue 2061273002: cc: Make BackToBackBeginFrameSource a SyntheticBeginFrameSource. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: syntheticbeginframesource: no-more-bfs-base Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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) {

Powered by Google App Engine
This is Rietveld 408576698