| 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..cb5430b3895df172bb6e68d5cc1109ada660796a
|
| --- /dev/null
|
| +++ b/cc/trees/remote_channel_impl.h
|
| @@ -0,0 +1,203 @@
|
| +// Copyright 2016 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/trees/channel_impl.h"
|
| +#include "cc/trees/proxy.h"
|
| +#include "cc/trees/proxy_impl.h"
|
| +#include "cc/trees/remote_proto_channel.h"
|
| +
|
| +namespace cc {
|
| +class LayerTreeHost;
|
| +
|
| +namespace proto {
|
| +class CompositorMessage;
|
| +class CompositorMessageToImpl;
|
| +class CompositorMessageToMain;
|
| +}
|
| +
|
| +// The Proxy and ChannelImpl implementation for the remote compositor.
|
| +// The object life cycle and communication across threads is as follows:
|
| +//
|
| +// The RemoteChannelImpl is created by the remote client LayerTreeHost, which
|
| +// initializes the impl side of the compositor.
|
| +//
|
| +// Main Thread | Impl Thread
|
| +// |
|
| +// Proxy::Start |
|
| +// | |
|
| +// | RemoteChannelImpl
|
| +// ---------------------------------------------------------------------------
|
| +// RemoteChannelImpl::Start()---PostTask---> RemoteChannelImpl::
|
| +// InitializeImplOnImpl
|
| +// |
|
| +// ProxyImpl::Create
|
| +// |
|
| +// .
|
| +// .
|
| +// ProxyImpl::ScheduledActionBegin
|
| +// OutputSurfaceCreation
|
| +// |
|
| +// ChannelImpl::RequestNewOutputSurface
|
| +// |
|
| +// RemoteChannelImpl:: |
|
| +// RequestNewOutputSurface()<----PostTask--------------
|
| +// .
|
| +// .
|
| +// |
|
| +// RemoteChannelImpl::
|
| +// ~RemoteChannelImpl() ---PostTask---> RemoteChannelImpl::
|
| +// ShutdownImplOnImpl
|
| +// ----------------------------------------------------------------------------
|
| +//
|
| +// 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.
|
| +//
|
| +// The RemoteChannelImpl receives and processes messages from the remote server
|
| +// compositor on the main thread. The requests from ProxyImpl are received on
|
| +// the impl thread which may be directed to the LayerTreeHost on the client
|
| +// (for instance output surface requests) or sent to the LayerTreeHost on the
|
| +// server. The messages to the server are created on the impl thread and sent
|
| +// using the RemoteProtoChannel on the main thread.
|
| +class CC_EXPORT RemoteChannelImpl : public ChannelImpl,
|
| + public RemoteProtoChannel::ProtoReceiver,
|
| + public Proxy {
|
| + public:
|
| + static scoped_ptr<RemoteChannelImpl> Create(
|
| + LayerTreeHost* layer_tree_host,
|
| + RemoteProtoChannel* remote_proto_channel,
|
| + TaskRunnerProvider* task_runner_provider);
|
| +
|
| + ~RemoteChannelImpl() override;
|
| +
|
| + protected:
|
| + RemoteChannelImpl(LayerTreeHost* layer_tree_host,
|
| + RemoteProtoChannel* remote_proto_channel,
|
| + TaskRunnerProvider* task_runner_provider);
|
| +
|
| + // 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);
|
| +
|
| + private:
|
| + struct MainThreadOnly {
|
| + LayerTreeHost* layer_tree_host;
|
| + RemoteProtoChannel* remote_proto_channel;
|
| +
|
| + bool started;
|
| +
|
| + RendererCapabilities renderer_capabilities;
|
| +
|
| + MainThreadOnly(LayerTreeHost* layer_tree_host,
|
| + RemoteProtoChannel* remote_proto_channel);
|
| + ~MainThreadOnly();
|
| + };
|
| +
|
| + struct CompositorThreadOnly {
|
| + scoped_ptr<ProxyImpl> proxy_impl;
|
| + scoped_ptr<base::WeakPtrFactory<ProxyImpl>> proxy_impl_weak_factory;
|
| +
|
| + CompositorThreadOnly();
|
| + ~CompositorThreadOnly();
|
| + };
|
| +
|
| + // called on main thread.
|
| + // RemoteProtoChannel::ProtoReceiver implementation.
|
| + void OnProtoReceived(scoped_ptr<proto::CompositorMessage> proto) override;
|
| +
|
| + // Proxy implementation
|
| + void FinishAllRendering() override;
|
| + bool IsStarted() const override;
|
| + bool CommitToActiveTree() const override;
|
| + void SetOutputSurface(OutputSurface* output_surface) override;
|
| + void ReleaseOutputSurface() override;
|
| + void SetVisible(bool visible) override;
|
| + void SetThrottleFrameProduction(bool throttle) override;
|
| + const RendererCapabilities& GetRendererCapabilities() const override;
|
| + void SetNeedsAnimate() override;
|
| + void SetNeedsUpdateLayers() override;
|
| + void SetNeedsCommit() override;
|
| + void SetNeedsRedraw(const gfx::Rect& damage_rect) override;
|
| + void SetNextCommitWaitsForActivation() override;
|
| + void NotifyInputThrottledUntilCommit() override;
|
| + void SetDeferCommits(bool defer_commits) override;
|
| + void MainThreadHasStoppedFlinging() override;
|
| + bool CommitRequested() const override;
|
| + bool BeginMainFrameRequested() const override;
|
| + void Start(scoped_ptr<BeginFrameSource> external_begin_frame_source) override;
|
| + void Stop() override;
|
| + bool SupportsImplScrolling() const override;
|
| + void SetChildrenNeedBeginFrames(bool children_need_begin_frames) override;
|
| + void SetAuthoritativeVSyncInterval(const base::TimeDelta& interval) override;
|
| + void UpdateTopControlsState(TopControlsState constraints,
|
| + TopControlsState current,
|
| + bool animate) override;
|
| + bool MainFrameWillHappenForTesting() override;
|
| +
|
| + // 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<AnimationEvents> 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;
|
| +
|
| + // called on main thread.
|
| + void HandleProto(const proto::CompositorMessageToImpl& proto);
|
| +
|
| + void InitializeImplOnImpl(CompletionEvent* completion,
|
| + LayerTreeHost* layer_tree_host);
|
| + void ShutdownImplOnImpl(CompletionEvent* completion);
|
| +
|
| + MainThreadOnly& main();
|
| + const MainThreadOnly& main() const;
|
| + 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_
|
|
|