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 56b9201dcc5b70abac801a1e398ffac1b25a33d9..a34da7218e20ff43f780cd52c437e41db3f9a8c4 100644 |
--- a/content/browser/renderer_host/compositor_impl_android.cc |
+++ b/content/browser/renderer_host/compositor_impl_android.cc |
@@ -160,7 +160,7 @@ class ExternalBeginFrameSource : public cc::BeginFrameSourceBase, |
public CompositorImpl::VSyncObserver { |
public: |
ExternalBeginFrameSource(CompositorImpl* compositor) |
- : compositor_(compositor) { |
+ : compositor_(compositor), needs_begin_frames_(false) { |
compositor_->AddObserver(this); |
} |
@@ -170,19 +170,41 @@ class ExternalBeginFrameSource : public cc::BeginFrameSourceBase, |
// cc::BeginFrameSourceBase implementation: |
void OnNeedsBeginFramesChanged(bool needs_begin_frames) override { |
+ TRACE_EVENT1("compositor", "OnNeedsBeginFramesChanged", |
+ "needs_begin_frames", needs_begin_frames); |
compositor_->OnNeedsBeginFramesChange(needs_begin_frames); |
+ needs_begin_frames_ = needs_begin_frames; |
+ if (needs_begin_frames) { |
no sievers
2016/04/11 23:10:10
Oh I was going to ask:
Should I also remember the
|
+ base::TimeTicks now = base::TimeTicks::Now(); |
+ // Since |needs_begin_frames_| turned on, the scheduler wants to draw, |
+ // so the dealine doesn't matter much. But pass something large enough |
+ // to make sure we don't get discarded in BeginRetroFrame(), see |
+ // crbug.com/602485. |
+ base::TimeTicks deadline = now + base::TimeDelta::FromMilliseconds(16); |
+ cc::BeginFrameArgs args(cc::BeginFrameArgs::Create( |
+ BEGINFRAME_FROM_HERE, now, deadline, |
+ base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL)); |
+ base::Closure tick = |
+ base::Bind(&ExternalBeginFrameSource::CallOnBeginFrame, |
+ base::Unretained(this), args); |
+ base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, tick); |
+ } |
} |
// 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 = frame_time + 2 * vsync_period / 3; |
+ if (needs_begin_frames_) { |
+ CallOnBeginFrame( |
+ cc::BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, frame_time, deadline, |
+ vsync_period, cc::BeginFrameArgs::NORMAL)); |
+ } |
} |
private: |
CompositorImpl* compositor_; |
+ bool needs_begin_frames_; |
}; |
static bool g_initialized = false; |
@@ -406,6 +428,7 @@ void CompositorImpl::SetHasTransparentBackground(bool flag) { |
void CompositorImpl::SetNeedsComposite() { |
if (!host_->visible()) |
return; |
+ TRACE_EVENT0("compositor", "Compositor::SetNeedsComposite"); |
host_->SetNeedsAnimate(); |
} |
@@ -585,10 +608,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); |
} |
@@ -649,6 +674,7 @@ void CompositorImpl::SetNeedsAnimate() { |
if (!host_->visible()) |
return; |
+ TRACE_EVENT0("compositor", "Compositor::SetNeedsAnimate"); |
host_->SetNeedsAnimate(); |
} |