OLD | NEW |
| (Empty) |
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 BLIMP_CLIENT_CORE_COMPOSITOR_BLIMP_COMPOSITOR_H_ | |
6 #define BLIMP_CLIENT_CORE_COMPOSITOR_BLIMP_COMPOSITOR_H_ | |
7 | |
8 #include <content/public/renderer/remote_proto_channel.h> | |
9 #include <memory> | |
10 #include <vector> | |
11 | |
12 #include "base/macros.h" | |
13 #include "base/memory/ref_counted.h" | |
14 #include "base/threading/thread_checker.h" | |
15 #include "blimp/client/core/compositor/blimp_compositor_frame_sink_proxy.h" | |
16 #include "blimp/client/public/compositor/compositor_dependencies.h" | |
17 #include "cc/blimp/compositor_state_deserializer.h" | |
18 #include "cc/surfaces/surface_factory_client.h" | |
19 #include "cc/trees/layer_tree_host.h" | |
20 #include "cc/trees/layer_tree_host_client.h" | |
21 #include "cc/trees/layer_tree_settings.h" | |
22 #include "ui/gfx/geometry/size.h" | |
23 #include "ui/gfx/native_widget_types.h" | |
24 | |
25 namespace cc { | |
26 class AnimationHost; | |
27 class InputHandler; | |
28 | |
29 namespace proto { | |
30 class CompositorMessage; | |
31 } // namespace proto | |
32 | |
33 class ContextProvider; | |
34 class CopyOutputRequest; | |
35 class Layer; | |
36 class LayerTreeHostInProcess; | |
37 class SurfaceFactory; | |
38 class SurfaceIdAllocator; | |
39 } // namespace cc | |
40 | |
41 namespace blimp { | |
42 | |
43 namespace client { | |
44 | |
45 class BlimpCompositorDependencies; | |
46 | |
47 // The BlimpCompositorClient provides the BlimpCompositor with the necessary | |
48 // dependencies for cc::LayerTreeHost owned by this compositor and for | |
49 // communicating the compositor and input messages to the corresponding | |
50 // render widget of this compositor on the engine. | |
51 class BlimpCompositorClient { | |
52 public: | |
53 // Should send the compositor messages from the remote client LayerTreeHost of | |
54 // this compositor to the corresponding remote server LayerTreeHost. | |
55 virtual void SendCompositorMessage( | |
56 const cc::proto::CompositorMessage& message) = 0; | |
57 | |
58 protected: | |
59 virtual ~BlimpCompositorClient() {} | |
60 }; | |
61 | |
62 // BlimpCompositor provides the basic framework and setup to host a | |
63 // LayerTreeHost. This class owns the remote client cc::LayerTreeHost, which | |
64 // performs the compositing work for the remote server LayerTreeHost. The server | |
65 // LayerTreeHost for a BlimpCompositor is owned by the | |
66 // content::RenderWidgetCompositor. Thus, each BlimpCompositor is tied to a | |
67 // RenderWidget, identified by a custom |render_widget_id| generated on the | |
68 // engine. The lifetime of this compositor is controlled by its corresponding | |
69 // RenderWidget. | |
70 // This class should only be accessed from the main thread. | |
71 class BlimpCompositor : public cc::LayerTreeHostClient, | |
72 public BlimpCompositorFrameSinkProxy, | |
73 public cc::SurfaceFactoryClient, | |
74 public cc::CompositorStateDeserializerClient { | |
75 public: | |
76 static std::unique_ptr<BlimpCompositor> Create( | |
77 BlimpCompositorDependencies* compositor_dependencies, | |
78 BlimpCompositorClient* client); | |
79 | |
80 ~BlimpCompositor() override; | |
81 | |
82 void SetVisible(bool visible); | |
83 bool IsVisible() const; | |
84 | |
85 // Requests a copy of the compositor frame. | |
86 // Setting |flush_pending_update| to true ensures that if a frame update on | |
87 // the main thread is pending, then it is drawn before copying from the | |
88 // surface. | |
89 void RequestCopyOfOutput(std::unique_ptr<cc::CopyOutputRequest> copy_request, | |
90 bool flush_pending_update); | |
91 | |
92 // Called to forward the compositor message from the remote server | |
93 // LayerTreeHost of the render widget for this compositor. | |
94 // virtual for testing. | |
95 void OnCompositorMessageReceived( | |
96 std::unique_ptr<cc::proto::CompositorMessage> message); | |
97 | |
98 scoped_refptr<cc::Layer> layer() const { return layer_; } | |
99 | |
100 // Returns a reference to the InputHandler used to respond to input events on | |
101 // the compositor thread. | |
102 const base::WeakPtr<cc::InputHandler>& GetInputHandler(); | |
103 | |
104 cc::CompositorStateDeserializer* compositor_state_deserializer_for_testing() { | |
105 return compositor_state_deserializer_.get(); | |
106 } | |
107 | |
108 bool HasPendingFrameUpdateFromEngine() const; | |
109 | |
110 // LayerTreeHostClient implementation. | |
111 void WillBeginMainFrame() override {} | |
112 void DidBeginMainFrame() override {} | |
113 void BeginMainFrame(const cc::BeginFrameArgs& args) override {} | |
114 void BeginMainFrameNotExpectedSoon() override {} | |
115 void UpdateLayerTreeHost() override; | |
116 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta, | |
117 const gfx::Vector2dF& outer_delta, | |
118 const gfx::Vector2dF& elastic_overscroll_delta, | |
119 float page_scale, | |
120 float top_controls_delta) override; | |
121 void RequestNewCompositorFrameSink() override; | |
122 void DidInitializeCompositorFrameSink() override; | |
123 // TODO(khushalsagar): Need to handle context initialization failures. | |
124 void DidFailToInitializeCompositorFrameSink() override {} | |
125 void WillCommit() override {} | |
126 void DidCommit() override {} | |
127 void DidCommitAndDrawFrame() override; | |
128 void DidReceiveCompositorFrameAck() override {} | |
129 void DidCompletePageScaleAnimation() override {} | |
130 | |
131 // CompositorStateDeserializerClient implementation. | |
132 void DidUpdateLocalState() override; | |
133 | |
134 protected: | |
135 BlimpCompositor(BlimpCompositorDependencies* compositor_dependencies, | |
136 BlimpCompositorClient* client); | |
137 | |
138 void Initialize(); | |
139 virtual std::unique_ptr<cc::LayerTreeHostInProcess> CreateLayerTreeHost(); | |
140 | |
141 cc::AnimationHost* animation_host() { return animation_host_.get(); } | |
142 | |
143 private: | |
144 class FrameTrackingSwapPromise; | |
145 | |
146 // BlimpCompositorFrameSinkProxy implementation. | |
147 void BindToProxyClient( | |
148 base::WeakPtr<BlimpCompositorFrameSinkProxyClient> proxy_client) override; | |
149 void SubmitCompositorFrame(cc::CompositorFrame frame) override; | |
150 void UnbindProxyClient() override; | |
151 | |
152 // SurfaceFactoryClient implementation. | |
153 void ReturnResources(const cc::ReturnedResourceArray& resources) override; | |
154 void SetBeginFrameSource(cc::BeginFrameSource* begin_frame_source) override {} | |
155 | |
156 // Called when the a ContextProvider has been created by the | |
157 // CompositorDependencies class. If |host_| is waiting on an | |
158 // CompositorFrameSink this will build one for it. | |
159 void OnContextProvidersCreated( | |
160 const scoped_refptr<cc::ContextProvider>& compositor_context_provider, | |
161 const scoped_refptr<cc::ContextProvider>& worker_context_provider); | |
162 | |
163 // Helper method to get the embedder dependencies. | |
164 CompositorDependencies* GetEmbedderDeps(); | |
165 | |
166 // TODO(khushalsagar): Move all of this to the |DocumentView| or another | |
167 // platform specific class. So we use the DelegatedFrameHostAndroid like the | |
168 // RenderWidgetHostViewAndroid. | |
169 void DestroyDelegatedContent(); | |
170 | |
171 // Helper method to destroy the internal CC LayerTreeHost instance and all its | |
172 // associated state. | |
173 void DestroyLayerTreeHost(); | |
174 | |
175 // Acks a submitted CompositorFrame when it has been processed and another | |
176 // frame should be started. | |
177 void SubmitCompositorFrameAck(); | |
178 | |
179 // Sends an update to the engine if the state on the client was modified and | |
180 // an ack for a previous update sent is not pending. | |
181 void FlushClientState(); | |
182 | |
183 void MakeCopyRequestOnNextSwap( | |
184 std::unique_ptr<cc::CopyOutputRequest> copy_request); | |
185 | |
186 BlimpCompositorClient* client_; | |
187 | |
188 BlimpCompositorDependencies* compositor_dependencies_; | |
189 | |
190 cc::FrameSinkId frame_sink_id_; | |
191 | |
192 std::unique_ptr<cc::AnimationHost> animation_host_; | |
193 std::unique_ptr<cc::LayerTreeHostInProcess> host_; | |
194 | |
195 std::unique_ptr<cc::SurfaceFactory> surface_factory_; | |
196 base::WeakPtr<BlimpCompositorFrameSinkProxyClient> proxy_client_; | |
197 bool bound_to_proxy_; | |
198 | |
199 // Whether or not |host_| has asked for a new CompositorFrameSink. | |
200 bool compositor_frame_sink_request_pending_; | |
201 | |
202 // Data for the current frame. | |
203 cc::LocalFrameId local_frame_id_; | |
204 gfx::Size current_surface_size_; | |
205 | |
206 base::ThreadChecker thread_checker_; | |
207 | |
208 // Surfaces related stuff and layer which holds the delegated content from the | |
209 // compositor. | |
210 std::unique_ptr<cc::SurfaceIdAllocator> surface_id_allocator_; | |
211 scoped_refptr<cc::Layer> layer_; | |
212 | |
213 std::vector<std::unique_ptr<cc::CopyOutputRequest>> | |
214 copy_requests_for_next_swap_; | |
215 | |
216 // Stores a frame update received from the engine, when a threaded | |
217 // LayerTreeHost is used. There can only be a single frame in flight at any | |
218 // point. | |
219 std::unique_ptr<cc::proto::CompositorMessage> pending_frame_update_; | |
220 | |
221 // Used with a threaded LayerTreeHost to deserialize proto updates from the | |
222 // engine into the LayerTree. | |
223 std::unique_ptr<cc::CompositorStateDeserializer> | |
224 compositor_state_deserializer_; | |
225 | |
226 // Set to true if the compositor state on the client was modified on the impl | |
227 // thread and an update needs to be sent to the engine. | |
228 bool client_state_dirty_ = false; | |
229 | |
230 // Set to true if a client state update was sent to the engine and an ack for | |
231 // this update from the engine is pending. | |
232 bool client_state_update_ack_pending_ = false; | |
233 | |
234 base::WeakPtrFactory<BlimpCompositor> weak_ptr_factory_; | |
235 | |
236 DISALLOW_COPY_AND_ASSIGN(BlimpCompositor); | |
237 }; | |
238 | |
239 } // namespace client | |
240 } // namespace blimp | |
241 | |
242 #endif // BLIMP_CLIENT_CORE_COMPOSITOR_BLIMP_COMPOSITOR_H_ | |
OLD | NEW |