Index: content/browser/renderer_host/compositor_impl_android.h |
diff --git a/content/browser/renderer_host/compositor_impl_android.h b/content/browser/renderer_host/compositor_impl_android.h |
index 65be041c8e184713a94299027ef55eef4c83e175..7dc3837a856a482806bf6c3315979dfed47d8bd1 100644 |
--- a/content/browser/renderer_host/compositor_impl_android.h |
+++ b/content/browser/renderer_host/compositor_impl_android.h |
@@ -48,8 +48,8 @@ |
public: |
class VSyncObserver { |
public: |
- virtual void OnVSync(base::TimeTicks timebase, |
- base::TimeDelta interval) = 0; |
+ virtual void OnUpdateVSyncParameters(base::TimeTicks timebase, |
+ base::TimeDelta interval) = 0; |
}; |
CompositorImpl(CompositorClient* client, gfx::NativeWindow root_window); |
@@ -64,7 +64,6 @@ |
void AddObserver(VSyncObserver* observer); |
void RemoveObserver(VSyncObserver* observer); |
- void OnNeedsBeginFramesChange(bool needs_begin_frames); |
// ui::ResourceProvider implementation. |
cc::UIResourceId CreateUIResource(cc::UIResourceClient* client) override; |
@@ -107,6 +106,8 @@ |
override {} |
// LayerTreeHostSingleThreadClient implementation. |
+ void ScheduleComposite() override; |
+ void ScheduleAnimation() override; |
void DidPostSwapBuffers() override; |
void DidAbortSwapBuffers() override; |
@@ -117,8 +118,38 @@ |
void OnVSync(base::TimeTicks frame_time, |
base::TimeDelta vsync_period) override; |
void SetNeedsAnimate() override; |
+ |
void SetVisible(bool visible); |
+ |
+ enum CompositingTrigger { |
+ DO_NOT_COMPOSITE, |
+ COMPOSITE_IMMEDIATELY, |
+ COMPOSITE_EVENTUALLY, |
+ }; |
+ void PostComposite(CompositingTrigger trigger); |
+ void Composite(CompositingTrigger trigger); |
void CreateOutputSurface(); |
+ |
+ bool WillCompositeThisFrame() const { |
+ return current_composite_task_ && |
+ !current_composite_task_->callback().is_null(); |
+ } |
+ bool DidCompositeThisFrame() const { |
+ return current_composite_task_ && |
+ current_composite_task_->callback().is_null(); |
+ } |
+ bool WillComposite() const { |
+ return WillCompositeThisFrame() || |
+ composite_on_vsync_trigger_ != DO_NOT_COMPOSITE; |
+ } |
+ void CancelComposite() { |
+ DCHECK(WillComposite()); |
+ if (WillCompositeThisFrame()) |
+ current_composite_task_->Cancel(); |
+ current_composite_task_.reset(); |
+ composite_on_vsync_trigger_ = DO_NOT_COMPOSITE; |
+ will_composite_immediately_ = false; |
+ } |
void CreateLayerTreeHost(); |
void OnGpuChannelEstablished(); |
@@ -146,14 +177,38 @@ |
gfx::NativeWindow root_window_; |
+ // Used locally to track whether a call to LTH::Composite() did result in |
+ // a posted SwapBuffers(). |
+ bool did_post_swapbuffers_; |
+ |
+ // Used locally to inhibit ScheduleComposite() during |
+ // UpdateLayerTreeHost(). |
+ bool ignore_schedule_composite_; |
+ |
+ // Whether we need to composite in general because of any invalidation or |
+ // explicit request. |
+ bool needs_composite_; |
+ |
// Whether we need to update animations on the next composite. |
bool needs_animate_; |
+ |
+ // Whether we posted a task and are about to composite. |
+ bool will_composite_immediately_; |
+ |
+ // How we should schedule Composite during the next vsync. |
+ CompositingTrigger composite_on_vsync_trigger_; |
+ |
+ // The Composite operation scheduled for the current vsync interval. |
+ scoped_ptr<base::CancelableClosure> current_composite_task_; |
// The number of SwapBuffer calls that have not returned and ACK'd from |
// the GPU thread. |
unsigned int pending_swapbuffers_; |
size_t num_successive_context_creation_failures_; |
+ |
+ base::TimeDelta vsync_period_; |
+ base::TimeTicks last_vsync_; |
base::OneShotTimer establish_gpu_channel_timeout_; |
@@ -165,7 +220,6 @@ |
gpu::Capabilities gpu_capabilities_; |
- bool needs_begin_frames_; |
base::ObserverList<VSyncObserver, true> observer_list_; |
base::WeakPtrFactory<CompositorImpl> weak_factory_; |