blob: 5ef3a5144917fa1aa3bad83922281e5c6a186ddd [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"
CJ DiMegliof3ca99e2017-11-22 23:12:0115#include "cc/trees/layer_tree_host.h"
[email protected]556fd292013-03-18 08:03:0416#include "cc/trees/layer_tree_host_client.h"
[email protected]943528e2013-11-07 05:01:3217#include "cc/trees/layer_tree_host_single_thread_client.h"
[email protected]556fd292013-03-18 08:03:0418#include "cc/trees/layer_tree_settings.h"
danakjba65a0912017-09-21 16:38:4219#include "cc/trees/managed_memory_policy.h"
20#include "cc/trees/swap_promise.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"
jonrossa2ff4f82018-02-16 17:27:4623#include "content/common/render_frame_metadata.mojom.h"
danakj6e3bf8012014-12-16 18:27:5324#include "content/renderer/gpu/compositor_dependencies.h"
Khushal3e96e662017-10-30 23:16:5025#include "services/metrics/public/cpp/ukm_recorder.h"
[email protected]5c30b5e02013-05-30 03:46:0826#include "third_party/WebKit/public/platform/WebLayerTreeView.h"
tfarina3b0452d2014-12-31 15:20:0927#include "ui/gfx/geometry/rect.h"
[email protected]ba91a792013-02-06 09:48:2828
danakja40dd4482016-06-28 01:14:1029namespace base {
30class CommandLine;
[email protected]4b157662013-05-29 04:05:0531}
32
[email protected]ba91a792013-02-06 09:48:2833namespace cc {
loyso2cb3f32f2016-11-08 07:08:3434
35class AnimationHost;
[email protected]200a9c062013-05-20 04:34:3736class InputHandler;
[email protected]f7837a92013-08-21 03:00:0537class Layer;
danakjc7afae52017-06-20 21:12:4138class LayerTreeFrameSink;
khushalsagar61567792016-09-17 00:13:5839class LayerTreeHost;
loyso6e6efc42017-01-21 02:23:0340class MutatorHost;
danakja40dd4482016-06-28 01:14:1041}
dtrainor5ef644e2015-11-19 00:12:4742
ccameronf408cab2016-09-14 16:54:4243namespace gfx {
44class ColorSpace;
45}
46
danakja40dd4482016-06-28 01:14:1047namespace ui {
48class LatencyInfo;
[email protected]ba91a792013-02-06 09:48:2849}
50
51namespace content {
fsamuel78f86e42016-01-20 04:10:2352class RenderWidgetCompositorDelegate;
boliu6f8ab172017-01-10 05:06:3653struct ScreenInfo;
[email protected]ba91a792013-02-06 09:48:2854
skyostil7759d7a2014-09-05 08:22:2355class CONTENT_EXPORT RenderWidgetCompositor
Nico Weber43ddd7a32017-08-15 19:19:2756 : public blink::WebLayerTreeView,
57 public cc::LayerTreeHostClient,
58 public cc::LayerTreeHostSingleThreadClient {
Scott Haseleyc3f876b2017-08-10 00:40:3659 using ReportTimeCallback =
60 base::Callback<void(blink::WebLayerTreeView::SwapResult, double)>;
panicker34797fd2017-05-05 04:09:2661
[email protected]ba91a792013-02-06 09:48:2862 public:
63 // Attempt to construct and initialize a compositor instance for the widget
64 // with the given settings. Returns NULL if initialization fails.
dchengcedca5612016-04-09 01:40:1565 static std::unique_ptr<RenderWidgetCompositor> Create(
fsamuel78f86e42016-01-20 04:10:2366 RenderWidgetCompositorDelegate* delegate,
danakj6e3bf8012014-12-16 18:27:5367 CompositorDependencies* compositor_deps);
[email protected]ba91a792013-02-06 09:48:2868
avi5c77d212015-09-25 20:08:2569 ~RenderWidgetCompositor() override;
[email protected]ba91a792013-02-06 09:48:2870
danakja40dd4482016-06-28 01:14:1071 static cc::LayerTreeSettings GenerateLayerTreeSettings(
72 const base::CommandLine& cmd,
73 CompositorDependencies* compositor_deps,
boliu6f8ab172017-01-10 05:06:3674 float device_scale_factor,
wjmacleana755e302017-04-20 00:43:1675 bool is_for_subframe,
Walter Kormandc3eca652017-08-15 21:00:4576 const ScreenInfo& screen_info,
77 bool is_threaded);
loyso6e6efc42017-01-21 02:23:0378 static std::unique_ptr<cc::LayerTreeHost> CreateLayerTreeHost(
79 cc::LayerTreeHostClient* client,
80 cc::LayerTreeHostSingleThreadClient* single_thread_client,
81 cc::MutatorHost* mutator_host,
82 CompositorDependencies* deps,
83 float device_scale_factor,
84 const ScreenInfo& screen_info);
85
86 void Initialize(std::unique_ptr<cc::LayerTreeHost> layer_tree_host,
87 std::unique_ptr<cc::AnimationHost> animation_host);
88
danakja40dd4482016-06-28 01:14:1089 static cc::ManagedMemoryPolicy GetGpuMemoryPolicy(
Vladimir Levin0375ae82017-07-18 03:06:4090 const cc::ManagedMemoryPolicy& policy,
91 const ScreenInfo& screen_info);
danakja40dd4482016-06-28 01:14:1092
sievers71c62dd52015-10-07 01:44:3993 void SetNeverVisible();
[email protected]200a9c062013-05-20 04:34:3794 const base::WeakPtr<cc::InputHandler>& GetInputHandler();
[email protected]24ed0432013-04-24 07:50:3195 void SetNeedsDisplayOnAllLayers();
[email protected]206a3922013-05-17 06:34:1296 void SetRasterizeOnlyVisibleContent();
[email protected]0bc1f572013-04-17 01:46:3197 void SetNeedsRedrawRect(gfx::Rect damage_rect);
Fady Samuel319e429c2017-10-02 18:31:5598
99 bool IsSurfaceSynchronizationEnabled() const;
100
[email protected]7d08a9352013-10-15 08:24:56101 // Like setNeedsRedraw but forces the frame to be drawn, without early-outs.
102 // Redraw will be forced after the next commit
103 void SetNeedsForcedRedraw();
[email protected]6be422b2013-12-08 06:47:31104 // Calling CreateLatencyInfoSwapPromiseMonitor() to get a scoped
105 // LatencyInfoSwapPromiseMonitor. During the life time of the
igsollaeab34cc2015-02-20 11:33:35106 // LatencyInfoSwapPromiseMonitor, if SetNeedsCommit() or
107 // SetNeedsUpdateLayers() is called on LayerTreeHost, the original latency
108 // info will be turned into a LatencyInfoSwapPromise.
dchengcedca5612016-04-09 01:40:15109 std::unique_ptr<cc::SwapPromiseMonitor> CreateLatencyInfoSwapPromiseMonitor(
[email protected]6be422b2013-12-08 06:47:31110 ui::LatencyInfo* latency);
[email protected]8062ab262014-05-27 16:56:43111 // Calling QueueSwapPromise() to directly queue a SwapPromise into
112 // LayerTreeHost.
dchengcedca5612016-04-09 01:40:15113 void QueueSwapPromise(std::unique_ptr<cc::SwapPromise> swap_promise);
[email protected]586871b2014-07-22 17:05:11114 int GetSourceFrameNumber() const;
[email protected]df09e052013-07-31 18:59:50115 void NotifyInputThrottledUntilCommit();
[email protected]f7837a92013-08-21 03:00:05116 const cc::Layer* GetRootLayer() const;
[email protected]67e703e12014-05-30 05:31:51117 int ScheduleMicroBenchmark(
[email protected]666d7cf2013-10-12 01:30:29118 const std::string& name,
dchengcedca5612016-04-09 01:40:15119 std::unique_ptr<base::Value> value,
120 const base::Callback<void(std::unique_ptr<base::Value>)>& callback);
121 bool SendMessageToMicroBenchmark(int id, std::unique_ptr<base::Value> value);
Fady Samueld5c26182017-07-12 02:43:33122 void SetFrameSinkId(const viz::FrameSinkId& frame_sink_id);
oshima750cb4342015-10-31 00:59:01123 void SetPaintedDeviceScaleFactor(float device_scale);
ccameron2c6d2702017-03-08 19:42:42124 void SetRasterColorSpace(const gfx::ColorSpace& color_space);
wjmaclean1d970622017-01-21 22:28:24125 void SetIsForOopif(bool is_for_oopif);
fsamuel4c5c87142017-03-14 03:14:26126 void SetContentSourceId(uint32_t source_id);
Sadrul Habib Chowdhury04d5dd4d2017-08-10 01:59:27127 void SetViewportSize(const gfx::Size& device_viewport_size,
128 const viz::LocalSurfaceId& local_surface_id);
Khushal3e96e662017-10-30 23:16:50129 void SetURLForUkm(const GURL& url);
[email protected]9ed83fe2013-02-27 01:52:28130
[email protected]ba91a792013-02-06 09:48:28131 // WebLayerTreeView implementation.
Fady Samueld5c26182017-07-12 02:43:33132 viz::FrameSinkId GetFrameSinkId() override;
Blink Reformat1c4d759e2017-04-09 16:34:54133 void SetRootLayer(const blink::WebLayer& layer) override;
134 void ClearRootLayer() override;
135 cc::AnimationHost* CompositorAnimationHost() override;
Blink Reformat1c4d759e2017-04-09 16:34:54136 blink::WebSize GetViewportSize() const override;
[email protected]180ef242013-11-07 06:50:46137 virtual blink::WebFloatPoint adjustEventPointForPinchZoom(
138 const blink::WebFloatPoint& point) const;
Blink Reformat1c4d759e2017-04-09 16:34:54139 void SetDeviceScaleFactor(float device_scale) override;
140 void SetBackgroundColor(blink::WebColor color) override;
141 void SetVisible(bool visible) override;
142 void SetPageScaleFactorAndLimits(float page_scale_factor,
avi5c77d212015-09-25 20:08:25143 float minimum,
144 float maximum) override;
Blink Reformat1c4d759e2017-04-09 16:34:54145 void StartPageScaleAnimation(const blink::WebPoint& destination,
avi5c77d212015-09-25 20:08:25146 bool use_anchor,
147 float new_page_scale,
148 double duration_sec) override;
Blink Reformat1c4d759e2017-04-09 16:34:54149 bool HasPendingPageScaleAnimation() const override;
150 void HeuristicsForGpuRasterizationUpdated(bool matches_heuristics) override;
151 void SetNeedsBeginFrame() override;
152 void DidStopFlinging() override;
153 void LayoutAndPaintAsync(
avi5c77d212015-09-25 20:08:25154 blink::WebLayoutAndPaintAsyncCallback* callback) override;
Blink Reformat1c4d759e2017-04-09 16:34:54155 void CompositeAndReadbackAsync(
avi5c77d212015-09-25 20:08:25156 blink::WebCompositeAndReadbackAsyncCallback* callback) override;
Khushal4b6c41882018-02-16 09:02:10157 void SynchronouslyCompositeNoRasterForTesting() override;
Blink Reformat1c4d759e2017-04-09 16:34:54158 void SetDeferCommits(bool defer_commits) override;
159 void RegisterViewportLayers(
Chandan Padhi198800bd12017-07-07 08:15:07160 const blink::WebLayerTreeView::ViewportLayers& viewport_layers) override;
Blink Reformat1c4d759e2017-04-09 16:34:54161 void ClearViewportLayers() override;
162 void RegisterSelection(const blink::WebSelection& selection) override;
163 void ClearSelection() override;
Jeremy Romanebb26832018-02-08 15:20:07164 void SetMutatorClient(std::unique_ptr<cc::LayerTreeMutator>) override;
Blink Reformat1c4d759e2017-04-09 16:34:54165 void ForceRecalculateRasterScales() override;
166 void SetEventListenerProperties(
dtapuskaf206a40d2016-02-05 21:36:02167 blink::WebEventListenerClass eventClass,
168 blink::WebEventListenerProperties properties) override;
Blink Reformat1c4d759e2017-04-09 16:34:54169 void UpdateEventRectsForSubframeIfNecessary() override;
170 blink::WebEventListenerProperties EventListenerProperties(
dtapuskaf206a40d2016-02-05 21:36:02171 blink::WebEventListenerClass eventClass) const override;
Blink Reformat1c4d759e2017-04-09 16:34:54172 void SetHaveScrollEventHandlers(bool) override;
173 bool HaveScrollEventHandlers() const override;
174 int LayerTreeId() const override;
175 void SetShowFPSCounter(bool show) override;
176 void SetShowPaintRects(bool show) override;
177 void SetShowDebugBorders(bool show) override;
178 void SetShowScrollBottleneckRects(bool show) override;
panicker34797fd2017-05-05 04:09:26179 void NotifySwapTime(ReportTimeCallback callback) override;
aelias6004fe02015-02-07 21:43:01180
Blink Reformat1c4d759e2017-04-09 16:34:54181 void UpdateBrowserControlsState(blink::WebBrowserControlsState constraints,
mdjones2ee41afd2016-10-27 16:50:20182 blink::WebBrowserControlsState current,
183 bool animate) override;
Matthew Jones7e156182017-07-21 22:21:33184 void SetBrowserControlsHeight(float top_height,
185 float bottom_height,
186 bool shrink) override;
Blink Reformat1c4d759e2017-04-09 16:34:54187 void SetBrowserControlsShownRatio(float) override;
vmpstrbf56d562017-06-06 20:16:38188 void RequestDecode(const PaintImage& image,
Yuta Kitamura0ee25a86e2017-11-21 08:35:47189 base::OnceCallback<void(bool)> callback) override;
[email protected]ba91a792013-02-06 09:48:28190
Sandra Sun2288e8532017-11-30 22:50:16191 void SetOverscrollBehavior(const blink::WebOverscrollBehavior&) override;
sunyunjiabbea8a92017-08-31 11:18:54192
[email protected]ba91a792013-02-06 09:48:28193 // cc::LayerTreeHostClient implementation.
caseq7d2f4c92015-02-04 16:43:27194 void WillBeginMainFrame() override;
dcheng6d18e402014-10-21 12:32:52195 void DidBeginMainFrame() override;
Fady Samuelc296f5fb2017-07-21 04:02:19196 void BeginMainFrame(const viz::BeginFrameArgs& args) override;
rmcilroy0a19362a2015-02-18 12:34:25197 void BeginMainFrameNotExpectedSoon() override;
delphick9db74aa2017-05-05 10:20:49198 void BeginMainFrameNotExpectedUntil(base::TimeTicks time) override;
Eric Seckler8af8c0e52018-01-17 23:45:53199 void UpdateLayerTreeHost(VisualStateUpdate requested_update) override;
miletus7a221752015-02-04 20:44:49200 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
201 const gfx::Vector2dF& outer_delta,
ccameron98be9ac2014-12-09 19:56:32202 const gfx::Vector2dF& elastic_overscroll_delta,
dcheng6d18e402014-10-21 12:32:52203 float page_scale,
204 float top_controls_delta) override;
sahel1b47fda72017-03-28 17:03:07205 void RecordWheelAndTouchScrollingCount(bool has_scrolled_by_wheel,
206 bool has_scrolled_by_touch) override;
danakjc7afae52017-06-20 21:12:41207 void RequestNewLayerTreeFrameSink() override;
208 void DidInitializeLayerTreeFrameSink() override;
209 void DidFailToInitializeLayerTreeFrameSink() override;
dcheng6d18e402014-10-21 12:32:52210 void WillCommit() override;
211 void DidCommit() override;
212 void DidCommitAndDrawFrame() override;
danakj9d124422016-10-14 03:15:08213 void DidReceiveCompositorFrameAck() override;
rouslanf7ebd8832015-01-22 01:54:14214 void DidCompletePageScaleAnimation() override;
wjmacleana755e302017-04-20 00:43:16215 bool IsForSubframe() override;
[email protected]ba91a792013-02-06 09:48:28216
[email protected]943528e2013-11-07 05:01:32217 // cc::LayerTreeHostSingleThreadClient implementation.
danakj53eccbc2016-03-02 22:51:07218 void RequestScheduleAnimation() override;
danakj6c872fc02016-10-22 04:29:49219 void DidSubmitCompositorFrame() override;
danakjc7afae52017-06-20 21:12:41220 void DidLoseLayerTreeFrameSink() override;
Dan Elphick95929fd52017-06-13 09:15:07221 void RequestBeginMainFrameNotExpected(bool new_state) override;
[email protected]943528e2013-11-07 05:01:32222
CJ DiMegliof3ca99e2017-11-22 23:12:01223 const cc::LayerTreeSettings& GetLayerTreeSettings() const {
224 return layer_tree_host_->GetSettings();
225 }
226
jonrossa2ff4f82018-02-16 17:27:46227 // Creates a cc::RenderFrameMetadataObserver, which is sent to the compositor
228 // thread for binding.
229 void CreateRenderFrameObserver(
230 mojom::RenderFrameMetadataObserverRequest request,
231 mojom::RenderFrameMetadataObserverClientPtrInfo client_info);
232
enne7f8fdde2014-12-10 21:32:09233 protected:
oshima50872a72016-03-04 13:26:18234 friend class RenderViewImplScaleFactorTest;
235
fsamuel78f86e42016-01-20 04:10:23236 RenderWidgetCompositor(RenderWidgetCompositorDelegate* delegate,
danakj6e3bf8012014-12-16 18:27:53237 CompositorDependencies* compositor_deps);
[email protected]ba91a792013-02-06 09:48:28238
khushalsagar61567792016-09-17 00:13:58239 cc::LayerTreeHost* layer_tree_host() { return layer_tree_host_.get(); }
enne7f8fdde2014-12-10 21:32:09240
241 private:
danakjc7afae52017-06-20 21:12:41242 void SetLayerTreeFrameSink(
243 std::unique_ptr<cc::LayerTreeFrameSink> layer_tree_frame_sink);
wangxianzhu67d1fae2015-06-30 22:15:53244 void InvokeLayoutAndPaintCallback();
245 bool CompositeIsSynchronous() const;
Khushal4b6c41882018-02-16 09:02:10246 void SynchronouslyComposite(bool raster,
247 std::unique_ptr<cc::SwapPromise> swap_promise);
wangxianzhu372112e2015-05-06 23:01:57248
fsamuel78f86e42016-01-20 04:10:23249 RenderWidgetCompositorDelegate* const delegate_;
250 CompositorDependencies* const compositor_deps_;
danakja40dd4482016-06-28 01:14:10251 const bool threaded_;
loyso2cb3f32f2016-11-08 07:08:34252 std::unique_ptr<cc::AnimationHost> animation_host_;
khushalsagar61567792016-09-17 00:13:58253 std::unique_ptr<cc::LayerTreeHost> layer_tree_host_;
sievers71c62dd52015-10-07 01:44:39254 bool never_visible_;
wjmaclean1d970622017-01-21 22:28:24255 bool is_for_oopif_;
ernstm50aec922014-08-26 22:16:11256
Bo Liud5d385822017-11-10 18:30:47257 bool layer_tree_frame_sink_request_failed_while_invisible_ = false;
258
Khushal4b6c41882018-02-16 09:02:10259 bool in_synchronous_compositor_update_ = false;
wangxianzhu372112e2015-05-06 23:01:57260 blink::WebLayoutAndPaintAsyncCallback* layout_and_paint_async_callback_;
enne89e6c3aa2014-10-01 15:07:59261
Fady Samueld5c26182017-07-12 02:43:33262 viz::FrameSinkId frame_sink_id_;
samansd5db2502017-01-13 23:18:27263
enne7f8fdde2014-12-10 21:32:09264 base::WeakPtrFactory<RenderWidgetCompositor> weak_factory_;
panicker34797fd2017-05-05 04:09:26265
266 DISALLOW_COPY_AND_ASSIGN(RenderWidgetCompositor);
[email protected]ba91a792013-02-06 09:48:28267};
268
269} // namespace content
270
271#endif // CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_