| 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..e162e143593114679f7963fc7ee1867cb4577adc
|
| --- /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::
|
| +// 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_
|
|
|