| 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 6c3ed8ebd11dfa06243f67af9e037336db392bdc..1080809431481151286da5e24309564ec258e573 100644
|
| --- a/content/browser/renderer_host/compositor_impl_android.cc
|
| +++ b/content/browser/renderer_host/compositor_impl_android.cc
|
| @@ -86,20 +86,46 @@ class ExternalBeginFrameSource : public cc::BeginFrameSourceBase,
|
| ~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;
|
| +
|
| + // Send a MISSED begin frame if necessary.
|
| + cc::BeginFrameArgs last_args = obs->LastUsedBeginFrameArgs();
|
| + if (!last_args.IsValid() ||
|
| + (last_begin_frame_args_.frame_time > last_args.frame_time)) {
|
| + last_begin_frame_args_.type = cc::BeginFrameArgs::MISSED;
|
| + // TODO(crbug.com/602485): A deadline doesn't make too much sense
|
| + // for a missed BeginFrame (the intention rather is 'immediately'),
|
| + // but currently the retro frame logic is very strict in discarding
|
| + // BeginFrames.
|
| + last_begin_frame_args_.deadline =
|
| + base::TimeTicks::Now() + last_begin_frame_args_.interval;
|
| + 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);
|
| }
|
|
|
| // CompositorImpl::VSyncObserver implementation:
|
| void OnVSync(base::TimeTicks frame_time,
|
| base::TimeDelta vsync_period) override {
|
| - CallOnBeginFrame(cc::BeginFrameArgs::Create(
|
| - BEGINFRAME_FROM_HERE, frame_time, base::TimeTicks::Now(), vsync_period,
|
| - cc::BeginFrameArgs::NORMAL));
|
| + 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_);
|
| }
|
|
|
| private:
|
| CompositorImpl* compositor_;
|
| + cc::BeginFrameArgs last_begin_frame_args_;
|
| };
|
|
|
| // Used to override capabilities_.adjust_deadline_for_parent to false
|
| @@ -415,6 +441,7 @@ void CompositorImpl::SetHasTransparentBackground(bool flag) {
|
| void CompositorImpl::SetNeedsComposite() {
|
| if (!host_->visible())
|
| return;
|
| + TRACE_EVENT0("compositor", "Compositor::SetNeedsComposite");
|
| host_->SetNeedsAnimate();
|
| }
|
|
|
| @@ -595,10 +622,12 @@ void CompositorImpl::RemoveObserver(VSyncObserver* observer) {
|
|
|
| cc::UIResourceId CompositorImpl::CreateUIResource(
|
| cc::UIResourceClient* client) {
|
| + TRACE_EVENT0("compositor", "CompositorImpl::CreateUIResource");
|
| return host_->CreateUIResource(client);
|
| }
|
|
|
| void CompositorImpl::DeleteUIResource(cc::UIResourceId resource_id) {
|
| + TRACE_EVENT0("compositor", "CompositorImpl::DeleteUIResource");
|
| host_->DeleteUIResource(resource_id);
|
| }
|
|
|
| @@ -659,6 +688,7 @@ void CompositorImpl::SetNeedsAnimate() {
|
| if (!host_->visible())
|
| return;
|
|
|
| + TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate");
|
| host_->SetNeedsAnimate();
|
| }
|
|
|
|
|