Index: cc/trees/proxy_main.h |
diff --git a/cc/trees/proxy_main.h b/cc/trees/proxy_main.h |
index fbe191d57a67f587b06fd493a19e07a7cc3539a9..973996741ac81cc9c0917e44a02b40c7a2eb1dc7 100644 |
--- a/cc/trees/proxy_main.h |
+++ b/cc/trees/proxy_main.h |
@@ -5,56 +5,154 @@ |
#ifndef CC_TREES_PROXY_MAIN_H_ |
#define CC_TREES_PROXY_MAIN_H_ |
+#include "base/macros.h" |
#include "base/memory/weak_ptr.h" |
#include "cc/animation/animation_events.h" |
#include "cc/base/cc_export.h" |
#include "cc/debug/frame_timing_tracker.h" |
+#include "cc/input/top_controls_state.h" |
+#include "cc/output/output_surface.h" |
#include "cc/output/renderer_capabilities.h" |
+#include "cc/trees/channel_main.h" |
+#include "cc/trees/proxy.h" |
#include "cc/trees/proxy_common.h" |
namespace cc { |
-class ThreadedChannel; |
- |
-// TODO(khushalsagar): The main side of ThreadProxy. It is currently defined as |
-// an interface with the implementation provided by ThreadProxy and will be |
-// made an independent class. |
-// The methods added to this interface should only use the MainThreadOnly or |
-// BlockedMainThread variables from ThreadProxy. |
-// See crbug/527200. |
-class CC_EXPORT ProxyMain { |
+class BeginFrameSource; |
+class ChannelMain; |
+class LayerTreeHost; |
+ |
+// This class is a proxy to the LayerTreeHost and the main side of the |
+// compositor. The class is created and lives on the main thread. |
Wez
2015/11/26 00:39:47
nit: The ProxyImpl comment is clearer, IMO - consi
|
+class CC_EXPORT ProxyMain : public Proxy { |
public: |
- // TODO(khushalsagar): Make this ChannelMain*. When ProxyMain and |
- // ProxyImpl are split, ProxyImpl will be passed a reference to ChannelImpl |
- // at creation. Right now we just set it directly from ThreadedChannel |
- // when the impl side is initialized. |
- virtual void SetChannel(scoped_ptr<ThreadedChannel> threaded_channel) = 0; |
+ static scoped_ptr<ProxyMain> Create( |
+ LayerTreeHost* layer_tree_host, |
+ TaskRunnerProvider* task_runner_provider, |
+ scoped_ptr<BeginFrameSource> external_begin_frame_source); |
- protected: |
- virtual ~ProxyMain() {} |
+ ~ProxyMain() override; |
- private: |
- friend class ThreadedChannel; |
- // Callback for main side commands received from the Channel. |
- virtual void DidCompleteSwapBuffers() = 0; |
+ // Commits between the main and impl threads are processed through a pipeline |
+ // with the following stages. For efficiency we can early out at any stage if |
+ // we decide that no further processing is necessary. |
+ enum CommitPipelineStage { |
+ NO_PIPELINE_STAGE, |
+ ANIMATE_PIPELINE_STAGE, |
+ UPDATE_LAYERS_PIPELINE_STAGE, |
+ COMMIT_PIPELINE_STAGE, |
+ }; |
+ |
+ // This sets the channel used by ProxyMain to communicate with ProxyImpl. |
+ // The channel must be set before starting ProxyMain. |
+ void SetChannel(scoped_ptr<ChannelMain> channel_main); |
+ |
+ // Virtual for testing. |
+ virtual void DidCompleteSwapBuffers(); |
virtual void SetRendererCapabilitiesMainCopy( |
- const RendererCapabilities& capabilities) = 0; |
- virtual void BeginMainFrameNotExpectedSoon() = 0; |
- virtual void DidCommitAndDrawFrame() = 0; |
- virtual void SetAnimationEvents(scoped_ptr<AnimationEventsVector> queue) = 0; |
- virtual void DidLoseOutputSurface() = 0; |
- virtual void RequestNewOutputSurface() = 0; |
+ const RendererCapabilities& capabilities); |
+ virtual void BeginMainFrameNotExpectedSoon(); |
+ virtual void DidCommitAndDrawFrame(); |
+ virtual void SetAnimationEvents(scoped_ptr<AnimationEventsVector> queue); |
+ virtual void DidLoseOutputSurface(); |
+ virtual void RequestNewOutputSurface(); |
virtual void DidInitializeOutputSurface( |
bool success, |
- const RendererCapabilities& capabilities) = 0; |
- virtual void DidCompletePageScaleAnimation() = 0; |
+ const RendererCapabilities& capabilities); |
+ virtual void DidCompletePageScaleAnimation(); |
virtual void PostFrameTimingEventsOnMain( |
scoped_ptr<FrameTimingTracker::CompositeTimingSet> composite_events, |
- scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events) = 0; |
+ scoped_ptr<FrameTimingTracker::MainFrameTimingSet> main_frame_events); |
virtual void BeginMainFrame( |
- scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state) = 0; |
+ scoped_ptr<BeginMainFrameAndCommitState> begin_main_frame_state); |
+ |
+ ChannelMain* channel_main() const { return channel_main_.get(); } |
+ CommitPipelineStage max_requested_pipeline_stage() const { |
+ return max_requested_pipeline_stage_; |
+ } |
+ CommitPipelineStage current_pipeline_stage() const { |
+ return current_pipeline_stage_; |
+ } |
+ CommitPipelineStage final_pipeline_stage() const { |
+ return final_pipeline_stage_; |
+ } |
+ |
+ protected: |
+ ProxyMain(LayerTreeHost* layer_tree_host, |
+ TaskRunnerProvider* task_runner_provider, |
+ scoped_ptr<BeginFrameSource> external_begin_frame_source); |
+ |
+ private: |
+ friend class ProxyMainForTest; |
+ |
+ // Proxy implementation |
Wez
2015/11/26 00:39:47
nit: Missing .
|
+ void FinishAllRendering() override; |
+ bool IsStarted() const override; |
+ bool CommitToActiveTree() const override; |
+ void SetOutputSurface(OutputSurface* output_surface) 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; |
+ bool CommitRequested() const override; |
+ bool BeginMainFrameRequested() const override; |
+ void MainThreadHasStoppedFlinging() override; |
+ void Start() override; |
+ void Stop() override; |
+ bool SupportsImplScrolling() const override; |
+ bool MainFrameWillHappenForTesting() override; |
+ void SetChildrenNeedBeginFrames(bool children_need_begin_frames) override; |
+ void SetAuthoritativeVSyncInterval(const base::TimeDelta& interval) override; |
+ void ReleaseOutputSurface() override; |
+ void UpdateTopControlsState(TopControlsState constraints, |
+ TopControlsState current, |
+ bool animate) override; |
+ |
+ // Returns |true| if the request was actually sent, |false| if one was |
+ // already outstanding. |
+ bool SendCommitRequestToImplThreadIfNeeded( |
+ CommitPipelineStage required_stage); |
+ bool IsMainThread() const; |
+ |
+ LayerTreeHost* layer_tree_host_; |
+ |
+ TaskRunnerProvider* task_runner_provider_; |
+ |
+ const int layer_tree_host_id_; |
+ |
+ // The furthest pipeline stage which has been requested for the next |
+ // commit. |
+ CommitPipelineStage max_requested_pipeline_stage_; |
+ // The commit pipeline stage that is currently being processed. |
+ CommitPipelineStage current_pipeline_stage_; |
+ // The commit pipeline stage at which processing for the current commit |
+ // will stop. Only valid while we are executing the pipeline (i.e., |
+ // |current_pipeline_stage| is set to a pipeline stage). |
+ CommitPipelineStage final_pipeline_stage_; |
+ |
+ bool commit_waits_for_activation_; |
+ |
+ // Set when the Proxy is started using Proxy::Start() and reset when it is |
+ // stopped using Proxy::Stop(). |
+ bool started_; |
+ |
+ bool defer_commits_; |
+ |
+ RendererCapabilities renderer_capabilities_main_thread_copy_; |
+ |
+ // This holds a valid value only until ProxyImpl is created on the impl thread |
+ // with InitializeImplOnImpl(). |
+ scoped_ptr<BeginFrameSource> external_begin_frame_source_; |
+ |
+ scoped_ptr<ChannelMain> channel_main_; |
- // TODO(khushalsagar): Rename as GetWeakPtr() once ThreadProxy is split. |
- virtual base::WeakPtr<ProxyMain> GetMainWeakPtr() = 0; |
+ DISALLOW_COPY_AND_ASSIGN(ProxyMain); |
}; |
} // namespace cc |