1 // Copyright 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef CC_TREES_SINGLE_THREAD_PROXY_H_
6 #define CC_TREES_SINGLE_THREAD_PROXY_H_
10 #include "base/time/time.h"
11 #include "cc/animation/animation_events.h"
12 #include "cc/output/begin_frame_args.h"
13 #include "cc/scheduler/scheduler.h"
14 #include "cc/trees/layer_tree_host_impl.h"
15 #include "cc/trees/proxy.h"
16 #include "cc/trees/proxy_timing_history.h"
20 class ContextProvider;
22 class LayerTreeHostSingleThreadClient;
24 class CC_EXPORT SingleThreadProxy : public Proxy,
25 NON_EXPORTED_BASE(LayerTreeHostImplClient),
28 static scoped_ptr<Proxy> Create(
29 LayerTreeHost* layer_tree_host,
30 LayerTreeHostSingleThreadClient* client,
31 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner);
32 virtual ~SingleThreadProxy();
34 // Proxy implementation
35 virtual void FinishAllRendering() OVERRIDE;
36 virtual bool IsStarted() const OVERRIDE;
37 virtual void SetOutputSurface(scoped_ptr<OutputSurface>) OVERRIDE;
38 virtual void SetLayerTreeHostClientReady() OVERRIDE;
39 virtual void SetVisible(bool visible) OVERRIDE;
40 virtual const RendererCapabilities& GetRendererCapabilities() const OVERRIDE;
41 virtual void SetNeedsAnimate() OVERRIDE;
42 virtual void SetNeedsUpdateLayers() OVERRIDE;
43 virtual void SetNeedsCommit() OVERRIDE;
44 virtual void SetNeedsRedraw(const gfx::Rect& damage_rect) OVERRIDE;
45 virtual void SetNextCommitWaitsForActivation() OVERRIDE;
46 virtual void NotifyInputThrottledUntilCommit() OVERRIDE {}
47 virtual void SetDeferCommits(bool defer_commits) OVERRIDE;
48 virtual bool CommitRequested() const OVERRIDE;
49 virtual bool BeginMainFrameRequested() const OVERRIDE;
50 virtual void MainThreadHasStoppedFlinging() OVERRIDE {}
51 virtual void Start() OVERRIDE;
52 virtual void Stop() OVERRIDE;
53 virtual size_t MaxPartialTextureUpdates() const OVERRIDE;
54 virtual void ForceSerializeOnSwapBuffers() OVERRIDE;
55 virtual bool SupportsImplScrolling() const OVERRIDE;
56 virtual void AsValueInto(base::debug::TracedValue* state) const OVERRIDE;
57 virtual bool MainFrameWillHappenForTesting() OVERRIDE;
59 // SchedulerClient implementation
60 virtual void SetNeedsBeginFrame(bool enable) OVERRIDE;
61 virtual void WillBeginImplFrame(const BeginFrameArgs& args) OVERRIDE;
62 virtual void ScheduledActionSendBeginMainFrame() OVERRIDE;
63 virtual DrawResult ScheduledActionDrawAndSwapIfPossible() OVERRIDE;
64 virtual DrawResult ScheduledActionDrawAndSwapForced() OVERRIDE;
65 virtual void ScheduledActionCommit() OVERRIDE;
66 virtual void ScheduledActionAnimate() OVERRIDE;
67 virtual void ScheduledActionUpdateVisibleTiles() OVERRIDE;
68 virtual void ScheduledActionActivateSyncTree() OVERRIDE;
69 virtual void ScheduledActionBeginOutputSurfaceCreation() OVERRIDE;
70 virtual void ScheduledActionManageTiles() OVERRIDE;
71 virtual void DidAnticipatedDrawTimeChange(base::TimeTicks time) OVERRIDE;
72 virtual base::TimeDelta DrawDurationEstimate() OVERRIDE;
73 virtual base::TimeDelta BeginMainFrameToCommitDurationEstimate() OVERRIDE;
74 virtual base::TimeDelta CommitToActivateDurationEstimate() OVERRIDE;
75 virtual void DidBeginImplFrameDeadline() OVERRIDE;
77 // LayerTreeHostImplClient implementation
78 virtual void UpdateRendererCapabilitiesOnImplThread() OVERRIDE;
79 virtual void DidLoseOutputSurfaceOnImplThread() OVERRIDE;
80 virtual void CommitVSyncParameters(base::TimeTicks timebase,
81 base::TimeDelta interval) OVERRIDE {}
82 virtual void SetEstimatedParentDrawTime(base::TimeDelta draw_time) OVERRIDE {}
83 virtual void SetMaxSwapsPendingOnImplThread(int max) OVERRIDE {}
84 virtual void DidSwapBuffersOnImplThread() OVERRIDE;
85 virtual void DidSwapBuffersCompleteOnImplThread() OVERRIDE;
86 virtual void BeginFrame(const BeginFrameArgs& args) OVERRIDE;
87 virtual void OnCanDrawStateChanged(bool can_draw) OVERRIDE;
88 virtual void NotifyReadyToActivate() OVERRIDE;
89 virtual void SetNeedsRedrawOnImplThread() OVERRIDE;
90 virtual void SetNeedsRedrawRectOnImplThread(
91 const gfx::Rect& dirty_rect) OVERRIDE;
92 virtual void SetNeedsAnimateOnImplThread() OVERRIDE;
93 virtual void SetNeedsManageTilesOnImplThread() OVERRIDE;
94 virtual void DidInitializeVisibleTileOnImplThread() OVERRIDE;
95 virtual void SetNeedsCommitOnImplThread() OVERRIDE;
96 virtual void PostAnimationEventsToMainThreadOnImplThread(
97 scoped_ptr<AnimationEventsVector> events) OVERRIDE;
98 virtual bool ReduceContentsTextureMemoryOnImplThread(
100 int priority_cutoff) OVERRIDE;
101 virtual bool IsInsideDraw() OVERRIDE;
102 virtual void RenewTreePriority() OVERRIDE {}
103 virtual void PostDelayedScrollbarFadeOnImplThread(
104 const base::Closure& start_fade,
105 base::TimeDelta delay) OVERRIDE {}
106 virtual void DidActivateSyncTree() OVERRIDE {}
107 virtual void DidManageTiles() OVERRIDE;
108 virtual void SetDebugState(const LayerTreeDebugState& debug_state) OVERRIDE {}
110 void RequestNewOutputSurface();
112 // Called by the legacy path where RenderWidget does the scheduling.
113 void CompositeImmediately(base::TimeTicks frame_begin_time);
117 LayerTreeHost* layer_tree_host,
118 LayerTreeHostSingleThreadClient* client,
119 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner);
121 void BeginMainFrame();
122 void BeginMainFrameAbortedOnImplThread();
123 void DoCommit(const BeginFrameArgs& begin_frame_args);
124 DrawResult DoComposite(base::TimeTicks frame_begin_time,
125 LayerTreeHostImpl::FrameData* frame);
127 void DidCommitAndDrawFrame();
129 bool ShouldComposite() const;
130 void UpdateBackgroundAnimateTicking();
132 // Accessed on main thread only.
133 LayerTreeHost* layer_tree_host_;
134 LayerTreeHostSingleThreadClient* client_;
136 // Used on the Thread, but checked on main thread during
137 // initialization/shutdown.
138 scoped_ptr<LayerTreeHostImpl> layer_tree_host_impl_;
139 RendererCapabilities renderer_capabilities_for_main_thread_;
141 // Accessed from both threads.
142 scoped_ptr<Scheduler> scheduler_on_impl_thread_;
143 ProxyTimingHistory timing_history_;
145 bool next_frame_is_newly_committed_frame_;
149 bool commit_was_deferred_;
150 bool commit_requested_;
152 base::WeakPtrFactory<SingleThreadProxy> weak_factory_;
154 DISALLOW_COPY_AND_ASSIGN(SingleThreadProxy);
157 // For use in the single-threaded case. In debug builds, it pretends that the
158 // code is running on the impl thread to satisfy assertion checks.
159 class DebugScopedSetImplThread {
161 explicit DebugScopedSetImplThread(Proxy* proxy) : proxy_(proxy) {
163 previous_value_ = proxy_->impl_thread_is_overridden_;
164 proxy_->SetCurrentThreadIsImplThread(true);
167 ~DebugScopedSetImplThread() {
169 proxy_->SetCurrentThreadIsImplThread(previous_value_);
174 bool previous_value_;
177 DISALLOW_COPY_AND_ASSIGN(DebugScopedSetImplThread);
180 // For use in the single-threaded case. In debug builds, it pretends that the
181 // code is running on the main thread to satisfy assertion checks.
182 class DebugScopedSetMainThread {
184 explicit DebugScopedSetMainThread(Proxy* proxy) : proxy_(proxy) {
186 previous_value_ = proxy_->impl_thread_is_overridden_;
187 proxy_->SetCurrentThreadIsImplThread(false);
190 ~DebugScopedSetMainThread() {
192 proxy_->SetCurrentThreadIsImplThread(previous_value_);
197 bool previous_value_;
200 DISALLOW_COPY_AND_ASSIGN(DebugScopedSetMainThread);
203 // For use in the single-threaded case. In debug builds, it pretends that the
204 // code is running on the impl thread and that the main thread is blocked to
205 // satisfy assertion checks
206 class DebugScopedSetImplThreadAndMainThreadBlocked {
208 explicit DebugScopedSetImplThreadAndMainThreadBlocked(Proxy* proxy)
209 : impl_thread_(proxy), main_thread_blocked_(proxy) {}
212 DebugScopedSetImplThread impl_thread_;
213 DebugScopedSetMainThreadBlocked main_thread_blocked_;
215 DISALLOW_COPY_AND_ASSIGN(DebugScopedSetImplThreadAndMainThreadBlocked);
220 #endif // CC_TREES_SINGLE_THREAD_PROXY_H_