blob: e51ec83e181ac7ce62fa88e047294c57204d3543 [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
avi1023d012015-12-25 02:39:148#include <stdint.h>
9
[email protected]666d7cf2013-10-12 01:30:2910#include "base/callback.h"
[email protected]200a9c062013-05-20 04:34:3711#include "base/memory/weak_ptr.h"
[email protected]abb522162013-06-28 01:54:1612#include "base/time/time.h"
[email protected]752e2cf2013-10-21 21:41:1513#include "base/values.h"
mdjones2ee41afd2016-10-27 16:50:2014#include "cc/input/browser_controls_state.h"
sohan.jyoti127a06b42015-10-05 08:23:3415#include "cc/output/managed_memory_policy.h"
jamesrf313a212015-03-16 21:27:3716#include "cc/output/swap_promise.h"
[email protected]556fd292013-03-18 08:03:0417#include "cc/trees/layer_tree_host_client.h"
[email protected]943528e2013-11-07 05:01:3218#include "cc/trees/layer_tree_host_single_thread_client.h"
[email protected]556fd292013-03-18 08:03:0419#include "cc/trees/layer_tree_settings.h"
dtrainor5ef644e2015-11-19 00:12:4720#include "cc/trees/remote_proto_channel.h"
jamesrf313a212015-03-16 21:27:3721#include "cc/trees/swap_promise_monitor.h"
skyostil7759d7a2014-09-05 08:22:2322#include "content/common/content_export.h"
danakj6e3bf8012014-12-16 18:27:5323#include "content/renderer/gpu/compositor_dependencies.h"
[email protected]5c30b5e02013-05-30 03:46:0824#include "third_party/WebKit/public/platform/WebLayerTreeView.h"
tfarina3b0452d2014-12-31 15:20:0925#include "ui/gfx/geometry/rect.h"
[email protected]ba91a792013-02-06 09:48:2826
danakja40dd4482016-06-28 01:14:1027namespace base {
28class CommandLine;
[email protected]4b157662013-05-29 04:05:0529}
30
[email protected]ba91a792013-02-06 09:48:2831namespace cc {
loyso2cb3f32f2016-11-08 07:08:3432
33class AnimationHost;
[email protected]200a9c062013-05-20 04:34:3734class InputHandler;
[email protected]f7837a92013-08-21 03:00:0535class Layer;
khushalsagar61567792016-09-17 00:13:5836class LayerTreeHost;
dtrainor5ef644e2015-11-19 00:12:4737namespace proto {
38class CompositorMessage;
39}
danakja40dd4482016-06-28 01:14:1040}
dtrainor5ef644e2015-11-19 00:12:4741
ccameronf408cab2016-09-14 16:54:4242namespace gfx {
43class ColorSpace;
44}
45
danakja40dd4482016-06-28 01:14:1046namespace ui {
47class LatencyInfo;
[email protected]ba91a792013-02-06 09:48:2848}
49
50namespace content {
fsamuel78f86e42016-01-20 04:10:2351
52class RenderWidgetCompositorDelegate;
[email protected]ba91a792013-02-06 09:48:2853
skyostil7759d7a2014-09-05 08:22:2354class CONTENT_EXPORT RenderWidgetCompositor
55 : NON_EXPORTED_BASE(public blink::WebLayerTreeView),
56 NON_EXPORTED_BASE(public cc::LayerTreeHostClient),
dtrainor5ef644e2015-11-19 00:12:4757 NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient),
58 NON_EXPORTED_BASE(public cc::RemoteProtoChannel) {
[email protected]ba91a792013-02-06 09:48:2859 public:
60 // Attempt to construct and initialize a compositor instance for the widget
61 // with the given settings. Returns NULL if initialization fails.
dchengcedca5612016-04-09 01:40:1562 static std::unique_ptr<RenderWidgetCompositor> Create(
fsamuel78f86e42016-01-20 04:10:2363 RenderWidgetCompositorDelegate* delegate,
64 float device_scale_factor,
danakj6e3bf8012014-12-16 18:27:5365 CompositorDependencies* compositor_deps);
[email protected]ba91a792013-02-06 09:48:2866
avi5c77d212015-09-25 20:08:2567 ~RenderWidgetCompositor() override;
[email protected]ba91a792013-02-06 09:48:2868
danakja40dd4482016-06-28 01:14:1069 static cc::LayerTreeSettings GenerateLayerTreeSettings(
70 const base::CommandLine& cmd,
71 CompositorDependencies* compositor_deps,
72 float device_scale_factor);
73 static cc::ManagedMemoryPolicy GetGpuMemoryPolicy(
74 const cc::ManagedMemoryPolicy& policy);
75
sievers71c62dd52015-10-07 01:44:3976 void SetNeverVisible();
[email protected]200a9c062013-05-20 04:34:3777 const base::WeakPtr<cc::InputHandler>& GetInputHandler();
[email protected]971728d2013-10-26 10:39:3178 bool BeginMainFrameRequested() const;
[email protected]24ed0432013-04-24 07:50:3179 void SetNeedsDisplayOnAllLayers();
[email protected]206a3922013-05-17 06:34:1280 void SetRasterizeOnlyVisibleContent();
[email protected]0bc1f572013-04-17 01:46:3181 void SetNeedsRedrawRect(gfx::Rect damage_rect);
[email protected]7d08a9352013-10-15 08:24:5682 // Like setNeedsRedraw but forces the frame to be drawn, without early-outs.
83 // Redraw will be forced after the next commit
84 void SetNeedsForcedRedraw();
[email protected]6be422b2013-12-08 06:47:3185 // Calling CreateLatencyInfoSwapPromiseMonitor() to get a scoped
86 // LatencyInfoSwapPromiseMonitor. During the life time of the
igsollaeab34cc2015-02-20 11:33:3587 // LatencyInfoSwapPromiseMonitor, if SetNeedsCommit() or
88 // SetNeedsUpdateLayers() is called on LayerTreeHost, the original latency
89 // info will be turned into a LatencyInfoSwapPromise.
dchengcedca5612016-04-09 01:40:1590 std::unique_ptr<cc::SwapPromiseMonitor> CreateLatencyInfoSwapPromiseMonitor(
[email protected]6be422b2013-12-08 06:47:3191 ui::LatencyInfo* latency);
[email protected]8062ab262014-05-27 16:56:4392 // Calling QueueSwapPromise() to directly queue a SwapPromise into
93 // LayerTreeHost.
dchengcedca5612016-04-09 01:40:1594 void QueueSwapPromise(std::unique_ptr<cc::SwapPromise> swap_promise);
[email protected]586871b2014-07-22 17:05:1195 int GetSourceFrameNumber() const;
igsollaeab34cc2015-02-20 11:33:3596 void SetNeedsUpdateLayers();
[email protected]586871b2014-07-22 17:05:1197 void SetNeedsCommit();
[email protected]df09e052013-07-31 18:59:5098 void NotifyInputThrottledUntilCommit();
[email protected]f7837a92013-08-21 03:00:0599 const cc::Layer* GetRootLayer() const;
[email protected]67e703e12014-05-30 05:31:51100 int ScheduleMicroBenchmark(
[email protected]666d7cf2013-10-12 01:30:29101 const std::string& name,
dchengcedca5612016-04-09 01:40:15102 std::unique_ptr<base::Value> value,
103 const base::Callback<void(std::unique_ptr<base::Value>)>& callback);
104 bool SendMessageToMicroBenchmark(int id, std::unique_ptr<base::Value> value);
fsamuele0f705b2016-10-01 14:07:14105 void SetFrameSinkId(const cc::FrameSinkId& frame_sink_id);
dtrainor5ef644e2015-11-19 00:12:47106 void OnHandleCompositorProto(const std::vector<uint8_t>& proto);
oshima750cb4342015-10-31 00:59:01107 void SetPaintedDeviceScaleFactor(float device_scale);
ccameronf408cab2016-09-14 16:54:42108 void SetDeviceColorSpace(const gfx::ColorSpace& color_space);
[email protected]9ed83fe2013-02-27 01:52:28109
[email protected]ba91a792013-02-06 09:48:28110 // WebLayerTreeView implementation.
avi5c77d212015-09-25 20:08:25111 void setRootLayer(const blink::WebLayer& layer) override;
112 void clearRootLayer() override;
113 void attachCompositorAnimationTimeline(
loyso26f3c552016-02-10 23:54:34114 cc::AnimationTimeline* compositor_timeline) override;
avi5c77d212015-09-25 20:08:25115 void detachCompositorAnimationTimeline(
loyso26f3c552016-02-10 23:54:34116 cc::AnimationTimeline* compositor_timeline) override;
avi5c77d212015-09-25 20:08:25117 void setViewportSize(const blink::WebSize& device_viewport_size) override;
eseckler23d8f262016-09-22 12:50:53118 blink::WebSize getViewportSize() const override;
[email protected]180ef242013-11-07 06:50:46119 virtual blink::WebFloatPoint adjustEventPointForPinchZoom(
120 const blink::WebFloatPoint& point) const;
avi5c77d212015-09-25 20:08:25121 void setDeviceScaleFactor(float device_scale) override;
avi5c77d212015-09-25 20:08:25122 void setBackgroundColor(blink::WebColor color) override;
123 void setHasTransparentBackground(bool transparent) override;
124 void setVisible(bool visible) override;
125 void setPageScaleFactorAndLimits(float page_scale_factor,
126 float minimum,
127 float maximum) override;
128 void startPageScaleAnimation(const blink::WebPoint& destination,
129 bool use_anchor,
130 float new_page_scale,
131 double duration_sec) override;
dglazkov4969a3e2016-05-20 21:13:51132 bool hasPendingPageScaleAnimation() const override;
avi5c77d212015-09-25 20:08:25133 void heuristicsForGpuRasterizationUpdated(bool matches_heuristics) override;
avi5c77d212015-09-25 20:08:25134 void setNeedsBeginFrame() override;
135 void setNeedsCompositorUpdate() override;
136 void didStopFlinging() override;
137 void layoutAndPaintAsync(
138 blink::WebLayoutAndPaintAsyncCallback* callback) override;
139 void compositeAndReadbackAsync(
140 blink::WebCompositeAndReadbackAsyncCallback* callback) override;
141 void setDeferCommits(bool defer_commits) override;
avi5c77d212015-09-25 20:08:25142 void registerViewportLayers(
ccameron8230b68b2014-11-21 19:25:18143 const blink::WebLayer* overscrollElasticityLayer,
144 const blink::WebLayer* pageScaleLayer,
145 const blink::WebLayer* innerViewportScrollLayer,
146 const blink::WebLayer* outerViewportScrollLayer) override;
avi5c77d212015-09-25 20:08:25147 void clearViewportLayers() override;
148 void registerSelection(const blink::WebSelection& selection) override;
149 void clearSelection() override;
flackrf54e9b42016-05-31 15:20:10150 void setMutatorClient(
151 std::unique_ptr<blink::WebCompositorMutatorClient>) override;
enne8a4cb7862016-10-04 20:36:45152 void forceRecalculateRasterScales() override;
dtapuskaf206a40d2016-02-05 21:36:02153 void setEventListenerProperties(
154 blink::WebEventListenerClass eventClass,
155 blink::WebEventListenerProperties properties) override;
156 blink::WebEventListenerProperties eventListenerProperties(
157 blink::WebEventListenerClass eventClass) const override;
dtapuskaf024e552016-02-03 01:19:46158 void setHaveScrollEventHandlers(bool) override;
159 bool haveScrollEventHandlers() const override;
avi5c77d212015-09-25 20:08:25160 int layerTreeId() const override;
161 void setShowFPSCounter(bool show) override;
162 void setShowPaintRects(bool show) override;
163 void setShowDebugBorders(bool show) override;
164 void setShowScrollBottleneckRects(bool show) override;
aelias6004fe02015-02-07 21:43:01165
mdjones2ee41afd2016-10-27 16:50:20166 void updateBrowserControlsState(blink::WebBrowserControlsState constraints,
167 blink::WebBrowserControlsState current,
168 bool animate) override;
169 void setBrowserControlsHeight(float height, bool shrink) override;
170 void setBrowserControlsShownRatio(float) override;
ianwene5fc5782016-08-18 04:05:15171 // TODO(ianwen): Move this method to WebLayerTreeView and implement main
172 // thread scrolling.
173 virtual void setBottomControlsHeight(float height);
[email protected]ba91a792013-02-06 09:48:28174
175 // cc::LayerTreeHostClient implementation.
caseq7d2f4c92015-02-04 16:43:27176 void WillBeginMainFrame() override;
dcheng6d18e402014-10-21 12:32:52177 void DidBeginMainFrame() override;
178 void BeginMainFrame(const cc::BeginFrameArgs& args) override;
rmcilroy0a19362a2015-02-18 12:34:25179 void BeginMainFrameNotExpectedSoon() override;
wkorman7265db012015-11-03 04:08:25180 void UpdateLayerTreeHost() override;
miletus7a221752015-02-04 20:44:49181 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
182 const gfx::Vector2dF& outer_delta,
ccameron98be9ac2014-12-09 19:56:32183 const gfx::Vector2dF& elastic_overscroll_delta,
dcheng6d18e402014-10-21 12:32:52184 float page_scale,
185 float top_controls_delta) override;
danakj1120f4c2016-09-15 02:05:32186 void RequestNewCompositorFrameSink() override;
187 void DidInitializeCompositorFrameSink() override;
188 void DidFailToInitializeCompositorFrameSink() override;
dcheng6d18e402014-10-21 12:32:52189 void WillCommit() override;
190 void DidCommit() override;
191 void DidCommitAndDrawFrame() override;
danakj9d124422016-10-14 03:15:08192 void DidReceiveCompositorFrameAck() override;
rouslanf7ebd8832015-01-22 01:54:14193 void DidCompletePageScaleAnimation() override;
[email protected]ba91a792013-02-06 09:48:28194
[email protected]943528e2013-11-07 05:01:32195 // cc::LayerTreeHostSingleThreadClient implementation.
danakj53eccbc2016-03-02 22:51:07196 void RequestScheduleAnimation() override;
danakj6c872fc02016-10-22 04:29:49197 void DidSubmitCompositorFrame() override;
198 void DidLoseCompositorFrameSink() override;
[email protected]943528e2013-11-07 05:01:32199
dtrainor5ef644e2015-11-19 00:12:47200 // cc::RemoteProtoChannel implementation.
201 void SetProtoReceiver(ProtoReceiver* receiver) override;
202 void SendCompositorProto(const cc::proto::CompositorMessage& proto) override;
203
enne7f8fdde2014-12-10 21:32:09204 enum {
danakj1120f4c2016-09-15 02:05:32205 COMPOSITOR_FRAME_SINK_RETRIES_BEFORE_FALLBACK = 4,
206 MAX_COMPOSITOR_FRAME_SINK_RETRIES = 5,
enne7f8fdde2014-12-10 21:32:09207 };
208
209 protected:
oshima50872a72016-03-04 13:26:18210 friend class RenderViewImplScaleFactorTest;
211
fsamuel78f86e42016-01-20 04:10:23212 RenderWidgetCompositor(RenderWidgetCompositorDelegate* delegate,
danakj6e3bf8012014-12-16 18:27:53213 CompositorDependencies* compositor_deps);
[email protected]ba91a792013-02-06 09:48:28214
fsamuel78f86e42016-01-20 04:10:23215 void Initialize(float device_scale_factor);
khushalsagar61567792016-09-17 00:13:58216 cc::LayerTreeHost* layer_tree_host() { return layer_tree_host_.get(); }
enne7f8fdde2014-12-10 21:32:09217
218 private:
wangxianzhu67d1fae2015-06-30 22:15:53219 void LayoutAndUpdateLayers();
220 void InvokeLayoutAndPaintCallback();
221 bool CompositeIsSynchronous() const;
222 void SynchronouslyComposite();
wangxianzhu372112e2015-05-06 23:01:57223
enne7f8fdde2014-12-10 21:32:09224 int num_failed_recreate_attempts_;
fsamuel78f86e42016-01-20 04:10:23225 RenderWidgetCompositorDelegate* const delegate_;
226 CompositorDependencies* const compositor_deps_;
danakja40dd4482016-06-28 01:14:10227 const bool threaded_;
loyso2cb3f32f2016-11-08 07:08:34228 std::unique_ptr<cc::AnimationHost> animation_host_;
khushalsagar61567792016-09-17 00:13:58229 std::unique_ptr<cc::LayerTreeHost> layer_tree_host_;
sievers71c62dd52015-10-07 01:44:39230 bool never_visible_;
ernstm50aec922014-08-26 22:16:11231
wangxianzhu372112e2015-05-06 23:01:57232 blink::WebLayoutAndPaintAsyncCallback* layout_and_paint_async_callback_;
enne89e6c3aa2014-10-01 15:07:59233
dtrainor5ef644e2015-11-19 00:12:47234 cc::RemoteProtoChannel::ProtoReceiver* remote_proto_channel_receiver_;
235
enne7f8fdde2014-12-10 21:32:09236 base::WeakPtrFactory<RenderWidgetCompositor> weak_factory_;
[email protected]ba91a792013-02-06 09:48:28237};
238
239} // namespace content
240
241#endif // CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_