blob: 312278e5d217726dc9e4cc543a8eea4530862642 [file] [log] [blame]
khushalsagar5d6eb982015-09-25 22:44:561// 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
danakj60bc3bc2016-04-09 00:24:488#include <memory>
9
khushalsagar0a226af2015-12-09 10:30:2010#include "base/macros.h"
khushalsagar12020cd42016-11-21 09:22:4811#include "base/memory/weak_ptr.h"
khushalsagare3c9fa92015-10-28 02:08:2912#include "cc/base/completion_event.h"
khushalsagar0a226af2015-12-09 10:30:2013#include "cc/base/delayed_unique_notifier.h"
mdjones2ee41afd2016-10-27 16:50:2014#include "cc/input/browser_controls_state.h"
khushalsagar0a226af2015-12-09 10:30:2015#include "cc/scheduler/scheduler.h"
khushalsagar0a226af2015-12-09 10:30:2016#include "cc/trees/layer_tree_host_impl.h"
khushalsagar5d6eb982015-09-25 22:44:5617
18namespace cc {
khushalsagare0e4486e2017-01-25 03:15:0319class LayerTreeHost;
khushalsagar12020cd42016-11-21 09:22:4820class ProxyMain;
jonrossa2ff4f82018-02-16 17:27:4621class RenderFrameMetadataObserver;
khushalsagare3c9fa92015-10-28 02:08:2922
khushalsagar0a226af2015-12-09 10:30:2023// This class aggregates all the interactions that the main side of the
khushalsagar12020cd42016-11-21 09:22:4824// compositor needs to have with the impl side.
25// The class is created and lives on the impl thread.
Nico Weber43ddd7a32017-08-15 19:19:2726class CC_EXPORT ProxyImpl : public LayerTreeHostImplClient,
27 public SchedulerClient {
khushalsagar0a226af2015-12-09 10:30:2028 public:
khushalsagar12020cd42016-11-21 09:22:4829 ProxyImpl(base::WeakPtr<ProxyMain> proxy_main_weak_ptr,
khushalsagare0e4486e2017-01-25 03:15:0330 LayerTreeHost* layer_tree_host,
enne2b0ad682016-09-21 01:44:4731 TaskRunnerProvider* task_runner_provider);
khushalsagar0a226af2015-12-09 10:30:2032 ~ProxyImpl() override;
33
mdjones2ee41afd2016-10-27 16:50:2034 void UpdateBrowserControlsStateOnImpl(BrowserControlsState constraints,
35 BrowserControlsState current,
36 bool animate);
danakjc7afae52017-06-20 21:12:4137 void InitializeLayerTreeFrameSinkOnImpl(
38 LayerTreeFrameSink* layer_tree_frame_sink,
samans44b6dfc2017-04-19 16:50:5339 base::WeakPtr<ProxyMain> proxy_main_frame_sink_bound_weak_ptr);
danakj94b7e4f2016-07-20 01:49:3840 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();
sunnypsad3235e2016-08-09 04:57:5246 void BeginMainFrameAbortedOnImpl(
47 CommitEarlyOutReason reason,
48 base::TimeTicks main_thread_start_time,
49 std::vector<std::unique_ptr<SwapPromise>> swap_promises);
danakj94b7e4f2016-07-20 01:49:3850 void SetVisibleOnImpl(bool visible);
danakjc7afae52017-06-20 21:12:4151 void ReleaseLayerTreeFrameSinkOnImpl(CompletionEvent* completion);
danakj94b7e4f2016-07-20 01:49:3852 void FinishGLOnImpl(CompletionEvent* completion);
53 void NotifyReadyToCommitOnImpl(CompletionEvent* completion,
khushalsagare0e4486e2017-01-25 03:15:0354 LayerTreeHost* layer_tree_host,
brianderson21aef162015-11-11 05:12:2355 base::TimeTicks main_thread_start_time,
khushalsagar0a226af2015-12-09 10:30:2056 bool hold_commit_for_activation);
Khushal3e96e662017-10-30 23:16:5057 void SetURLForUkm(const GURL& url);
Khushal2f9cdf22018-01-08 21:47:0858 void ClearHistoryOnNavigation();
jonrossa2ff4f82018-02-16 17:27:4659 void SetRenderFrameObserver(
60 std::unique_ptr<RenderFrameMetadataObserver> observer);
khushalsagar5d6eb982015-09-25 22:44:5661
sunnyps2237c9b2016-05-20 22:25:0662 void MainFrameWillHappenOnImplForTesting(CompletionEvent* completion,
63 bool* main_frame_will_happen);
khushalsagar0a226af2015-12-09 10:30:2064
Dan Elphick95929fd52017-06-13 09:15:0765 void RequestBeginMainFrameNotExpected(bool new_state) override;
66
khushalsagar0a226af2015-12-09 10:30:2067 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();
khushalsagare0e4486e2017-01-25 03:15:0373 LayerTreeHost* layer_tree_host;
khushalsagar0a226af2015-12-09 10:30:2074 };
75
khushalsagar0a226af2015-12-09 10:30:2076 // LayerTreeHostImplClient implementation
danakjc7afae52017-06-20 21:12:4177 void DidLoseLayerTreeFrameSinkOnImplThread() override;
Fady Samuelc645ffe2017-07-24 17:28:2078 void SetBeginFrameSource(viz::BeginFrameSource* source) override;
danakj9d124422016-10-14 03:15:0879 void DidReceiveCompositorFrameAckOnImplThread() override;
khushalsagar0a226af2015-12-09 10:30:2080 void OnCanDrawStateChanged(bool can_draw) override;
81 void NotifyReadyToActivate() override;
82 void NotifyReadyToDraw() override;
danakje41d978a2016-09-19 21:09:2883 // Please call these 2 functions through
84 // LayerTreeHostImpl's SetNeedsRedraw() and SetNeedsOneBeginImplFrame().
khushalsagar0a226af2015-12-09 10:30:2085 void SetNeedsRedrawOnImplThread() override;
khushalsagar0a226af2015-12-09 10:30:2086 void SetNeedsOneBeginImplFrameOnImplThread() override;
87 void SetNeedsPrepareTilesOnImplThread() override;
88 void SetNeedsCommitOnImplThread() override;
89 void SetVideoNeedsBeginFrames(bool needs_begin_frames) override;
90 void PostAnimationEventsToMainThreadOnImplThread(
loysoc601b7b82016-11-10 02:56:4491 std::unique_ptr<MutatorEvents> events) override;
khushalsagar0a226af2015-12-09 10:30:2092 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;
danakjc7afae52017-06-20 21:12:41100 void OnDrawForLayerTreeFrameSink(bool resourceless_software_draw) override;
Khushal8360fc92017-07-26 01:53:25101 void NeedsImplSideInvalidation(bool needs_first_draw_on_activation) override;
vmpstra840c6a2017-06-01 21:50:39102 void NotifyImageDecodeRequestFinished() override;
Scott Violete979c012017-12-08 00:18:16103 void DidPresentCompositorFrameOnImplThread(
Sadrul Habib Chowdhury3d4df2e82018-06-02 05:18:00104 uint32_t frame_token,
105 std::vector<LayerTreeHost::PresentationTimeCallback> callbacks,
Scott Violete979c012017-12-08 00:18:16106 base::TimeTicks time,
107 base::TimeDelta refresh,
108 uint32_t flags) override;
khushalsagar0a226af2015-12-09 10:30:20109
110 // SchedulerClient implementation
James Wallace-Leee71cf582018-01-29 22:24:23111 bool WillBeginImplFrame(const viz::BeginFrameArgs& args) override;
khushalsagar0a226af2015-12-09 10:30:20112 void DidFinishImplFrame() override;
Fady Samuelc296f5fb2017-07-21 04:02:19113 void DidNotProduceFrame(const viz::BeginFrameAck& ack) override;
114 void ScheduledActionSendBeginMainFrame(
115 const viz::BeginFrameArgs& args) override;
danakj9d124422016-10-14 03:15:08116 DrawResult ScheduledActionDrawIfPossible() override;
117 DrawResult ScheduledActionDrawForced() override;
khushalsagar0a226af2015-12-09 10:30:20118 void ScheduledActionCommit() override;
119 void ScheduledActionActivateSyncTree() override;
danakjc7afae52017-06-20 21:12:41120 void ScheduledActionBeginLayerTreeFrameSinkCreation() override;
khushalsagar0a226af2015-12-09 10:30:20121 void ScheduledActionPrepareTiles() override;
danakjc7afae52017-06-20 21:12:41122 void ScheduledActionInvalidateLayerTreeFrameSink() override;
khushalsagarab73d502017-02-24 02:26:46123 void ScheduledActionPerformImplSideInvalidation() override;
khushalsagar0a226af2015-12-09 10:30:20124 void SendBeginMainFrameNotExpectedSoon() override;
delphick9db74aa2017-05-05 10:20:49125 void ScheduledActionBeginMainFrameNotExpectedUntil(
126 base::TimeTicks time) override;
Xida Chend8bb3b22017-10-26 17:14:52127 size_t CompositedAnimationsCount() const override;
128 size_t MainThreadAnimationsCount() const override;
Stephen McGruer1619b422018-02-20 18:46:55129 bool CurrentFrameHadRAF() const override;
130 bool NextFrameHasPendingRAF() const override;
khushalsagar0a226af2015-12-09 10:30:20131
danakj9d124422016-10-14 03:15:08132 DrawResult DrawInternal(bool forced_draw);
khushalsagar0a226af2015-12-09 10:30:20133
134 bool IsImplThread() const;
135 bool IsMainThreadBlocked() const;
khushalsagar12020cd42016-11-21 09:22:48136 base::SingleThreadTaskRunner* MainThreadTaskRunner();
khushalsagar0a226af2015-12-09 10:30:20137
138 const int layer_tree_host_id_;
139
danakj60bc3bc2016-04-09 00:24:48140 std::unique_ptr<Scheduler> scheduler_;
khushalsagar0a226af2015-12-09 10:30:20141
142 // Set when the main thread is waiting on a pending tree activation.
sunnyps2237c9b2016-05-20 22:25:06143 bool commit_completion_waits_for_activation_;
khushalsagar0a226af2015-12-09 10:30:20144
sunnyps2237c9b2016-05-20 22:25:06145 // Set when the main thread is waiting on a commit to complete.
khushalsagar0a226af2015-12-09 10:30:20146 CompletionEvent* commit_completion_event_;
147
sunnyps2237c9b2016-05-20 22:25:06148 // Set when the main thread is waiting for activation to complete.
149 CompletionEvent* activation_completion_event_;
150
khushalsagar0a226af2015-12-09 10:30:20151 // 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
khushalsagar0a226af2015-12-09 10:30:20162 RenderingStatsInstrumentation* rendering_stats_instrumentation_;
163
Walter Kormanaa326e42017-08-22 23:04:43164 std::unique_ptr<LayerTreeHostImpl> host_impl_;
khushalsagar0a226af2015-12-09 10:30:20165
khushalsagar0a226af2015-12-09 10:30:20166 // Use accessors instead of this variable directly.
167 BlockedMainCommitOnly main_thread_blocked_commit_vars_unsafe_;
168 BlockedMainCommitOnly& blocked_main_commit();
169
khushalsagar12020cd42016-11-21 09:22:48170 // Used to post tasks to ProxyMain on the main thread.
171 base::WeakPtr<ProxyMain> proxy_main_weak_ptr_;
172
danakjc7afae52017-06-20 21:12:41173 // A weak pointer to ProxyMain that is invalidated when LayerTreeFrameSink is
samans44b6dfc2017-04-19 16:50:53174 // released.
175 base::WeakPtr<ProxyMain> proxy_main_frame_sink_bound_weak_ptr_;
176
khushalsagar0a226af2015-12-09 10:30:20177 DISALLOW_COPY_AND_ASSIGN(ProxyImpl);
khushalsagar5d6eb982015-09-25 22:44:56178};
179
180} // namespace cc
181
182#endif // CC_TREES_PROXY_IMPL_H_