blob: 239362cb7cafd1d5a16a45475339a69d969906ac [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]8062ab262014-05-27 16:56:4312#include "cc/base/swap_promise.h"
[email protected]6be422b2013-12-08 06:47:3113#include "cc/base/swap_promise_monitor.h"
[email protected]9b003482013-05-21 14:00:1714#include "cc/input/top_controls_state.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"
skyostil7759d7a2014-09-05 08:22:2318#include "content/common/content_export.h"
danakj6e3bf8012014-12-16 18:27:5319#include "content/renderer/gpu/compositor_dependencies.h"
[email protected]5c30b5e02013-05-30 03:46:0820#include "third_party/WebKit/public/platform/WebLayerTreeView.h"
[email protected]9f4f6a32013-09-04 21:35:1221#include "third_party/skia/include/core/SkBitmap.h"
tfarina3b0452d2014-12-31 15:20:0922#include "ui/gfx/geometry/rect.h"
[email protected]ba91a792013-02-06 09:48:2823
[email protected]4b157662013-05-29 04:05:0524namespace ui {
25struct LatencyInfo;
26}
27
[email protected]ba91a792013-02-06 09:48:2828namespace cc {
enne89e6c3aa2014-10-01 15:07:5929class CopyOutputRequest;
[email protected]200a9c062013-05-20 04:34:3730class InputHandler;
[email protected]f7837a92013-08-21 03:00:0531class Layer;
[email protected]ba91a792013-02-06 09:48:2832class LayerTreeHost;
33}
34
35namespace content {
36class RenderWidget;
37
skyostil7759d7a2014-09-05 08:22:2338class CONTENT_EXPORT RenderWidgetCompositor
39 : NON_EXPORTED_BASE(public blink::WebLayerTreeView),
40 NON_EXPORTED_BASE(public cc::LayerTreeHostClient),
41 NON_EXPORTED_BASE(public cc::LayerTreeHostSingleThreadClient) {
[email protected]ba91a792013-02-06 09:48:2842 public:
43 // Attempt to construct and initialize a compositor instance for the widget
44 // with the given settings. Returns NULL if initialization fails.
danakj6e3bf8012014-12-16 18:27:5345 static scoped_ptr<RenderWidgetCompositor> Create(
46 RenderWidget* widget,
47 CompositorDependencies* compositor_deps);
[email protected]ba91a792013-02-06 09:48:2848
49 virtual ~RenderWidgetCompositor();
50
[email protected]200a9c062013-05-20 04:34:3751 const base::WeakPtr<cc::InputHandler>& GetInputHandler();
[email protected]971728d2013-10-26 10:39:3152 bool BeginMainFrameRequested() const;
[email protected]24ed0432013-04-24 07:50:3153 void SetNeedsDisplayOnAllLayers();
[email protected]206a3922013-05-17 06:34:1254 void SetRasterizeOnlyVisibleContent();
[email protected]0bc1f572013-04-17 01:46:3155 void SetNeedsRedrawRect(gfx::Rect damage_rect);
[email protected]7d08a9352013-10-15 08:24:5656 // Like setNeedsRedraw but forces the frame to be drawn, without early-outs.
57 // Redraw will be forced after the next commit
58 void SetNeedsForcedRedraw();
[email protected]6be422b2013-12-08 06:47:3159 // Calling CreateLatencyInfoSwapPromiseMonitor() to get a scoped
60 // LatencyInfoSwapPromiseMonitor. During the life time of the
igsollaeab34cc2015-02-20 11:33:3561 // LatencyInfoSwapPromiseMonitor, if SetNeedsCommit() or
62 // SetNeedsUpdateLayers() is called on LayerTreeHost, the original latency
63 // info will be turned into a LatencyInfoSwapPromise.
[email protected]6be422b2013-12-08 06:47:3164 scoped_ptr<cc::SwapPromiseMonitor> CreateLatencyInfoSwapPromiseMonitor(
65 ui::LatencyInfo* latency);
[email protected]8062ab262014-05-27 16:56:4366 // Calling QueueSwapPromise() to directly queue a SwapPromise into
67 // LayerTreeHost.
68 void QueueSwapPromise(scoped_ptr<cc::SwapPromise> swap_promise);
[email protected]6e89eb72013-07-23 13:28:2269 int GetLayerTreeId() const;
[email protected]586871b2014-07-22 17:05:1170 int GetSourceFrameNumber() const;
igsollaeab34cc2015-02-20 11:33:3571 void SetNeedsUpdateLayers();
[email protected]586871b2014-07-22 17:05:1172 void SetNeedsCommit();
[email protected]df09e052013-07-31 18:59:5073 void NotifyInputThrottledUntilCommit();
[email protected]f7837a92013-08-21 03:00:0574 const cc::Layer* GetRootLayer() const;
[email protected]67e703e12014-05-30 05:31:5175 int ScheduleMicroBenchmark(
[email protected]666d7cf2013-10-12 01:30:2976 const std::string& name,
[email protected]752e2cf2013-10-21 21:41:1577 scoped_ptr<base::Value> value,
[email protected]666d7cf2013-10-12 01:30:2978 const base::Callback<void(scoped_ptr<base::Value>)>& callback);
[email protected]67e703e12014-05-30 05:31:5179 bool SendMessageToMicroBenchmark(int id, scoped_ptr<base::Value> value);
danakj018271e32014-12-16 21:17:2680 void StartCompositor();
[email protected]9ed83fe2013-02-27 01:52:2881
[email protected]ba91a792013-02-06 09:48:2882 // WebLayerTreeView implementation.
[email protected]180ef242013-11-07 06:50:4683 virtual void setRootLayer(const blink::WebLayer& layer);
[email protected]ba91a792013-02-06 09:48:2884 virtual void clearRootLayer();
85 virtual void setViewportSize(
[email protected]180ef242013-11-07 06:50:4686 const blink::WebSize& unused_deprecated,
87 const blink::WebSize& device_viewport_size);
[email protected]4a571892014-05-22 05:52:3088 virtual void setViewportSize(const blink::WebSize& device_viewport_size);
[email protected]180ef242013-11-07 06:50:4689 virtual blink::WebSize layoutViewportSize() const;
90 virtual blink::WebSize deviceViewportSize() const;
91 virtual blink::WebFloatPoint adjustEventPointForPinchZoom(
92 const blink::WebFloatPoint& point) const;
[email protected]ba91a792013-02-06 09:48:2893 virtual void setDeviceScaleFactor(float device_scale);
94 virtual float deviceScaleFactor() const;
[email protected]180ef242013-11-07 06:50:4695 virtual void setBackgroundColor(blink::WebColor color);
[email protected]ba91a792013-02-06 09:48:2896 virtual void setHasTransparentBackground(bool transparent);
97 virtual void setVisible(bool visible);
98 virtual void setPageScaleFactorAndLimits(float page_scale_factor,
99 float minimum,
100 float maximum);
[email protected]180ef242013-11-07 06:50:46101 virtual void startPageScaleAnimation(const blink::WebPoint& destination,
[email protected]ba91a792013-02-06 09:48:28102 bool use_anchor,
103 float new_page_scale,
104 double duration_sec);
[email protected]27a747d2014-04-30 10:23:01105 virtual void heuristicsForGpuRasterizationUpdated(bool matches_heuristics);
[email protected]8b9e52b2014-01-17 16:35:31106 virtual void setNeedsAnimate();
107 virtual bool commitRequested() const;
[email protected]ba91a792013-02-06 09:48:28108 virtual void didStopFlinging();
[email protected]9e4067f42014-05-02 20:57:10109 virtual void compositeAndReadbackAsync(
110 blink::WebCompositeAndReadbackAsyncCallback* callback);
[email protected]ba91a792013-02-06 09:48:28111 virtual void finishAllRendering();
112 virtual void setDeferCommits(bool defer_commits);
[email protected]180ef242013-11-07 06:50:46113 virtual void registerForAnimations(blink::WebLayer* layer);
[email protected]57ac9482013-09-17 21:13:39114 virtual void registerViewportLayers(
ccameron8230b68b2014-11-21 19:25:18115 const blink::WebLayer* overscrollElasticityLayer,
116 const blink::WebLayer* pageScaleLayer,
117 const blink::WebLayer* innerViewportScrollLayer,
118 const blink::WebLayer* outerViewportScrollLayer) override;
mohan.reddyee0b42a2014-10-08 04:53:14119 virtual void clearViewportLayers() override;
[email protected]ebb179b2014-07-16 17:54:41120 virtual void registerSelection(const blink::WebSelectionBound& start,
mohan.reddyee0b42a2014-10-08 04:53:14121 const blink::WebSelectionBound& end) override;
122 virtual void clearSelection() override;
[email protected]ba91a792013-02-06 09:48:28123 virtual void setShowFPSCounter(bool show);
124 virtual void setShowPaintRects(bool show);
[email protected]d3be0282013-02-07 19:00:23125 virtual void setShowDebugBorders(bool show);
[email protected]ba91a792013-02-06 09:48:28126 virtual void setContinuousPaintingEnabled(bool enabled);
[email protected]32802a32013-07-04 11:45:41127 virtual void setShowScrollBottleneckRects(bool show);
aelias6004fe02015-02-07 21:43:01128
majidvpfb80e432015-02-23 14:15:50129 virtual void updateTopControlsState(blink::WebTopControlsState constraints,
130 blink::WebTopControlsState current,
131 bool animate);
132 virtual void setTopControlsHeight(float height, bool shrink);
133 virtual void setTopControlsShownRatio(float);
aelias6004fe02015-02-07 21:43:01134 // TODO(aelias): Delete after Blink roll
bokan88eae012014-09-09 20:40:42135 virtual void setTopControlsContentOffset(float);
[email protected]ba91a792013-02-06 09:48:28136
137 // cc::LayerTreeHostClient implementation.
caseq7d2f4c92015-02-04 16:43:27138 void WillBeginMainFrame() override;
dcheng6d18e402014-10-21 12:32:52139 void DidBeginMainFrame() override;
140 void BeginMainFrame(const cc::BeginFrameArgs& args) override;
rmcilroy0a19362a2015-02-18 12:34:25141 void BeginMainFrameNotExpectedSoon() override;
dcheng6d18e402014-10-21 12:32:52142 void Layout() override;
miletus7a221752015-02-04 20:44:49143 void ApplyViewportDeltas(const gfx::Vector2dF& inner_delta,
144 const gfx::Vector2dF& outer_delta,
ccameron98be9ac2014-12-09 19:56:32145 const gfx::Vector2dF& elastic_overscroll_delta,
dcheng6d18e402014-10-21 12:32:52146 float page_scale,
147 float top_controls_delta) override;
148 void ApplyViewportDeltas(const gfx::Vector2d& scroll_delta,
149 float page_scale,
150 float top_controls_delta) override;
enne7f8fdde2014-12-10 21:32:09151 void RequestNewOutputSurface() override;
dcheng6d18e402014-10-21 12:32:52152 void DidInitializeOutputSurface() override;
enne7f8fdde2014-12-10 21:32:09153 void DidFailToInitializeOutputSurface() override;
dcheng6d18e402014-10-21 12:32:52154 void WillCommit() override;
155 void DidCommit() override;
156 void DidCommitAndDrawFrame() override;
157 void DidCompleteSwapBuffers() override;
rouslanf7ebd8832015-01-22 01:54:14158 void DidCompletePageScaleAnimation() override;
dcheng6d18e402014-10-21 12:32:52159 void RateLimitSharedMainThreadContext() override;
[email protected]ba91a792013-02-06 09:48:28160
[email protected]943528e2013-11-07 05:01:32161 // cc::LayerTreeHostSingleThreadClient implementation.
dcheng6d18e402014-10-21 12:32:52162 void ScheduleAnimation() override;
163 void DidPostSwapBuffers() override;
164 void DidAbortSwapBuffers() override;
[email protected]943528e2013-11-07 05:01:32165
enne7f8fdde2014-12-10 21:32:09166 enum {
167 OUTPUT_SURFACE_RETRIES_BEFORE_FALLBACK = 4,
168 MAX_OUTPUT_SURFACE_RETRIES = 5,
169 };
170
171 protected:
danakj6e3bf8012014-12-16 18:27:53172 RenderWidgetCompositor(RenderWidget* widget,
173 CompositorDependencies* compositor_deps);
[email protected]ba91a792013-02-06 09:48:28174
danakj6e3bf8012014-12-16 18:27:53175 void Initialize();
enne7f8fdde2014-12-10 21:32:09176 cc::LayerTreeHost* layer_tree_host() { return layer_tree_host_.get(); }
177
178 private:
179 int num_failed_recreate_attempts_;
[email protected]ba91a792013-02-06 09:48:28180 RenderWidget* widget_;
danakj6e3bf8012014-12-16 18:27:53181 CompositorDependencies* compositor_deps_;
[email protected]ba91a792013-02-06 09:48:28182 scoped_ptr<cc::LayerTreeHost> layer_tree_host_;
ernstm50aec922014-08-26 22:16:11183
enne89e6c3aa2014-10-01 15:07:59184 scoped_ptr<cc::CopyOutputRequest> temporary_copy_output_request_;
185
enne7f8fdde2014-12-10 21:32:09186 base::WeakPtrFactory<RenderWidgetCompositor> weak_factory_;
[email protected]ba91a792013-02-06 09:48:28187};
188
189} // namespace content
190
191#endif // CONTENT_RENDERER_GPU_RENDER_WIDGET_COMPOSITOR_H_