blob: be08120da636f6524602c710c5b2116da4e6e6fe [file] [log] [blame]
khushalsagara693aa72016-08-16 22:18:061// Copyright 2016 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 UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_
6#define UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_
7
8#include "base/macros.h"
9#include "base/memory/ref_counted.h"
Fady Samueldba483c2018-05-30 04:42:3510#include "cc/layers/deadline_policy.h"
Fady Samuelac325ce2018-06-01 15:23:2711#include "components/viz/client/frame_evictor.h"
danakjf20f4502017-09-26 17:13:3112#include "components/viz/common/frame_sinks/copy_output_request.h"
Fady Samuel4f7f0fb32017-07-28 15:33:3713#include "components/viz/common/resources/returned_resource.h"
Fady Samuel1a21156e2017-07-13 04:57:2914#include "components/viz/common/surfaces/surface_info.h"
Fady Samuelbac0f1a2017-08-02 15:54:0215#include "components/viz/host/host_frame_sink_client.h"
danakjc391f332017-07-12 20:45:5216#include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
kylechar9075b082017-09-12 16:59:1017#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
khushalsagara693aa72016-08-16 22:18:0618#include "ui/android/ui_android_export.h"
Eric Karl465a5252018-01-10 21:16:2719#include "ui/compositor/compositor_lock.h"
khushalsagara693aa72016-08-16 22:18:0620
21namespace cc {
khushalsagara693aa72016-08-16 22:18:0622class SurfaceLayer;
khushalsagara693aa72016-08-16 22:18:0623enum class SurfaceDrawStatus;
khushalsagara693aa72016-08-16 22:18:0624} // namespace cc
25
kylechara0900162017-07-14 17:35:2526namespace viz {
danakj5e0a12b2017-09-25 17:26:4927class CompositorFrame;
kylechara0900162017-07-14 17:35:2528class HostFrameSinkManager;
29} // namespace viz
30
khushalsagara693aa72016-08-16 22:18:0631namespace ui {
32class ViewAndroid;
33class WindowAndroidCompositor;
34
35class UI_ANDROID_EXPORT DelegatedFrameHostAndroid
kylechar9075b082017-09-12 16:59:1036 : public viz::mojom::CompositorFrameSinkClient,
Fady Samuelbac0f1a2017-08-02 15:54:0237 public viz::ExternalBeginFrameSourceClient,
Eric Karl465a5252018-01-10 21:16:2738 public viz::HostFrameSinkClient,
Fady Samuelac325ce2018-06-01 15:23:2739 public ui::CompositorLockClient,
40 public viz::FrameEvictorClient {
khushalsagara693aa72016-08-16 22:18:0641 public:
eseckler8c15fc32016-12-20 20:22:2042 class Client {
43 public:
44 virtual void SetBeginFrameSource(
Fady Samuelc645ffe2017-07-24 17:28:2045 viz::BeginFrameSource* begin_frame_source) = 0;
Sadrul Habib Chowdhuryb62a97302018-06-06 03:33:4846 virtual void DidPresentCompositorFrame(
47 uint32_t presentation_token,
48 const gfx::PresentationFeedback& feedback) = 0;
Fady Samuelf3982a32018-06-14 20:52:1349 virtual void DidReceiveCompositorFrameAck(
50 const std::vector<viz::ReturnedResource>& resources) = 0;
Fady Samuel4f7f0fb32017-07-28 15:33:3751 virtual void ReclaimResources(
Fady Samuelf3982a32018-06-14 20:52:1352 const std::vector<viz::ReturnedResource>& resources) = 0;
yiyixae38c332017-11-14 18:58:2753 virtual void OnFrameTokenChanged(uint32_t frame_token) = 0;
Eric Karldb7eb242018-05-16 17:16:5954 virtual void DidReceiveFirstFrameAfterNavigation() = 0;
eseckler8c15fc32016-12-20 20:22:2055 };
khushalsagara693aa72016-08-16 22:18:0656
57 DelegatedFrameHostAndroid(ViewAndroid* view,
kylechara0900162017-07-14 17:35:2558 viz::HostFrameSinkManager* host_frame_sink_manager,
xlai9351829f2017-01-27 18:39:1359 Client* client,
Fady Samuel3b77b8a2018-06-29 06:53:5360 const viz::FrameSinkId& frame_sink_id,
61 bool enable_surface_synchronization);
khushalsagara693aa72016-08-16 22:18:0662
63 ~DelegatedFrameHostAndroid() override;
64
Fady Samuel99ec37a2018-07-16 21:43:4765 // Wait up to 5 seconds for the first frame to be produced. Having Android
66 // display a placeholder for a longer period of time is preferable to drawing
67 // nothing, and the first frame can take a while on low-end systems.
68 static constexpr base::TimeDelta FirstFrameTimeout() {
69 return base::TimeDelta::FromSeconds(5);
70 }
71 static constexpr int64_t FirstFrameTimeoutFrames() {
72 return FirstFrameTimeout() / viz::BeginFrameArgs::DefaultInterval();
73 }
74
75 // Wait up to 1 second for a frame of the correct size to be produced. Android
76 // OS will only wait 4 seconds, so we limit this to 1 second to make sure we
77 // have always produced a frame before the OS stops waiting.
78 static constexpr base::TimeDelta ResizeTimeout() {
79 return base::TimeDelta::FromSeconds(1);
80 }
81 static constexpr int64_t ResizeTimeoutFrames() {
82 return ResizeTimeout() / viz::BeginFrameArgs::DefaultInterval();
83 }
84
Ria Jiangd89b70552018-02-22 05:36:2685 void SubmitCompositorFrame(
86 const viz::LocalSurfaceId& local_surface_id,
87 viz::CompositorFrame frame,
danakj54af81a2018-05-24 23:59:0288 base::Optional<viz::HitTestRegionList> hit_test_region_list);
Fady Samuelc296f5fb2017-07-21 04:02:1989 void DidNotProduceFrame(const viz::BeginFrameAck& ack);
khushalsagara693aa72016-08-16 22:18:0690
Fady Samuelac325ce2018-06-01 15:23:2791 // FrameEvictorClient implementation.
92 void EvictDelegatedFrame() override;
khushalsagara693aa72016-08-16 22:18:0693
94 bool HasDelegatedContent() const;
95
Fady Samuelbcac6f02018-07-11 02:02:4296 cc::SurfaceLayer* content_layer_for_testing() { return content_layer_.get(); }
97
Fady Samuel0c2f5b82018-07-19 00:33:4698 const viz::FrameSinkId& GetFrameSinkId() const;
khushalsagara693aa72016-08-16 22:18:0699
Yuri Wiitalab9ad27a2017-09-06 19:13:50100 // Should only be called when the host has a content layer. Use this for one-
101 // off screen capture, not for video. Always provides RGBA_BITMAP
102 // CopyOutputResults.
Yuri Wiitala419ed0f2018-02-22 23:21:38103 void CopyFromCompositingSurface(
104 const gfx::Rect& src_subrect,
105 const gfx::Size& output_size,
106 base::OnceCallback<void(const SkBitmap&)> callback);
107 bool CanCopyFromCompositingSurface() const;
khushalsagara693aa72016-08-16 22:18:06108
danakj1120f4c2016-09-15 02:05:32109 void CompositorFrameSinkChanged();
khushalsagara693aa72016-08-16 22:18:06110
ennea487a272016-09-30 19:56:18111 // Called when this DFH is attached/detached from a parent browser compositor
112 // and needs to be attached to the surface hierarchy.
starazaa231112017-02-07 17:53:24113 void AttachToCompositor(WindowAndroidCompositor* compositor);
114 void DetachFromCompositor();
ennea487a272016-09-30 19:56:18115
Fady Samuelac325ce2018-06-01 15:23:27116 bool IsPrimarySurfaceEvicted() const;
117 bool HasSavedFrame() const;
118 void WasHidden();
119 void WasShown(const viz::LocalSurfaceId& local_surface_id,
120 const gfx::Size& size_in_pixels);
Fady Samueldba483c2018-05-30 04:42:35121 void EmbedSurface(const viz::LocalSurfaceId& new_pending_local_surface_id,
122 const gfx::Size& new_pending_size_in_pixels,
123 cc::DeadlinePolicy deadline_policy);
Eric Karlbaa55ff32018-01-18 00:46:11124
Eric Karlb8823c312018-05-09 03:08:39125 // Called when we begin a resize operation. Takes the compositor lock until we
126 // receive a frame of the expected size.
127 void PixelSizeWillChange(const gfx::Size& pixel_size);
128
Eric Karlbaa55ff32018-01-18 00:46:11129 // Returns the ID for the current Surface. Returns an invalid ID if no
130 // surface exists (!HasDelegatedContent()).
Fady Samuel120c7e22018-07-20 05:19:28131 viz::SurfaceId SurfaceId() const;
Xu Xing9ef5a882018-08-21 00:11:20132 bool HasFallbackSurface() const;
Eric Karlbaa55ff32018-01-18 00:46:11133
Saman Sami26a1fcd2018-04-10 17:12:21134 void TakeFallbackContentFrom(DelegatedFrameHostAndroid* other);
135
Eric Karldb7eb242018-05-16 17:16:59136 void DidNavigate();
137
khushalsagara693aa72016-08-16 22:18:06138 private:
kylechar9075b082017-09-12 16:59:10139 // viz::mojom::CompositorFrameSinkClient implementation.
samans8d3604f2017-04-11 22:15:30140 void DidReceiveCompositorFrameAck(
Fady Samuel4f7f0fb32017-07-28 15:33:37141 const std::vector<viz::ReturnedResource>& resources) override;
Sadrul Habib Chowdhuryb62a97302018-06-06 03:33:48142 void DidPresentCompositorFrame(
143 uint32_t presentation_token,
144 const gfx::PresentationFeedback& feedback) override;
Fady Samuelc296f5fb2017-07-21 04:02:19145 void OnBeginFrame(const viz::BeginFrameArgs& args) override;
danakj30464ba12017-06-29 21:26:45146 void ReclaimResources(
Fady Samuel4f7f0fb32017-07-28 15:33:37147 const std::vector<viz::ReturnedResource>& resources) override;
Bill Orr372a1262017-07-20 00:18:39148 void OnBeginFramePausedChanged(bool paused) override;
samansb779eca2017-03-02 22:16:37149
Fady Samuelc645ffe2017-07-24 17:28:20150 // viz::ExternalBeginFrameSourceClient implementation.
samansb779eca2017-03-02 22:16:37151 void OnNeedsBeginFrames(bool needs_begin_frames) override;
samansb779eca2017-03-02 22:16:37152
Fady Samuelbac0f1a2017-08-02 15:54:02153 // viz::HostFrameSinkClient implementation.
Fady Samuel5b7fb8e2017-08-08 16:58:22154 void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
yiyixae38c332017-11-14 18:58:27155 void OnFrameTokenChanged(uint32_t frame_token) override;
Fady Samuelbac0f1a2017-08-02 15:54:02156
Eric Karl465a5252018-01-10 21:16:27157 // ui::CompositorLockClient implementation.
158 void CompositorLockTimedOut() override;
159
samansb779eca2017-03-02 22:16:37160 void CreateNewCompositorFrameSinkSupport();
khushalsagara693aa72016-08-16 22:18:06161
Fady Samueld5c26182017-07-12 02:43:33162 const viz::FrameSinkId frame_sink_id_;
fsamuelb6acafa2016-10-04 03:21:52163
khushalsagara693aa72016-08-16 22:18:06164 ViewAndroid* view_;
165
kylechara0900162017-07-14 17:35:25166 viz::HostFrameSinkManager* const host_frame_sink_manager_;
starazaa231112017-02-07 17:53:24167 WindowAndroidCompositor* registered_parent_compositor_ = nullptr;
eseckler8c15fc32016-12-20 20:22:20168 Client* client_;
khushalsagara693aa72016-08-16 22:18:06169
danakjc391f332017-07-12 20:45:52170 std::unique_ptr<viz::CompositorFrameSinkSupport> support_;
Fady Samuelc645ffe2017-07-24 17:28:20171 viz::ExternalBeginFrameSource begin_frame_source_;
khushalsagara693aa72016-08-16 22:18:06172
samanse7398c552017-03-21 21:36:28173 bool has_transparent_background_ = false;
khushalsagara693aa72016-08-16 22:18:06174
175 scoped_refptr<cc::SurfaceLayer> content_layer_;
176
Eric Karlbaa55ff32018-01-18 00:46:11177 const bool enable_surface_synchronization_;
Eric Karldb7eb242018-05-16 17:16:59178 const bool enable_viz_;
Eric Karlbaa55ff32018-01-18 00:46:11179
Eric Karlb8823c312018-05-09 03:08:39180 // The size we are resizing to. Once we receive a frame of this size we can
181 // release any resize compositor lock.
182 gfx::Size expected_pixel_size_;
183
Eric Karl465a5252018-01-10 21:16:27184 // A lock that is held from the point at which we attach to the compositor to
185 // the point at which we submit our first frame to the compositor. This
186 // ensures that the compositor doesn't swap without a frame available.
187 std::unique_ptr<ui::CompositorLock> compositor_attach_until_frame_lock_;
188
Eric Karlb8823c312018-05-09 03:08:39189 // A lock that is held from the point we begin resizing this frame to the
190 // point at which we receive a frame of the correct size.
191 std::unique_ptr<ui::CompositorLock> compositor_pending_resize_lock_;
192
Eric Karldb7eb242018-05-16 17:16:59193 // Whether we've received a frame from the renderer since navigating.
Fady Samueldba483c2018-05-30 04:42:35194 // Only used when surface synchronization is on.
195 uint32_t first_parent_sequence_number_after_navigation_ = 0;
Eric Karldb7eb242018-05-16 17:16:59196 bool received_frame_after_navigation_ = false;
Fady Samueldba483c2018-05-30 04:42:35197
198 // The local surface id as of the most recent call to
199 // EmbedSurface. This is the surface that we expect future frames to
200 // reference. This will eventually equal the active surface.
201 viz::LocalSurfaceId pending_local_surface_id_;
Eric Karldb7eb242018-05-16 17:16:59202
Fady Samuelac325ce2018-06-01 15:23:27203 // The size of the above surface (updated at the same time).
204 gfx::Size pending_surface_size_in_pixels_;
205
206 std::unique_ptr<viz::FrameEvictor> frame_evictor_;
207
khushalsagara693aa72016-08-16 22:18:06208 DISALLOW_COPY_AND_ASSIGN(DelegatedFrameHostAndroid);
209};
210
211} // namespace ui
212
213#endif // UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_