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

Unified Diff: content/browser/renderer_host/compositor_impl_android.cc

Issue 2061273002: cc: Make BackToBackBeginFrameSource a SyntheticBeginFrameSource. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: syntheticbeginframesource: delete-DEBUG_FRAMES 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/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,

Powered by Google App Engine
This is Rietveld 408576698