Chromium Code Reviews| Index: cc/trees/remote_channel_impl.h |
| diff --git a/cc/trees/remote_channel_impl.h b/cc/trees/remote_channel_impl.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..fcecc7bab255db6a958fef4ef0a43a0650012593 |
| --- /dev/null |
| +++ b/cc/trees/remote_channel_impl.h |
| @@ -0,0 +1,202 @@ |
| +// Copyright 2015 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef CC_TREES_REMOTE_CHANNEL_IMPL_H_ |
| +#define CC_TREES_REMOTE_CHANNEL_IMPL_H_ |
| + |
| +#include "base/macros.h" |
| +#include "base/memory/weak_ptr.h" |
| +#include "cc/base/cc_export.h" |
| +#include "cc/base/completion_event.h" |
| +#include "cc/raster/task_graph_runner.h" |
| +#include "cc/trees/channel_impl.h" |
| +#include "cc/trees/proxy_impl.h" |
| +#include "cc/trees/remote_proto_channel.h" |
| + |
| +namespace cc { |
| +class LayerTreeHost; |
| +class LayerTreeSettings; |
| +class RemoteChannelHost; |
| + |
| +namespace proto { |
| +class CompositorMessage; |
| +class CompositorMessageToImpl; |
| +class CompositorMessageToMain; |
| +class InitializeImpl; |
| +} |
| + |
| +// The ChannelImpl implementation for the remote compositor. The lifetime of |
| +// this class is tied to the lifetime of the main components of the remote |
| +// compositor on the engine and the RemoteChannelHostClient. |
| +// |
| +// The object life cycle and communication across threads is as follows: |
| +// |
| +// The RemoteChannelImpl is created by the RemoteChannelHost on receiving |
| +// CompositorMessageToImpl:: InitializeImpl message from the main compositor. |
| +// |
| +// Main Thread | Impl Thread |
| +// | |
| +// RemoteChannelHost-> | |
| +// CreateRemoteChannelImpl() | |
| +// | | |
| +// | RemoteChannelImpl |
| +// --------------------------------------------------------------------------- |
| +// RemoteChannelImpl->Initialize()---PostTask---> RemoteChannelImpl:: |
|
David Trainor- moved to gerrit
2015/12/15 00:52:14
:: for all of these?
Khushal
2015/12/15 05:05:30
Done.
|
| +// InitializeImplOnImpl |
| +// | |
| +// ProxyImpl::Create |
| +// | |
| +// . |
| +// . |
| +// ProxyImpl::ScheduledActionBegin |
| +// OutputSurfaceCreation |
| +// | |
| +// ChannelImpl::RequestNewOutputSurface |
| +// | |
| +// RemoteChannelImpl-> | |
| +// RequestNewOutputSurface()<----PostTask-------------- |
| +// . |
| +// . |
| +// | |
| +// RemoteChannelImpl:: |
| +// ~RemoteChannelImpl() ---PostTask---> RemoteChannelImpl:: |
| +// ShutdownImplOnImpl |
| +// ---------------------------------------------------------------------------- |
| +// |
| +// The destruction of the RemoteChannelImpl can be triggered by the |
| +// RemoteChannelHost in 2 cases: |
| +// 1) On receiving a CompositorMessageToImpl::CloseImpl message from the main |
| +// compositor. |
| +// 2) When the RemoteChannelHost is being destroyed, which will destroy the |
| +// RemoteChannelImpl. |
| +// |
| +// The class is created and destroyed on the main thread but can be safely |
| +// called from the main or impl thread. It is safe to call RemoteChannelImpl on |
| +// the impl thread since: |
| +// 1) The only impl threaded callers of RemoteChannelImpl is the |
| +// RemoteChannelImpl itself and ProxyImpl which is created and owned by the |
| +// RemoteChannelImpl. |
| +// 2) The RemoteChannelImpl blocks the main thread in its dtor to wait for the |
| +// impl-thread teardown to complete, which ensures that any tasks queued to call |
| +// it on the impl thread are run before it is destroyed on the main thread. |
| + |
| +class CC_EXPORT RemoteChannelImpl : public ChannelImpl { |
| + public: |
| + static scoped_ptr<RemoteChannelImpl> Create( |
| + RemoteChannelHost* remote_channel_host, |
| + TaskGraphRunner* task_graph_runner, |
| + const LayerTreeSettings& settings, |
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| + scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner); |
| + |
| + ~RemoteChannelImpl() override; |
| + |
| + void Initialize(); |
| + |
| + void HandleProto(const proto::CompositorMessageToImpl& proto); |
| + |
| + // Should be called on impl thread only. |
| + ProxyImpl* GetProxyImplForTesting() const; |
| + |
| + protected: |
| + RemoteChannelImpl( |
| + RemoteChannelHost* remote_channel_host, |
| + TaskGraphRunner* task_graph_runner, |
| + const LayerTreeSettings& settings, |
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| + scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner); |
| + |
| + // virtual for testing. |
| + virtual scoped_ptr<ProxyImpl> CreateProxyImpl( |
| + ChannelImpl* channel_impl, |
| + LayerTreeHost* layer_tree_host, |
| + TaskRunnerProvider* task_runner_provider, |
| + scoped_ptr<BeginFrameSource> external_begin_frame_source); |
| + |
| + bool MainFrameWillHappenForTesting(); |
| + |
| + private: |
| + struct MainThreadOnly { |
| + RemoteChannelHost* remote_channel_host; |
| + |
| + // For the remote mode, the data from the LayerTreeHost of the main |
| + // compositor is deserialized to this LayerTreeHost which is used by |
| + // ProxyImpl for the commit. |
| + // |
| + // Since the lifetime of this LayerTreeHost has to be tied to the lifetime |
| + // of the main compositor, it is created and owned by the RemoteChannelImpl. |
| + // |
| + // It is *important* to note that the purpose of this LayerTreeHost is to |
| + // run impl-threaded operations. The only method that can be called on it |
| + // from the main thread is LayerTreeHost::FromProtobuf, used to add the |
| + // commit data to this host. |
| + scoped_ptr<LayerTreeHost> layer_tree_host; |
| + |
| + MainThreadOnly( |
| + RemoteChannelImpl* remote_channel_impl, |
| + RemoteChannelHost* remote_channel_host, |
| + TaskGraphRunner* task_graph_runner, |
| + const LayerTreeSettings& settings, |
| + scoped_refptr<base::SingleThreadTaskRunner> main_task_runner, |
| + scoped_refptr<base::SingleThreadTaskRunner> impl_task_runner); |
| + ~MainThreadOnly(); |
| + }; |
| + |
| + struct CompositorThreadOnly { |
| + scoped_ptr<ProxyImpl> proxy_impl; |
| + scoped_ptr<base::WeakPtrFactory<ProxyImpl>> proxy_impl_weak_factory; |
| + |
| + CompositorThreadOnly(); |
| + ~CompositorThreadOnly(); |
| + }; |
| + |
| + // Called on impl thread. |
| + // ChannelImpl implementation |
| + void DidCompleteSwapBuffers() override; |
| + void SetRendererCapabilitiesMainCopy( |
| + const RendererCapabilities& capabilities) override; |
| + void BeginMainFrameNotExpectedSoon() override; |
| + void DidCommitAndDrawFrame() override; |
| + void SetAnimationEvents(scoped_ptr<AnimationEventsVector> queue) override; |
| + void DidLoseOutputSurface() override; |
| + void RequestNewOutputSurface() override; |
| + void DidInitializeOutputSurface( |
| + bool success, |
| + const RendererCapabilities& capabilities) override; |
| + void DidCompletePageScaleAnimation() override; |
| + void PostFrameTimingEventsOnMain( |
| + scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, |
| + scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) |
| + override; |
| + void BeginMainFrame( |
| + scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state) override; |
| + |
| + void InitializeImplOnImpl(CompletionEvent* completion, |
| + LayerTreeHost* layer_tree_host); |
| + void ShutdownImplOnImpl(CompletionEvent* completion); |
| + |
| + // Called on main thread. |
| + void MainThreadHasStoppedFlinging(); |
| + |
| + MainThreadOnly& main(); |
| + CompositorThreadOnly& impl(); |
| + const CompositorThreadOnly& impl() const; |
| + |
| + base::SingleThreadTaskRunner* MainThreadTaskRunner() const; |
| + base::SingleThreadTaskRunner* ImplThreadTaskRunner() const; |
| + |
| + // use accessors instead of these variables directly |
| + MainThreadOnly main_thread_vars_unsafe_; |
| + CompositorThreadOnly compositor_thread_vars_unsafe_; |
| + |
| + TaskRunnerProvider* task_runner_provider_; |
| + |
| + base::WeakPtr<ProxyImpl> proxy_impl_weak_ptr_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(RemoteChannelImpl); |
| +}; |
| + |
| +} // namespace cc |
| + |
| +#endif // CC_TREES_REMOTE_CHANNEL_IMPL_H_ |