blob: b8ae91290ac4de7293d537c5305b2fec3b3d1acb [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"
Peter Kasting809cfe72020-08-04 00:56:1310#include "base/numerics/safe_conversions.h"
Jonathan Rossbe6a0702021-02-23 01:01:5611#include "base/time/time.h"
Fady Samueldba483c2018-05-30 04:42:3512#include "cc/layers/deadline_policy.h"
Fady Samuelac325ce2018-06-01 15:23:2713#include "components/viz/client/frame_evictor.h"
Eric Karlb6d3d74d2019-07-17 21:43:4714#include "components/viz/common/frame_sinks/begin_frame_args.h"
danakjf20f4502017-09-26 17:13:3115#include "components/viz/common/frame_sinks/copy_output_request.h"
Daniel Libby58389b72019-06-11 20:03:4316#include "components/viz/common/frame_timing_details_map.h"
Fady Samuel4f7f0fb32017-07-28 15:33:3717#include "components/viz/common/resources/returned_resource.h"
Fady Samuel1a21156e2017-07-13 04:57:2918#include "components/viz/common/surfaces/surface_info.h"
Fady Samuelbac0f1a2017-08-02 15:54:0219#include "components/viz/host/host_frame_sink_client.h"
khushalsagara693aa72016-08-16 22:18:0620#include "ui/android/ui_android_export.h"
khushalsagara693aa72016-08-16 22:18:0621
22namespace cc {
khushalsagara693aa72016-08-16 22:18:0623class SurfaceLayer;
khushalsagara693aa72016-08-16 22:18:0624enum class SurfaceDrawStatus;
khushalsagara693aa72016-08-16 22:18:0625} // namespace cc
26
kylechara0900162017-07-14 17:35:2527namespace viz {
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
Eric Karlb6d3d74d2019-07-17 21:43:4736 : public viz::HostFrameSinkClient,
Fady Samuelac325ce2018-06-01 15:23:2737 public viz::FrameEvictorClient {
khushalsagara693aa72016-08-16 22:18:0638 public:
eseckler8c15fc32016-12-20 20:22:2039 class Client {
40 public:
Xu Xing6eeb35a32018-08-25 00:24:1441 virtual ~Client() {}
Jonathan Rossbe6a0702021-02-23 01:01:5642 virtual void OnFrameTokenChanged(uint32_t frame_token,
43 base::TimeTicks activation_time) = 0;
Saman Sami4580e6322018-10-21 03:46:5944 virtual void WasEvicted() = 0;
eseckler8c15fc32016-12-20 20:22:2045 };
khushalsagara693aa72016-08-16 22:18:0646
47 DelegatedFrameHostAndroid(ViewAndroid* view,
kylechara0900162017-07-14 17:35:2548 viz::HostFrameSinkManager* host_frame_sink_manager,
xlai9351829f2017-01-27 18:39:1349 Client* client,
Eric Karlb6d3d74d2019-07-17 21:43:4750 const viz::FrameSinkId& frame_sink_id);
khushalsagara693aa72016-08-16 22:18:0651
52 ~DelegatedFrameHostAndroid() override;
53
Bo Liu140aa0c2020-09-14 14:09:5654 static int64_t TimeDeltaToFrames(base::TimeDelta delta) {
55 return base::ClampRound<int64_t>(delta /
56 viz::BeginFrameArgs::DefaultInterval());
57 }
58
Fady Samuel99ec37a2018-07-16 21:43:4759 // Wait up to 5 seconds for the first frame to be produced. Having Android
60 // display a placeholder for a longer period of time is preferable to drawing
61 // nothing, and the first frame can take a while on low-end systems.
62 static constexpr base::TimeDelta FirstFrameTimeout() {
63 return base::TimeDelta::FromSeconds(5);
64 }
Peter Kasting809cfe72020-08-04 00:56:1365 static int64_t FirstFrameTimeoutFrames() {
Bo Liu140aa0c2020-09-14 14:09:5666 return TimeDeltaToFrames(FirstFrameTimeout());
Fady Samuel99ec37a2018-07-16 21:43:4767 }
68
69 // Wait up to 1 second for a frame of the correct size to be produced. Android
70 // OS will only wait 4 seconds, so we limit this to 1 second to make sure we
71 // have always produced a frame before the OS stops waiting.
72 static constexpr base::TimeDelta ResizeTimeout() {
73 return base::TimeDelta::FromSeconds(1);
74 }
Peter Kasting809cfe72020-08-04 00:56:1375 static int64_t ResizeTimeoutFrames() {
Bo Liu140aa0c2020-09-14 14:09:5676 return TimeDeltaToFrames(ResizeTimeout());
Fady Samuel99ec37a2018-07-16 21:43:4777 }
78
akabaf2624f22018-08-21 17:11:0179 // Advances the fallback surface to the first surface after navigation. This
80 // ensures that stale surfaces are not presented to the user for an indefinite
81 // period of time.
82 void ResetFallbackToFirstNavigationSurface();
83
khushalsagara693aa72016-08-16 22:18:0684 bool HasDelegatedContent() const;
85
Fady Samuelbcac6f02018-07-11 02:02:4286 cc::SurfaceLayer* content_layer_for_testing() { return content_layer_.get(); }
87
Fady Samuel0c2f5b82018-07-19 00:33:4688 const viz::FrameSinkId& GetFrameSinkId() const;
khushalsagara693aa72016-08-16 22:18:0689
Yuri Wiitalab9ad27a2017-09-06 19:13:5090 // Should only be called when the host has a content layer. Use this for one-
91 // off screen capture, not for video. Always provides RGBA_BITMAP
92 // CopyOutputResults.
Yuri Wiitala419ed0f2018-02-22 23:21:3893 void CopyFromCompositingSurface(
94 const gfx::Rect& src_subrect,
95 const gfx::Size& output_size,
96 base::OnceCallback<void(const SkBitmap&)> callback);
97 bool CanCopyFromCompositingSurface() const;
khushalsagara693aa72016-08-16 22:18:0698
danakj1120f4c2016-09-15 02:05:3299 void CompositorFrameSinkChanged();
khushalsagara693aa72016-08-16 22:18:06100
ennea487a272016-09-30 19:56:18101 // Called when this DFH is attached/detached from a parent browser compositor
102 // and needs to be attached to the surface hierarchy.
starazaa231112017-02-07 17:53:24103 void AttachToCompositor(WindowAndroidCompositor* compositor);
104 void DetachFromCompositor();
ennea487a272016-09-30 19:56:18105
Fady Samuelac325ce2018-06-01 15:23:27106 bool IsPrimarySurfaceEvicted() const;
107 bool HasSavedFrame() const;
108 void WasHidden();
109 void WasShown(const viz::LocalSurfaceId& local_surface_id,
Vasiliy Telezhnikov03d42b522020-06-29 14:40:59110 const gfx::Size& size_in_pixels,
Vasiliy Telezhnikov2bef50f2020-07-10 19:19:31111 bool is_fullscreen);
Saman Sami1bbd14692018-10-19 22:27:30112 void EmbedSurface(const viz::LocalSurfaceId& new_local_surface_id,
113 const gfx::Size& new_size_in_pixels,
Vasiliy Telezhnikov03d42b522020-06-29 14:40:59114 cc::DeadlinePolicy deadline_policy,
Vasiliy Telezhnikov2bef50f2020-07-10 19:19:31115 bool is_fullscreen);
Eric Karlbaa55ff32018-01-18 00:46:11116
117 // Returns the ID for the current Surface. Returns an invalid ID if no
118 // surface exists (!HasDelegatedContent()).
Fady Samuel120c7e22018-07-20 05:19:28119 viz::SurfaceId SurfaceId() const;
Saman Sami1bbd14692018-10-19 22:27:30120
Saman Samif03a9dba2018-09-24 18:05:07121 bool HasPrimarySurface() const;
Xu Xing9ef5a882018-08-21 00:11:20122 bool HasFallbackSurface() const;
Eric Karlbaa55ff32018-01-18 00:46:11123
Saman Sami26a1fcd2018-04-10 17:12:21124 void TakeFallbackContentFrom(DelegatedFrameHostAndroid* other);
125
Jonathan Ross865a12d2020-12-16 22:33:00126 // Called when navigation has completed, and this DelegatedFrameHost is
127 // visible. A new Surface will have been embedded at this point. If navigation
128 // is done while hidden, this will be called upon becoming visible.
Eric Karldb7eb242018-05-16 17:16:59129 void DidNavigate();
Jonathan Ross865a12d2020-12-16 22:33:00130 // Navigation to a different page than the current one has begun. This is
131 // called regardless of the visibility of the page. Caches the current
132 // LocalSurfaceId information so that old content can be evicted if
133 // navigation fails to complete.
134 void OnNavigateToNewPage();
Eric Karldb7eb242018-05-16 17:16:59135
Sadrul Habib Chowdhury71c7ed802019-11-28 02:24:44136 void SetTopControlsVisibleHeight(float height);
137
khushalsagara693aa72016-08-16 22:18:06138 private:
kylechar055c2102020-07-13 19:58:15139 // FrameEvictorClient implementation.
140 void EvictDelegatedFrame() override;
141
Fady Samuelbac0f1a2017-08-02 15:54:02142 // viz::HostFrameSinkClient implementation.
Fady Samuel5b7fb8e2017-08-08 16:58:22143 void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
Jonathan Rossbe6a0702021-02-23 01:01:56144 void OnFrameTokenChanged(uint32_t frame_token,
145 base::TimeTicks activation_time) override;
Fady Samuelbac0f1a2017-08-02 15:54:02146
Eric Karl5479bee2018-08-24 23:10:28147 void ProcessCopyOutputRequest(
148 std::unique_ptr<viz::CopyOutputRequest> request);
149
Fady Samueld5c26182017-07-12 02:43:33150 const viz::FrameSinkId frame_sink_id_;
fsamuelb6acafa2016-10-04 03:21:52151
khushalsagara693aa72016-08-16 22:18:06152 ViewAndroid* view_;
153
kylechara0900162017-07-14 17:35:25154 viz::HostFrameSinkManager* const host_frame_sink_manager_;
starazaa231112017-02-07 17:53:24155 WindowAndroidCompositor* registered_parent_compositor_ = nullptr;
eseckler8c15fc32016-12-20 20:22:20156 Client* client_;
khushalsagara693aa72016-08-16 22:18:06157
Sadrul Habib Chowdhury71c7ed802019-11-28 02:24:44158 float top_controls_visible_height_ = 0.f;
159
khushalsagara693aa72016-08-16 22:18:06160 scoped_refptr<cc::SurfaceLayer> content_layer_;
161
Eric Karldb7eb242018-05-16 17:16:59162 // Whether we've received a frame from the renderer since navigating.
Fady Samueldba483c2018-05-30 04:42:35163 // Only used when surface synchronization is on.
akabaf2624f22018-08-21 17:11:01164 viz::LocalSurfaceId first_local_surface_id_after_navigation_;
Jonathan Ross865a12d2020-12-16 22:33:00165 // While navigating we have no active |local_surface_id_|. Track the one from
166 // before a navigation, because if the navigation fails to complete, we will
167 // need to evict its surface.
168 viz::LocalSurfaceId pre_navigation_local_surface_id_;
Fady Samueldba483c2018-05-30 04:42:35169
Saman Sami1bbd14692018-10-19 22:27:30170 // The LocalSurfaceId of the currently embedded surface. If surface sync is
171 // on, this surface is not necessarily active.
172 viz::LocalSurfaceId local_surface_id_;
Eric Karldb7eb242018-05-16 17:16:59173
Fady Samuelac325ce2018-06-01 15:23:27174 // The size of the above surface (updated at the same time).
Saman Sami1bbd14692018-10-19 22:27:30175 gfx::Size surface_size_in_pixels_;
Fady Samuelac325ce2018-06-01 15:23:27176
177 std::unique_ptr<viz::FrameEvictor> frame_evictor_;
178
khushalsagara693aa72016-08-16 22:18:06179 DISALLOW_COPY_AND_ASSIGN(DelegatedFrameHostAndroid);
180};
181
182} // namespace ui
183
184#endif // UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_