| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CC_TREES_REMOTE_CHANNEL_IMPL_H_ | 5 #ifndef CC_TREES_REMOTE_CHANNEL_IMPL_H_ |
| 6 #define CC_TREES_REMOTE_CHANNEL_IMPL_H_ | 6 #define CC_TREES_REMOTE_CHANNEL_IMPL_H_ |
| 7 | 7 |
| 8 #include "base/macros.h" | 8 #include "base/macros.h" |
| 9 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
| 10 #include "cc/base/cc_export.h" | 10 #include "cc/base/cc_export.h" |
| 11 #include "cc/base/completion_event.h" | 11 #include "cc/base/completion_event.h" |
| 12 #include "cc/proto/compositor_message_to_impl.pb.h" | 12 #include "cc/proto/compositor_message_to_impl.pb.h" |
| 13 #include "cc/trees/channel_impl.h" | 13 #include "cc/trees/channel_impl.h" |
| 14 #include "cc/trees/proxy.h" | 14 #include "cc/trees/proxy.h" |
| 15 #include "cc/trees/proxy_impl.h" | 15 #include "cc/trees/proxy_impl.h" |
| 16 #include "cc/trees/remote_proto_channel.h" | 16 #include "cc/trees/remote_proto_channel.h" |
| 17 | 17 |
| 18 namespace cc { | 18 namespace cc { |
| 19 class LayerTreeHost; | 19 class LayerTreeHostInProcess; |
| 20 | 20 |
| 21 namespace proto { | 21 namespace proto { |
| 22 class CompositorMessage; | 22 class CompositorMessage; |
| 23 class CompositorMessageToImpl; | 23 class CompositorMessageToImpl; |
| 24 class CompositorMessageToMain; | 24 class CompositorMessageToMain; |
| 25 } | 25 } |
| 26 | 26 |
| 27 // The Proxy and ChannelImpl implementation for the remote compositor. | 27 // The Proxy and ChannelImpl implementation for the remote compositor. |
| 28 // The object life cycle and communication across threads is as follows: | 28 // The object life cycle and communication across threads is as follows: |
| 29 // | 29 // |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 // the impl thread since: | 63 // the impl thread since: |
| 64 // 1) The only impl threaded callers of RemoteChannelImpl is the | 64 // 1) The only impl threaded callers of RemoteChannelImpl is the |
| 65 // RemoteChannelImpl itself and ProxyImpl which is created and owned by the | 65 // RemoteChannelImpl itself and ProxyImpl which is created and owned by the |
| 66 // RemoteChannelImpl. | 66 // RemoteChannelImpl. |
| 67 // 2) The RemoteChannelImpl blocks the main thread in its dtor to wait for the | 67 // 2) The RemoteChannelImpl blocks the main thread in its dtor to wait for the |
| 68 // impl-thread teardown to complete, which ensures that any tasks queued to call | 68 // impl-thread teardown to complete, which ensures that any tasks queued to call |
| 69 // it on the impl thread are run before it is destroyed on the main thread. | 69 // it on the impl thread are run before it is destroyed on the main thread. |
| 70 // | 70 // |
| 71 // The RemoteChannelImpl receives and processes messages from the remote server | 71 // The RemoteChannelImpl receives and processes messages from the remote server |
| 72 // compositor on the main thread. The requests from ProxyImpl are received on | 72 // compositor on the main thread. The requests from ProxyImpl are received on |
| 73 // the impl thread which may be directed to the LayerTreeHost on the client | 73 // the impl thread which may be directed to the LayerTreeHostInProcesson the |
| 74 // (for instance output surface requests) or sent to the LayerTreeHost on the | 74 // client (for instance output surface requests) or sent to the |
| 75 // server. The messages to the server are created on the impl thread and sent | 75 // LayerTreeHostInProcess on the server. The messages to the server are created |
| 76 // using the RemoteProtoChannel on the main thread. | 76 // on the impl thread and sent using the RemoteProtoChannel on the main thread. |
| 77 class CC_EXPORT RemoteChannelImpl : public ChannelImpl, | 77 class CC_EXPORT RemoteChannelImpl : public ChannelImpl, |
| 78 public RemoteProtoChannel::ProtoReceiver, | 78 public RemoteProtoChannel::ProtoReceiver, |
| 79 public Proxy { | 79 public Proxy { |
| 80 public: | 80 public: |
| 81 RemoteChannelImpl(LayerTreeHost* layer_tree_host, | 81 RemoteChannelImpl(LayerTreeHostInProcess* layer_tree_host, |
| 82 RemoteProtoChannel* remote_proto_channel, | 82 RemoteProtoChannel* remote_proto_channel, |
| 83 TaskRunnerProvider* task_runner_provider); | 83 TaskRunnerProvider* task_runner_provider); |
| 84 ~RemoteChannelImpl() override; | 84 ~RemoteChannelImpl() override; |
| 85 | 85 |
| 86 // virtual for testing. | 86 // virtual for testing. |
| 87 virtual std::unique_ptr<ProxyImpl> CreateProxyImpl( | 87 virtual std::unique_ptr<ProxyImpl> CreateProxyImpl( |
| 88 ChannelImpl* channel_impl, | 88 ChannelImpl* channel_impl, |
| 89 LayerTreeHost* layer_tree_host, | 89 LayerTreeHostInProcess* layer_tree_host, |
| 90 TaskRunnerProvider* task_runner_provider, | 90 TaskRunnerProvider* task_runner_provider, |
| 91 std::unique_ptr<BeginFrameSource> external_begin_frame_source); | 91 std::unique_ptr<BeginFrameSource> external_begin_frame_source); |
| 92 | 92 |
| 93 private: | 93 private: |
| 94 struct MainThreadOnly { | 94 struct MainThreadOnly { |
| 95 LayerTreeHost* layer_tree_host; | 95 LayerTreeHostInProcess* layer_tree_host; |
| 96 RemoteProtoChannel* remote_proto_channel; | 96 RemoteProtoChannel* remote_proto_channel; |
| 97 | 97 |
| 98 bool started; | 98 bool started; |
| 99 | 99 |
| 100 // This is set to true if we lost the output surface and can not push any | 100 // This is set to true if we lost the output surface and can not push any |
| 101 // commits to the impl thread. | 101 // commits to the impl thread. |
| 102 bool waiting_for_output_surface_initialization; | 102 bool waiting_for_output_surface_initialization; |
| 103 | 103 |
| 104 // The queue of messages received from the server. The messages are added to | 104 // The queue of messages received from the server. The messages are added to |
| 105 // this queue if we are waiting for a new output surface to be initialized. | 105 // this queue if we are waiting for a new output surface to be initialized. |
| 106 std::queue<proto::CompositorMessageToImpl> pending_messages; | 106 std::queue<proto::CompositorMessageToImpl> pending_messages; |
| 107 | 107 |
| 108 base::WeakPtrFactory<RemoteChannelImpl> remote_channel_weak_factory; | 108 base::WeakPtrFactory<RemoteChannelImpl> remote_channel_weak_factory; |
| 109 | 109 |
| 110 MainThreadOnly(RemoteChannelImpl*, | 110 MainThreadOnly(RemoteChannelImpl*, |
| 111 LayerTreeHost* layer_tree_host, | 111 LayerTreeHostInProcess* layer_tree_host, |
| 112 RemoteProtoChannel* remote_proto_channel); | 112 RemoteProtoChannel* remote_proto_channel); |
| 113 ~MainThreadOnly(); | 113 ~MainThreadOnly(); |
| 114 }; | 114 }; |
| 115 | 115 |
| 116 struct CompositorThreadOnly { | 116 struct CompositorThreadOnly { |
| 117 std::unique_ptr<ProxyImpl> proxy_impl; | 117 std::unique_ptr<ProxyImpl> proxy_impl; |
| 118 std::unique_ptr<base::WeakPtrFactory<ProxyImpl>> proxy_impl_weak_factory; | 118 std::unique_ptr<base::WeakPtrFactory<ProxyImpl>> proxy_impl_weak_factory; |
| 119 base::WeakPtr<RemoteChannelImpl> remote_channel_weak_ptr; | 119 base::WeakPtr<RemoteChannelImpl> remote_channel_weak_ptr; |
| 120 | 120 |
| 121 CompositorThreadOnly( | 121 CompositorThreadOnly( |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 173 void HandleProto(const proto::CompositorMessageToImpl& proto); | 173 void HandleProto(const proto::CompositorMessageToImpl& proto); |
| 174 void DidCompleteSwapBuffersOnMain(); | 174 void DidCompleteSwapBuffersOnMain(); |
| 175 void DidCommitAndDrawFrameOnMain(); | 175 void DidCommitAndDrawFrameOnMain(); |
| 176 void DidLoseOutputSurfaceOnMain(); | 176 void DidLoseOutputSurfaceOnMain(); |
| 177 void RequestNewOutputSurfaceOnMain(); | 177 void RequestNewOutputSurfaceOnMain(); |
| 178 void DidInitializeOutputSurfaceOnMain(bool success); | 178 void DidInitializeOutputSurfaceOnMain(bool success); |
| 179 void SendMessageProtoOnMain(std::unique_ptr<proto::CompositorMessage> proto); | 179 void SendMessageProtoOnMain(std::unique_ptr<proto::CompositorMessage> proto); |
| 180 void PostSetNeedsRedrawToImpl(const gfx::Rect& damaged_rect); | 180 void PostSetNeedsRedrawToImpl(const gfx::Rect& damaged_rect); |
| 181 | 181 |
| 182 void InitializeImplOnImpl(CompletionEvent* completion, | 182 void InitializeImplOnImpl(CompletionEvent* completion, |
| 183 LayerTreeHost* layer_tree_host); | 183 LayerTreeHostInProcess* layer_tree_host); |
| 184 void ShutdownImplOnImpl(CompletionEvent* completion); | 184 void ShutdownImplOnImpl(CompletionEvent* completion); |
| 185 | 185 |
| 186 MainThreadOnly& main(); | 186 MainThreadOnly& main(); |
| 187 const MainThreadOnly& main() const; | 187 const MainThreadOnly& main() const; |
| 188 CompositorThreadOnly& impl(); | 188 CompositorThreadOnly& impl(); |
| 189 const CompositorThreadOnly& impl() const; | 189 const CompositorThreadOnly& impl() const; |
| 190 | 190 |
| 191 base::SingleThreadTaskRunner* MainThreadTaskRunner() const; | 191 base::SingleThreadTaskRunner* MainThreadTaskRunner() const; |
| 192 base::SingleThreadTaskRunner* ImplThreadTaskRunner() const; | 192 base::SingleThreadTaskRunner* ImplThreadTaskRunner() const; |
| 193 | 193 |
| 194 TaskRunnerProvider* task_runner_provider_; | 194 TaskRunnerProvider* task_runner_provider_; |
| 195 | 195 |
| 196 // use accessors instead of these variables directly | 196 // use accessors instead of these variables directly |
| 197 MainThreadOnly main_thread_vars_unsafe_; | 197 MainThreadOnly main_thread_vars_unsafe_; |
| 198 CompositorThreadOnly compositor_thread_vars_unsafe_; | 198 CompositorThreadOnly compositor_thread_vars_unsafe_; |
| 199 | 199 |
| 200 base::WeakPtr<ProxyImpl> proxy_impl_weak_ptr_; | 200 base::WeakPtr<ProxyImpl> proxy_impl_weak_ptr_; |
| 201 | 201 |
| 202 DISALLOW_COPY_AND_ASSIGN(RemoteChannelImpl); | 202 DISALLOW_COPY_AND_ASSIGN(RemoteChannelImpl); |
| 203 }; | 203 }; |
| 204 | 204 |
| 205 } // namespace cc | 205 } // namespace cc |
| 206 | 206 |
| 207 #endif // CC_TREES_REMOTE_CHANNEL_IMPL_H_ | 207 #endif // CC_TREES_REMOTE_CHANNEL_IMPL_H_ |
| OLD | NEW |