khushalsagar | 5d6eb98 | 2015-09-25 22:44:56 | [diff] [blame] | 1 | // Copyright 2015 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_PROXY_IMPL_H_ |
| 6 | #define CC_TREES_PROXY_IMPL_H_ |
| 7 | |
danakj | 60bc3bc | 2016-04-09 00:24:48 | [diff] [blame] | 8 | #include <memory> |
| 9 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 10 | #include "base/macros.h" |
khushalsagar | 12020cd4 | 2016-11-21 09:22:48 | [diff] [blame] | 11 | #include "base/memory/weak_ptr.h" |
khushalsagar | e3c9fa9 | 2015-10-28 02:08:29 | [diff] [blame] | 12 | #include "cc/base/completion_event.h" |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 13 | #include "cc/base/delayed_unique_notifier.h" |
mdjones | 2ee41afd | 2016-10-27 16:50:20 | [diff] [blame] | 14 | #include "cc/input/browser_controls_state.h" |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 15 | #include "cc/scheduler/scheduler.h" |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 16 | #include "cc/trees/layer_tree_host_impl.h" |
khushalsagar | 5d6eb98 | 2015-09-25 22:44:56 | [diff] [blame] | 17 | |
| 18 | namespace cc { |
khushalsagar | e0e4486e | 2017-01-25 03:15:03 | [diff] [blame] | 19 | class LayerTreeHost; |
khushalsagar | 12020cd4 | 2016-11-21 09:22:48 | [diff] [blame] | 20 | class ProxyMain; |
jonross | a2ff4f8 | 2018-02-16 17:27:46 | [diff] [blame] | 21 | class RenderFrameMetadataObserver; |
khushalsagar | e3c9fa9 | 2015-10-28 02:08:29 | [diff] [blame] | 22 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 23 | // This class aggregates all the interactions that the main side of the |
khushalsagar | 12020cd4 | 2016-11-21 09:22:48 | [diff] [blame] | 24 | // compositor needs to have with the impl side. |
| 25 | // The class is created and lives on the impl thread. |
Nico Weber | 43ddd7a3 | 2017-08-15 19:19:27 | [diff] [blame] | 26 | class CC_EXPORT ProxyImpl : public LayerTreeHostImplClient, |
| 27 | public SchedulerClient { |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 28 | public: |
khushalsagar | 12020cd4 | 2016-11-21 09:22:48 | [diff] [blame] | 29 | ProxyImpl(base::WeakPtr<ProxyMain> proxy_main_weak_ptr, |
khushalsagar | e0e4486e | 2017-01-25 03:15:03 | [diff] [blame] | 30 | LayerTreeHost* layer_tree_host, |
enne | 2b0ad68 | 2016-09-21 01:44:47 | [diff] [blame] | 31 | TaskRunnerProvider* task_runner_provider); |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 32 | ~ProxyImpl() override; |
| 33 | |
mdjones | 2ee41afd | 2016-10-27 16:50:20 | [diff] [blame] | 34 | void UpdateBrowserControlsStateOnImpl(BrowserControlsState constraints, |
| 35 | BrowserControlsState current, |
| 36 | bool animate); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame] | 37 | void InitializeLayerTreeFrameSinkOnImpl( |
| 38 | LayerTreeFrameSink* layer_tree_frame_sink, |
samans | 44b6dfc | 2017-04-19 16:50:53 | [diff] [blame] | 39 | base::WeakPtr<ProxyMain> proxy_main_frame_sink_bound_weak_ptr); |
danakj | 94b7e4f | 2016-07-20 01:49:38 | [diff] [blame] | 40 | void InitializeMutatorOnImpl(std::unique_ptr<LayerTreeMutator> mutator); |
| 41 | void MainThreadHasStoppedFlingingOnImpl(); |
| 42 | void SetInputThrottledUntilCommitOnImpl(bool is_throttled); |
| 43 | void SetDeferCommitsOnImpl(bool defer_commits) const; |
| 44 | void SetNeedsRedrawOnImpl(const gfx::Rect& damage_rect); |
| 45 | void SetNeedsCommitOnImpl(); |
sunnyps | ad3235e | 2016-08-09 04:57:52 | [diff] [blame] | 46 | void BeginMainFrameAbortedOnImpl( |
| 47 | CommitEarlyOutReason reason, |
| 48 | base::TimeTicks main_thread_start_time, |
| 49 | std::vector<std::unique_ptr<SwapPromise>> swap_promises); |
danakj | 94b7e4f | 2016-07-20 01:49:38 | [diff] [blame] | 50 | void SetVisibleOnImpl(bool visible); |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame] | 51 | void ReleaseLayerTreeFrameSinkOnImpl(CompletionEvent* completion); |
danakj | 94b7e4f | 2016-07-20 01:49:38 | [diff] [blame] | 52 | void FinishGLOnImpl(CompletionEvent* completion); |
| 53 | void NotifyReadyToCommitOnImpl(CompletionEvent* completion, |
khushalsagar | e0e4486e | 2017-01-25 03:15:03 | [diff] [blame] | 54 | LayerTreeHost* layer_tree_host, |
brianderson | 21aef16 | 2015-11-11 05:12:23 | [diff] [blame] | 55 | base::TimeTicks main_thread_start_time, |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 56 | bool hold_commit_for_activation); |
Khushal | 3e96e66 | 2017-10-30 23:16:50 | [diff] [blame] | 57 | void SetURLForUkm(const GURL& url); |
Khushal | 2f9cdf2 | 2018-01-08 21:47:08 | [diff] [blame] | 58 | void ClearHistoryOnNavigation(); |
jonross | a2ff4f8 | 2018-02-16 17:27:46 | [diff] [blame] | 59 | void SetRenderFrameObserver( |
| 60 | std::unique_ptr<RenderFrameMetadataObserver> observer); |
khushalsagar | 5d6eb98 | 2015-09-25 22:44:56 | [diff] [blame] | 61 | |
sunnyps | 2237c9b | 2016-05-20 22:25:06 | [diff] [blame] | 62 | void MainFrameWillHappenOnImplForTesting(CompletionEvent* completion, |
| 63 | bool* main_frame_will_happen); |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 64 | |
Dan Elphick | 95929fd5 | 2017-06-13 09:15:07 | [diff] [blame] | 65 | void RequestBeginMainFrameNotExpected(bool new_state) override; |
| 66 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 67 | private: |
| 68 | // The members of this struct should be accessed on the impl thread only when |
| 69 | // the main thread is blocked for a commit. |
| 70 | struct BlockedMainCommitOnly { |
| 71 | BlockedMainCommitOnly(); |
| 72 | ~BlockedMainCommitOnly(); |
khushalsagar | e0e4486e | 2017-01-25 03:15:03 | [diff] [blame] | 73 | LayerTreeHost* layer_tree_host; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 74 | }; |
| 75 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 76 | // LayerTreeHostImplClient implementation |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame] | 77 | void DidLoseLayerTreeFrameSinkOnImplThread() override; |
Fady Samuel | c645ffe | 2017-07-24 17:28:20 | [diff] [blame] | 78 | void SetBeginFrameSource(viz::BeginFrameSource* source) override; |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 79 | void DidReceiveCompositorFrameAckOnImplThread() override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 80 | void OnCanDrawStateChanged(bool can_draw) override; |
| 81 | void NotifyReadyToActivate() override; |
| 82 | void NotifyReadyToDraw() override; |
danakj | e41d978a | 2016-09-19 21:09:28 | [diff] [blame] | 83 | // Please call these 2 functions through |
| 84 | // LayerTreeHostImpl's SetNeedsRedraw() and SetNeedsOneBeginImplFrame(). |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 85 | void SetNeedsRedrawOnImplThread() override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 86 | void SetNeedsOneBeginImplFrameOnImplThread() override; |
| 87 | void SetNeedsPrepareTilesOnImplThread() override; |
| 88 | void SetNeedsCommitOnImplThread() override; |
| 89 | void SetVideoNeedsBeginFrames(bool needs_begin_frames) override; |
| 90 | void PostAnimationEventsToMainThreadOnImplThread( |
loyso | c601b7b8 | 2016-11-10 02:56:44 | [diff] [blame] | 91 | std::unique_ptr<MutatorEvents> events) override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 92 | bool IsInsideDraw() override; |
| 93 | void RenewTreePriority() override; |
| 94 | void PostDelayedAnimationTaskOnImplThread(const base::Closure& task, |
| 95 | base::TimeDelta delay) override; |
| 96 | void DidActivateSyncTree() override; |
| 97 | void WillPrepareTiles() override; |
| 98 | void DidPrepareTiles() override; |
| 99 | void DidCompletePageScaleAnimationOnImplThread() override; |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame] | 100 | void OnDrawForLayerTreeFrameSink(bool resourceless_software_draw) override; |
Khushal | 8360fc9 | 2017-07-26 01:53:25 | [diff] [blame] | 101 | void NeedsImplSideInvalidation(bool needs_first_draw_on_activation) override; |
vmpstr | a840c6a | 2017-06-01 21:50:39 | [diff] [blame] | 102 | void NotifyImageDecodeRequestFinished() override; |
Scott Violet | e979c01 | 2017-12-08 00:18:16 | [diff] [blame] | 103 | void DidPresentCompositorFrameOnImplThread( |
Sadrul Habib Chowdhury | 3d4df2e8 | 2018-06-02 05:18:00 | [diff] [blame^] | 104 | uint32_t frame_token, |
| 105 | std::vector<LayerTreeHost::PresentationTimeCallback> callbacks, |
Scott Violet | e979c01 | 2017-12-08 00:18:16 | [diff] [blame] | 106 | base::TimeTicks time, |
| 107 | base::TimeDelta refresh, |
| 108 | uint32_t flags) override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 109 | |
| 110 | // SchedulerClient implementation |
James Wallace-Lee | e71cf58 | 2018-01-29 22:24:23 | [diff] [blame] | 111 | bool WillBeginImplFrame(const viz::BeginFrameArgs& args) override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 112 | void DidFinishImplFrame() override; |
Fady Samuel | c296f5fb | 2017-07-21 04:02:19 | [diff] [blame] | 113 | void DidNotProduceFrame(const viz::BeginFrameAck& ack) override; |
| 114 | void ScheduledActionSendBeginMainFrame( |
| 115 | const viz::BeginFrameArgs& args) override; |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 116 | DrawResult ScheduledActionDrawIfPossible() override; |
| 117 | DrawResult ScheduledActionDrawForced() override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 118 | void ScheduledActionCommit() override; |
| 119 | void ScheduledActionActivateSyncTree() override; |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame] | 120 | void ScheduledActionBeginLayerTreeFrameSinkCreation() override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 121 | void ScheduledActionPrepareTiles() override; |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame] | 122 | void ScheduledActionInvalidateLayerTreeFrameSink() override; |
khushalsagar | ab73d50 | 2017-02-24 02:26:46 | [diff] [blame] | 123 | void ScheduledActionPerformImplSideInvalidation() override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 124 | void SendBeginMainFrameNotExpectedSoon() override; |
delphick | 9db74aa | 2017-05-05 10:20:49 | [diff] [blame] | 125 | void ScheduledActionBeginMainFrameNotExpectedUntil( |
| 126 | base::TimeTicks time) override; |
Xida Chen | d8bb3b2 | 2017-10-26 17:14:52 | [diff] [blame] | 127 | size_t CompositedAnimationsCount() const override; |
| 128 | size_t MainThreadAnimationsCount() const override; |
Stephen McGruer | 1619b42 | 2018-02-20 18:46:55 | [diff] [blame] | 129 | bool CurrentFrameHadRAF() const override; |
| 130 | bool NextFrameHasPendingRAF() const override; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 131 | |
danakj | 9d12442 | 2016-10-14 03:15:08 | [diff] [blame] | 132 | DrawResult DrawInternal(bool forced_draw); |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 133 | |
| 134 | bool IsImplThread() const; |
| 135 | bool IsMainThreadBlocked() const; |
khushalsagar | 12020cd4 | 2016-11-21 09:22:48 | [diff] [blame] | 136 | base::SingleThreadTaskRunner* MainThreadTaskRunner(); |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 137 | |
| 138 | const int layer_tree_host_id_; |
| 139 | |
danakj | 60bc3bc | 2016-04-09 00:24:48 | [diff] [blame] | 140 | std::unique_ptr<Scheduler> scheduler_; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 141 | |
| 142 | // Set when the main thread is waiting on a pending tree activation. |
sunnyps | 2237c9b | 2016-05-20 22:25:06 | [diff] [blame] | 143 | bool commit_completion_waits_for_activation_; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 144 | |
sunnyps | 2237c9b | 2016-05-20 22:25:06 | [diff] [blame] | 145 | // Set when the main thread is waiting on a commit to complete. |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 146 | CompletionEvent* commit_completion_event_; |
| 147 | |
sunnyps | 2237c9b | 2016-05-20 22:25:06 | [diff] [blame] | 148 | // Set when the main thread is waiting for activation to complete. |
| 149 | CompletionEvent* activation_completion_event_; |
| 150 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 151 | // Set when the next draw should post DidCommitAndDrawFrame to the main |
| 152 | // thread. |
| 153 | bool next_frame_is_newly_committed_frame_; |
| 154 | |
| 155 | bool inside_draw_; |
| 156 | bool input_throttled_until_commit_; |
| 157 | |
| 158 | TaskRunnerProvider* task_runner_provider_; |
| 159 | |
| 160 | DelayedUniqueNotifier smoothness_priority_expiration_notifier_; |
| 161 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 162 | RenderingStatsInstrumentation* rendering_stats_instrumentation_; |
| 163 | |
Walter Korman | aa326e4 | 2017-08-22 23:04:43 | [diff] [blame] | 164 | std::unique_ptr<LayerTreeHostImpl> host_impl_; |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 165 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 166 | // Use accessors instead of this variable directly. |
| 167 | BlockedMainCommitOnly main_thread_blocked_commit_vars_unsafe_; |
| 168 | BlockedMainCommitOnly& blocked_main_commit(); |
| 169 | |
khushalsagar | 12020cd4 | 2016-11-21 09:22:48 | [diff] [blame] | 170 | // Used to post tasks to ProxyMain on the main thread. |
| 171 | base::WeakPtr<ProxyMain> proxy_main_weak_ptr_; |
| 172 | |
danakj | c7afae5 | 2017-06-20 21:12:41 | [diff] [blame] | 173 | // A weak pointer to ProxyMain that is invalidated when LayerTreeFrameSink is |
samans | 44b6dfc | 2017-04-19 16:50:53 | [diff] [blame] | 174 | // released. |
| 175 | base::WeakPtr<ProxyMain> proxy_main_frame_sink_bound_weak_ptr_; |
| 176 | |
khushalsagar | 0a226af | 2015-12-09 10:30:20 | [diff] [blame] | 177 | DISALLOW_COPY_AND_ASSIGN(ProxyImpl); |
khushalsagar | 5d6eb98 | 2015-09-25 22:44:56 | [diff] [blame] | 178 | }; |
| 179 | |
| 180 | } // namespace cc |
| 181 | |
| 182 | #endif // CC_TREES_PROXY_IMPL_H_ |