OLD | NEW |
| (Empty) |
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. | |
4 | |
5 #ifndef CC_TREES_THREAD_PROXY_H_ | |
6 #define CC_TREES_THREAD_PROXY_H_ | |
7 | |
8 #include <string> | |
9 | |
10 #include "base/memory/scoped_ptr.h" | |
11 #include "base/memory/weak_ptr.h" | |
12 #include "base/time/time.h" | |
13 #include "cc/animation/animation_events.h" | |
14 #include "cc/base/completion_event.h" | |
15 #include "cc/base/delayed_unique_notifier.h" | |
16 #include "cc/resources/resource_update_controller.h" | |
17 #include "cc/scheduler/commit_earlyout_reason.h" | |
18 #include "cc/scheduler/scheduler.h" | |
19 #include "cc/trees/layer_tree_host_impl.h" | |
20 #include "cc/trees/proxy.h" | |
21 #include "cc/trees/proxy_timing_history.h" | |
22 | |
23 namespace base { | |
24 class SingleThreadTaskRunner; | |
25 } | |
26 | |
27 namespace cc { | |
28 | |
29 class BeginFrameSource; | |
30 class ContextProvider; | |
31 class InputHandlerClient; | |
32 class LayerTreeHost; | |
33 class PrioritizedResourceManager; | |
34 class ResourceUpdateQueue; | |
35 class Scheduler; | |
36 class ScopedThreadProxy; | |
37 | |
38 class CC_EXPORT ThreadProxy : public Proxy, | |
39 NON_EXPORTED_BASE(LayerTreeHostImplClient), | |
40 NON_EXPORTED_BASE(SchedulerClient), | |
41 NON_EXPORTED_BASE(ResourceUpdateControllerClient) { | |
42 public: | |
43 static scoped_ptr<Proxy> Create( | |
44 LayerTreeHost* layer_tree_host, | |
45 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | |
46 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, | |
47 scoped_ptr<BeginFrameSource> external_begin_frame_source); | |
48 | |
49 ~ThreadProxy() override; | |
50 | |
51 struct BeginMainFrameAndCommitState { | |
52 BeginMainFrameAndCommitState(); | |
53 ~BeginMainFrameAndCommitState(); | |
54 | |
55 unsigned int begin_frame_id; | |
56 BeginFrameArgs begin_frame_args; | |
57 scoped_ptr<ScrollAndScaleSet> scroll_info; | |
58 size_t memory_allocation_limit_bytes; | |
59 int memory_allocation_priority_cutoff; | |
60 bool evicted_ui_resources; | |
61 }; | |
62 | |
63 struct MainThreadOnly { | |
64 MainThreadOnly(ThreadProxy* proxy, int layer_tree_host_id); | |
65 ~MainThreadOnly(); | |
66 | |
67 const int layer_tree_host_id; | |
68 | |
69 // Set only when SetNeedsAnimate is called. | |
70 bool animate_requested; | |
71 // Set only when SetNeedsCommit is called. | |
72 bool commit_requested; | |
73 // Set by SetNeedsAnimate, SetNeedsUpdateLayers, and SetNeedsCommit. | |
74 bool commit_request_sent_to_impl_thread; | |
75 | |
76 bool started; | |
77 bool prepare_tiles_pending; | |
78 bool can_cancel_commit; | |
79 bool defer_commits; | |
80 | |
81 RendererCapabilities renderer_capabilities_main_thread_copy; | |
82 | |
83 base::WeakPtrFactory<ThreadProxy> weak_factory; | |
84 }; | |
85 | |
86 // Accessed on the main thread, or when main thread is blocked. | |
87 struct MainThreadOrBlockedMainThread { | |
88 explicit MainThreadOrBlockedMainThread(LayerTreeHost* host); | |
89 ~MainThreadOrBlockedMainThread(); | |
90 | |
91 PrioritizedResourceManager* contents_texture_manager(); | |
92 | |
93 LayerTreeHost* layer_tree_host; | |
94 bool commit_waits_for_activation; | |
95 bool main_thread_inside_commit; | |
96 }; | |
97 | |
98 struct CompositorThreadOnly { | |
99 CompositorThreadOnly( | |
100 ThreadProxy* proxy, | |
101 int layer_tree_host_id, | |
102 RenderingStatsInstrumentation* rendering_stats_instrumentation, | |
103 scoped_ptr<BeginFrameSource> external_begin_frame_source); | |
104 ~CompositorThreadOnly(); | |
105 | |
106 const int layer_tree_host_id; | |
107 | |
108 // Copy of the main thread side contents texture manager for work | |
109 // that needs to be done on the compositor thread. | |
110 PrioritizedResourceManager* contents_texture_manager; | |
111 | |
112 scoped_ptr<Scheduler> scheduler; | |
113 | |
114 // Set when the main thread is waiting on a | |
115 // ScheduledActionSendBeginMainFrame to be issued. | |
116 CompletionEvent* begin_main_frame_sent_completion_event; | |
117 | |
118 // Set when the main thread is waiting on a commit to complete. | |
119 CompletionEvent* commit_completion_event; | |
120 | |
121 // Set when the main thread is waiting on a pending tree activation. | |
122 CompletionEvent* completion_event_for_commit_held_on_tree_activation; | |
123 | |
124 scoped_ptr<ResourceUpdateController> current_resource_update_controller; | |
125 | |
126 // Set when the next draw should post DidCommitAndDrawFrame to the main | |
127 // thread. | |
128 bool next_frame_is_newly_committed_frame; | |
129 | |
130 bool inside_draw; | |
131 | |
132 bool input_throttled_until_commit; | |
133 | |
134 base::TimeTicks animation_time; | |
135 | |
136 // Whether a commit has been completed since the last time animations were | |
137 // ticked. If this happens, we need to animate again. | |
138 bool did_commit_after_animating; | |
139 | |
140 DelayedUniqueNotifier smoothness_priority_expiration_notifier; | |
141 | |
142 ProxyTimingHistory timing_history; | |
143 | |
144 scoped_ptr<BeginFrameSource> external_begin_frame_source; | |
145 | |
146 scoped_ptr<LayerTreeHostImpl> layer_tree_host_impl; | |
147 base::WeakPtrFactory<ThreadProxy> weak_factory; | |
148 }; | |
149 | |
150 const MainThreadOnly& main() const; | |
151 const MainThreadOrBlockedMainThread& blocked_main() const; | |
152 const CompositorThreadOnly& impl() const; | |
153 | |
154 // Proxy implementation | |
155 void FinishAllRendering() override; | |
156 bool IsStarted() const override; | |
157 bool CommitToActiveTree() const override; | |
158 void SetOutputSurface(scoped_ptr<OutputSurface>) override; | |
159 void SetLayerTreeHostClientReady() override; | |
160 void SetVisible(bool visible) override; | |
161 void SetThrottleFrameProduction(bool throttle) override; | |
162 const RendererCapabilities& GetRendererCapabilities() const override; | |
163 void SetNeedsAnimate() override; | |
164 void SetNeedsUpdateLayers() override; | |
165 void SetNeedsCommit() override; | |
166 void SetNeedsRedraw(const gfx::Rect& damage_rect) override; | |
167 void SetNextCommitWaitsForActivation() override; | |
168 void NotifyInputThrottledUntilCommit() override; | |
169 void SetDeferCommits(bool defer_commits) override; | |
170 bool CommitRequested() const override; | |
171 bool BeginMainFrameRequested() const override; | |
172 void MainThreadHasStoppedFlinging() override; | |
173 void Start() override; | |
174 void Stop() override; | |
175 size_t MaxPartialTextureUpdates() const override; | |
176 void ForceSerializeOnSwapBuffers() override; | |
177 bool SupportsImplScrolling() const override; | |
178 void SetDebugState(const LayerTreeDebugState& debug_state) override; | |
179 bool MainFrameWillHappenForTesting() override; | |
180 void SetChildrenNeedBeginFrames(bool children_need_begin_frames) override; | |
181 | |
182 // LayerTreeHostImplClient implementation | |
183 void UpdateRendererCapabilitiesOnImplThread() override; | |
184 void DidLoseOutputSurfaceOnImplThread() override; | |
185 void CommitVSyncParameters(base::TimeTicks timebase, | |
186 base::TimeDelta interval) override; | |
187 void SetEstimatedParentDrawTime(base::TimeDelta draw_time) override; | |
188 void SetMaxSwapsPendingOnImplThread(int max) override; | |
189 void DidSwapBuffersOnImplThread() override; | |
190 void DidSwapBuffersCompleteOnImplThread() override; | |
191 void OnCanDrawStateChanged(bool can_draw) override; | |
192 void NotifyReadyToActivate() override; | |
193 void NotifyReadyToDraw() override; | |
194 // Please call these 3 functions through | |
195 // LayerTreeHostImpl's SetNeedsRedraw(), SetNeedsRedrawRect() and | |
196 // SetNeedsAnimate(). | |
197 void SetNeedsRedrawOnImplThread() override; | |
198 void SetNeedsRedrawRectOnImplThread(const gfx::Rect& dirty_rect) override; | |
199 void SetNeedsAnimateOnImplThread() override; | |
200 void SetNeedsPrepareTilesOnImplThread() override; | |
201 void SetNeedsCommitOnImplThread() override; | |
202 void PostAnimationEventsToMainThreadOnImplThread( | |
203 scoped_ptr<AnimationEventsVector> queue) override; | |
204 bool ReduceContentsTextureMemoryOnImplThread(size_t limit_bytes, | |
205 int priority_cutoff) override; | |
206 bool IsInsideDraw() override; | |
207 void RenewTreePriority() override; | |
208 void PostDelayedAnimationTaskOnImplThread(const base::Closure& task, | |
209 base::TimeDelta delay) override; | |
210 void DidActivateSyncTree() override; | |
211 void DidPrepareTiles() override; | |
212 void DidCompletePageScaleAnimationOnImplThread() override; | |
213 | |
214 // SchedulerClient implementation | |
215 void WillBeginImplFrame(const BeginFrameArgs& args) override; | |
216 void ScheduledActionSendBeginMainFrame() override; | |
217 DrawResult ScheduledActionDrawAndSwapIfPossible() override; | |
218 DrawResult ScheduledActionDrawAndSwapForced() override; | |
219 void ScheduledActionAnimate() override; | |
220 void ScheduledActionCommit() override; | |
221 void ScheduledActionActivateSyncTree() override; | |
222 void ScheduledActionBeginOutputSurfaceCreation() override; | |
223 void ScheduledActionPrepareTiles() override; | |
224 void DidAnticipatedDrawTimeChange(base::TimeTicks time) override; | |
225 base::TimeDelta DrawDurationEstimate() override; | |
226 base::TimeDelta BeginMainFrameToCommitDurationEstimate() override; | |
227 base::TimeDelta CommitToActivateDurationEstimate() override; | |
228 void DidBeginImplFrameDeadline() override; | |
229 void SendBeginFramesToChildren(const BeginFrameArgs& args) override; | |
230 void SendBeginMainFrameNotExpectedSoon() override; | |
231 | |
232 // ResourceUpdateControllerClient implementation | |
233 void ReadyToFinalizeTextureUpdates() override; | |
234 | |
235 protected: | |
236 ThreadProxy( | |
237 LayerTreeHost* layer_tree_host, | |
238 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, | |
239 scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner, | |
240 scoped_ptr<BeginFrameSource> external_begin_frame_source); | |
241 | |
242 private: | |
243 // Called on main thread. | |
244 void SetRendererCapabilitiesMainThreadCopy( | |
245 const RendererCapabilities& capabilities); | |
246 void BeginMainFrame( | |
247 scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state); | |
248 void BeginMainFrameNotExpectedSoon(); | |
249 void DidCommitAndDrawFrame(); | |
250 void DidCompleteSwapBuffers(); | |
251 void SetAnimationEvents(scoped_ptr<AnimationEventsVector> queue); | |
252 void DidLoseOutputSurface(); | |
253 void RequestNewOutputSurface(); | |
254 void DidInitializeOutputSurface(bool success, | |
255 const RendererCapabilities& capabilities); | |
256 void SendCommitRequestToImplThreadIfNeeded(); | |
257 void DidCompletePageScaleAnimation(); | |
258 | |
259 // Called on impl thread. | |
260 struct SchedulerStateRequest; | |
261 | |
262 void StartCommitOnImplThread(CompletionEvent* completion, | |
263 ResourceUpdateQueue* queue); | |
264 void BeginMainFrameAbortedOnImplThread(CommitEarlyOutReason reason); | |
265 void FinishAllRenderingOnImplThread(CompletionEvent* completion); | |
266 void InitializeImplOnImplThread(CompletionEvent* completion); | |
267 void SetLayerTreeHostClientReadyOnImplThread(); | |
268 void SetVisibleOnImplThread(CompletionEvent* completion, bool visible); | |
269 void SetThrottleFrameProductionOnImplThread(bool throttle); | |
270 void HasInitializedOutputSurfaceOnImplThread( | |
271 CompletionEvent* completion, | |
272 bool* has_initialized_output_surface); | |
273 void DeleteContentsTexturesOnImplThread(CompletionEvent* completion); | |
274 void InitializeOutputSurfaceOnImplThread( | |
275 scoped_ptr<OutputSurface> output_surface); | |
276 void FinishGLOnImplThread(CompletionEvent* completion); | |
277 void LayerTreeHostClosedOnImplThread(CompletionEvent* completion); | |
278 DrawResult DrawSwapInternal(bool forced_draw); | |
279 void ForceSerializeOnSwapBuffersOnImplThread(CompletionEvent* completion); | |
280 void MainFrameWillHappenOnImplThreadForTesting(CompletionEvent* completion, | |
281 bool* main_frame_will_happen); | |
282 void SetSwapUsedIncompleteTileOnImplThread(bool used_incomplete_tile); | |
283 void MainThreadHasStoppedFlingingOnImplThread(); | |
284 void SetInputThrottledUntilCommitOnImplThread(bool is_throttled); | |
285 void SetDebugStateOnImplThread(const LayerTreeDebugState& debug_state); | |
286 void SetDeferCommitsOnImplThread(bool defer_commits) const; | |
287 | |
288 LayerTreeHost* layer_tree_host(); | |
289 const LayerTreeHost* layer_tree_host() const; | |
290 | |
291 // Use accessors instead of this variable directly. | |
292 MainThreadOnly main_thread_only_vars_unsafe_; | |
293 MainThreadOnly& main(); | |
294 | |
295 // Use accessors instead of this variable directly. | |
296 MainThreadOrBlockedMainThread main_thread_or_blocked_vars_unsafe_; | |
297 MainThreadOrBlockedMainThread& blocked_main(); | |
298 | |
299 // Use accessors instead of this variable directly. | |
300 CompositorThreadOnly compositor_thread_vars_unsafe_; | |
301 CompositorThreadOnly& impl(); | |
302 | |
303 base::WeakPtr<ThreadProxy> main_thread_weak_ptr_; | |
304 base::WeakPtr<ThreadProxy> impl_thread_weak_ptr_; | |
305 | |
306 DISALLOW_COPY_AND_ASSIGN(ThreadProxy); | |
307 }; | |
308 | |
309 } // namespace cc | |
310 | |
311 #endif // CC_TREES_THREAD_PROXY_H_ | |
OLD | NEW |