blob: 3a37e50d2e8dde020e8c32ac811a99b8345dee26 [file] [log] [blame]
[email protected]ba91a792013-02-06 09:48:281// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_
6#define CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_
7
[email protected]666d7cf2013-10-12 01:30:298#include "base/callback.h"
[email protected]200a9c062013-05-20 04:34:379#include "base/memory/weak_ptr.h"
[email protected]abb522162013-06-28 01:54:1610#include "base/time/time.h"
[email protected]752e2cf2013-10-21 21:41:1511#include "base/values.h"
[email protected]9b003482013-05-21 14:00:1712#include "cc/input/top_controls_state.h"
sohan.jyoti127a06b42015-10-05 08:23:3413#include "cc/output/managed_memory_policy.h"
jamesrf313a212015-03-16 21:27:3714#include "cc/output/swap_promise.h"
[email protected]556fd292013-03-18 08:03:0415#include "cc/trees/layer_tree_host_client.h"
[email protected]943528e2013-11-07 05:01:3216#include "cc/trees/layer_tree_host_single_thread_client.h"
[email protected]556fd292013-03-18 08:03:0417#include "cc/trees/layer_tree_settings.h"
dtrainor5ef644e2015-11-19 00:12:4718#include "cc/trees/remote_proto_channel.h"
jamesrf313a212015-03-16 21:27:3719#include "cc/trees/swap_promise_monitor.h"
skyostil7759d7a2014-09-05 08:22:2320#include "content/common/content_export.h"
danakj6e3bf8012014-12-16 18:27:5321#include "content/renderer/gpu/compositor_dependencies.h"
[email protected]5c30b5e02013-05-30 03:46:0822#include "third_party/WebKit/public/platform/WebLayerTreeView.h"
[email protected]9f4f6a32013-09-04 21:35:1223#include "third_party/skia/include/core/SkBitmap.h"
tfarina3b0452d2014-12-31 15:20:0924#include "ui/gfx/geometry/rect.h"
[email protected]ba91a792013-02-06 09:48:2825
[email protected]4b157662013-05-29 04:05:0526namespace ui {
miletus45effdc42015-08-05 00:29:1827class LatencyInfo;
[email protected]4b157662013-05-29 04:05:0528}
29
[email protected]ba91a792013-02-06 09:48:2830namespace cc {
enne89e6c3aa2014-10-01 15:07:5931class CopyOutputRequest;
[email protected]200a9c062013-05-20 04:34:3732class InputHandler;
[email protected]f7837a92013-08-21 03:00:0533class Layer;
[email protected]ba91a792013-02-06 09:48:2834class LayerTreeHost;
dtrainor5ef644e2015-11-19 00:12:4735
36namespace proto {
37class CompositorMessage;
38}
39
[email protected]ba91a792013-02-06 09:48:2840}
41
42namespace content {
43class RenderWidget;
44
skyostil7759d7a2014-09-05 08:22:2345class CONTENT_EXPORT RenderWidgetCompositor
46 : NON_EXPORTED_BASE(public blink::WebLayerTreeView),
47 NON_EXPORTED_BASE(public cc::LayerTreeHostClient),
dtrainor5ef644e2015-11-19 00:12:4748 NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient),
49 NON_EXPORTED_BASE(public cc::RemoteProtoChannel) {
[email protected]ba91a792013-02-06 09:48:2850 public:
51 // Attempt to construct and initialize a compositor instance for the widget
52 // with the given settings. Returns NULL if initialization fails.
danakj6e3bf8012014-12-16 18:27:5353 static scoped_ptr<RenderWidgetCompositor> Create(
54 RenderWidget* widget,
55 CompositorDependencies* compositor_deps);
[email protected]ba91a792013-02-06 09:48:2856
avi5c77d212015-09-25 20:08:2557 ~RenderWidgetCompositor() override;
[email protected]ba91a792013-02-06 09:48:2858
sievers71c62dd52015-10-07 01:44:3959 void SetNeverVisible();
[email protected]200a9c062013-05-20 04:34:3760 const base::WeakPtr<cc::InputHandler>& GetInputHandler();
[email protected]971728d2013-10-26 10:39:3161 bool BeginMainFrameRequested() const;
[email protected]24ed0432013-04-24 07:50:3162 void SetNeedsDisplayOnAllLayers();
[email protected]206a3922013-05-17 06:34:1263 void SetRasterizeOnlyVisibleContent();
[email protected]0bc1f572013-04-17 01:46:3164 void SetNeedsRedrawRect(gfx::Rect damage_rect);
[email protected]7d08a9352013-10-15 08:24:5665 // Like setNeedsRedraw but forces the frame to be drawn, without early-outs.
66 // Redraw will be forced after the next commit
67 void SetNeedsForcedRedraw();
[email protected]6be422b2013-12-08 06:47:3168 // Calling CreateLatencyInfoSwapPromiseMonitor() to get a scoped
69 // LatencyInfoSwapPromiseMonitor. During the life time of the
igsollaeab34cc2015-02-20 11:33:3570 // LatencyInfoSwapPromiseMonitor, if SetNeedsCommit() or
71 // SetNeedsUpdateLayers() is called on LayerTreeHost, the original latency
72 // info will be turned into a LatencyInfoSwapPromise.
[email protected]6be422b2013-12-08 06:47:3173 scoped_ptr<cc::SwapPromiseMonitor> CreateLatencyInfoSwapPromiseMonitor(
74 ui::LatencyInfo* latency);
[email protected]8062ab262014-05-27 16:56:4375 // Calling QueueSwapPromise() to directly queue a SwapPromise into
76 // LayerTreeHost.
77 void QueueSwapPromise(scoped_ptr<cc::SwapPromise> swap_promise);
[email protected]586871b2014-07-22 17:05:1178 int GetSourceFrameNumber() const;
igsollaeab34cc2015-02-20 11:33:3579 void SetNeedsUpdateLayers();
[email protected]586871b2014-07-22 17:05:1180 void SetNeedsCommit();
[email protected]df09e052013-07-31 18:59:5081 void NotifyInputThrottledUntilCommit();
[email protected]f7837a92013-08-21 03:00:0582 const cc::Layer* GetRootLayer() const;
[email protected]67e703e12014-05-30 05:31:5183 int ScheduleMicroBenchmark(
[email protected]666d7cf2013-10-12 01:30:2984 const std::string& name,
[email protected]752e2cf2013-10-21 21:41:1585 scoped_ptr<base::Value> value,
[email protected]666d7cf2013-10-12 01:30:2986 const base::Callback<void(scoped_ptr<base::Value>)>& callback);
[email protected]67e703e12014-05-30 05:31:5187 bool SendMessageToMicroBenchmark(int id, scoped_ptr<base::Value> value);
kenrbb4e2a3b2015-05-14 15:05:0588 void SetSurfaceIdNamespace(uint32_t surface_id_namespace);
dtrainor5ef644e2015-11-19 00:12:4789 void OnHandleCompositorProto(const std::vector<uint8_t>& proto);
sohan.jyoti127a06b42015-10-05 08:23:3490 cc::ManagedMemoryPolicy GetGpuMemoryPolicy(
91 const cc::ManagedMemoryPolicy& policy);
oshima750cb4342015-10-31 00:59:0192 void SetPaintedDeviceScaleFactor(float device_scale);
[email protected]9ed83fe2013-02-27 01:52:2893
[email protected]ba91a792013-02-06 09:48:2894 // WebLayerTreeView implementation.
avi5c77d212015-09-25 20:08:2595 void setRootLayer(const blink::WebLayer& layer) override;
96 void clearRootLayer() override;
97 void attachCompositorAnimationTimeline(
98 blink::WebCompositorAnimationTimeline* compositor_timeline) override;
99 void detachCompositorAnimationTimeline(
100 blink::WebCompositorAnimationTimeline* compositor_timeline) override;
avi5c77d212015-09-25 20:08:25101 void setViewportSize(const blink::WebSize& device_viewport_size) override;
[email protected]180ef242013-11-07 06:50:46102 virtual blink::WebFloatPoint adjustEventPointForPinchZoom(
103 const blink::WebFloatPoint& point) const;
avi5c77d212015-09-25 20:08:25104 void setDeviceScaleFactor(float device_scale) override;
avi5c77d212015-09-25 20:08:25105 void setBackgroundColor(blink::WebColor color) override;
106 void setHasTransparentBackground(bool transparent) override;
107 void setVisible(bool visible) override;
108 void setPageScaleFactorAndLimits(float page_scale_factor,
109 float minimum,
110 float maximum) override;
111 void startPageScaleAnimation(const blink::WebPoint& destination,
112 bool use_anchor,
113 float new_page_scale,
114 double duration_sec) override;
115 void heuristicsForGpuRasterizationUpdated(bool matches_heuristics) override;
116 void setNeedsAnimate() override;
117 void setNeedsBeginFrame() override;
118 void setNeedsCompositorUpdate() override;
119 void didStopFlinging() override;
120 void layoutAndPaintAsync(
121 blink::WebLayoutAndPaintAsyncCallback* callback) override;
122 void compositeAndReadbackAsync(
123 blink::WebCompositeAndReadbackAsyncCallback* callback) override;
124 void setDeferCommits(bool defer_commits) override;
125 void registerForAnimations(blink::WebLayer* layer) override;
126 void registerViewportLayers(
ccameron8230b68b2014-11-21 19:25:18127 const blink::WebLayer* overscrollElasticityLayer,
128 const blink::WebLayer* pageScaleLayer,
129 const blink::WebLayer* innerViewportScrollLayer,
130 const blink::WebLayer* outerViewportScrollLayer) override;
avi5c77d212015-09-25 20:08:25131 void clearViewportLayers() override;
132 void registerSelection(const blink::WebSelection& selection) override;
133 void clearSelection() override;
134 int layerTreeId() const override;
135 void setShowFPSCounter(bool show) override;
136 void setShowPaintRects(bool show) override;
137 void setShowDebugBorders(bool show) override;
138 void setShowScrollBottleneckRects(bool show) override;
aelias6004fe02015-02-07 21:43:01139
avi5c77d212015-09-25 20:08:25140 void updateTopControlsState(blink::WebTopControlsState constraints,
majidvpfb80e432015-02-23 14:15:50141 blink::WebTopControlsState current,
avi5c77d212015-09-25 20:08:25142 bool animate) override;
143 void setTopControlsHeight(float height, bool shrink) override;
144 void setTopControlsShownRatio(float) override;
[email protected]ba91a792013-02-06 09:48:28145
146 // cc::LayerTreeHostClient implementation.
caseq7d2f4c92015-02-04 16:43:27147 void WillBeginMainFrame() override;
dcheng6d18e402014-10-21 12:32:52148 void DidBeginMainFrame() override;
149 void BeginMainFrame(const cc::BeginFrameArgs& args) override;
rmcilroy0a19362a2015-02-18 12:34:25150 void BeginMainFrameNotExpectedSoon() override;
wkorman7265db012015-11-03 04:08:25151 void UpdateLayerTreeHost() override;
miletus7a221752015-02-04 20:44:49152 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
153 const gfx::Vector2dF& outer_delta,
ccameron98be9ac2014-12-09 19:56:32154 const gfx::Vector2dF& elastic_overscroll_delta,
dcheng6d18e402014-10-21 12:32:52155 float page_scale,
156 float top_controls_delta) override;
enne7f8fdde2014-12-10 21:32:09157 void RequestNewOutputSurface() override;
dcheng6d18e402014-10-21 12:32:52158 void DidInitializeOutputSurface() override;
enne7f8fdde2014-12-10 21:32:09159 void DidFailToInitializeOutputSurface() override;
dcheng6d18e402014-10-21 12:32:52160 void WillCommit() override;
161 void DidCommit() override;
162 void DidCommitAndDrawFrame() override;
163 void DidCompleteSwapBuffers() override;
rouslanf7ebd8832015-01-22 01:54:14164 void DidCompletePageScaleAnimation() override;
mpbed24c2c2015-06-05 20:57:13165 void RecordFrameTimingEvents(
166 scoped_ptr<cc::FrameTimingTracker::CompositeTimingSet> composite_events,
167 scoped_ptr<cc::FrameTimingTracker::MainFrameTimingSet> main_frame_events)
168 override;
[email protected]ba91a792013-02-06 09:48:28169
[email protected]943528e2013-11-07 05:01:32170 // cc::LayerTreeHostSingleThreadClient implementation.
dcheng6d18e402014-10-21 12:32:52171 void ScheduleAnimation() override;
172 void DidPostSwapBuffers() override;
173 void DidAbortSwapBuffers() override;
[email protected]943528e2013-11-07 05:01:32174
dtrainor5ef644e2015-11-19 00:12:47175 // cc::RemoteProtoChannel implementation.
176 void SetProtoReceiver(ProtoReceiver* receiver) override;
177 void SendCompositorProto(const cc::proto::CompositorMessage& proto) override;
178
enne7f8fdde2014-12-10 21:32:09179 enum {
mpbed24c2c2015-06-05 20:57:13180 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK = 4,
181 MAX_OUTPUT_SURFACE_RETRIES = 5,
enne7f8fdde2014-12-10 21:32:09182 };
183
184 protected:
danakj6e3bf8012014-12-16 18:27:53185 RenderWidgetCompositor(RenderWidget* widget,
186 CompositorDependencies* compositor_deps);
[email protected]ba91a792013-02-06 09:48:28187
danakj6e3bf8012014-12-16 18:27:53188 void Initialize();
enne7f8fdde2014-12-10 21:32:09189 cc::LayerTreeHost* layer_tree_host() { return layer_tree_host_.get(); }
190
191 private:
wangxianzhu67d1fae2015-06-30 22:15:53192 void LayoutAndUpdateLayers();
193 void InvokeLayoutAndPaintCallback();
194 bool CompositeIsSynchronous() const;
195 void SynchronouslyComposite();
wangxianzhu372112e2015-05-06 23:01:57196
enne7f8fdde2014-12-10 21:32:09197 int num_failed_recreate_attempts_;
[email protected]ba91a792013-02-06 09:48:28198 RenderWidget* widget_;
danakj6e3bf8012014-12-16 18:27:53199 CompositorDependencies* compositor_deps_;
[email protected]ba91a792013-02-06 09:48:28200 scoped_ptr<cc::LayerTreeHost> layer_tree_host_;
sievers71c62dd52015-10-07 01:44:39201 bool never_visible_;
ernstm50aec922014-08-26 22:16:11202
wangxianzhu372112e2015-05-06 23:01:57203 blink::WebLayoutAndPaintAsyncCallback* layout_and_paint_async_callback_;
enne89e6c3aa2014-10-01 15:07:59204 scoped_ptr<cc::CopyOutputRequest> temporary_copy_output_request_;
205
dtrainor5ef644e2015-11-19 00:12:47206 cc::RemoteProtoChannel::ProtoReceiver* remote_proto_channel_receiver_;
207
enne7f8fdde2014-12-10 21:32:09208 base::WeakPtrFactory<RenderWidgetCompositor> weak_factory_;
[email protected]ba91a792013-02-06 09:48:28209};
210
211} // namespace content
212
213#endif // CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_