Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1977)

Unified Diff: cc/trees/proxy_main.h

Issue 1417053005: cc: Split ThreadProxy into ProxyMain and ProxyImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update ProxyImpl and ProxyMain class structure. Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698