blob: 66f2f4c14e19698c8dfcc91dce5bd32b140b859d [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"
danakjf20f4502017-09-26 17:13:3111#include "components/viz/common/frame_sinks/copy_output_request.h"
Fady Samuel4f7f0fb32017-07-28 15:33:3712#include "components/viz/common/resources/returned_resource.h"
Fady Samuel1a21156e2017-07-13 04:57:2913#include "components/viz/common/surfaces/surface_info.h"
Fady Samuelbac0f1a2017-08-02 15:54:0214#include "components/viz/host/host_frame_sink_client.h"
danakjc391f332017-07-12 20:45:5215#include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
kylechar9075b082017-09-12 16:59:1016#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
khushalsagara693aa72016-08-16 22:18:0617#include "ui/android/ui_android_export.h"
Eric Karl465a5252018-01-10 21:16:2718#include "ui/compositor/compositor_lock.h"
khushalsagara693aa72016-08-16 22:18:0619
20namespace cc {
khushalsagara693aa72016-08-16 22:18:0621class SurfaceLayer;
khushalsagara693aa72016-08-16 22:18:0622enum class SurfaceDrawStatus;
khushalsagara693aa72016-08-16 22:18:0623} // namespace cc
24
kylechara0900162017-07-14 17:35:2525namespace viz {
danakj5e0a12b2017-09-25 17:26:4926class CompositorFrame;
kylechara0900162017-07-14 17:35:2527class HostFrameSinkManager;
28} // namespace viz
29
khushalsagara693aa72016-08-16 22:18:0630namespace ui {
31class ViewAndroid;
32class WindowAndroidCompositor;
33
34class UI_ANDROID_EXPORT DelegatedFrameHostAndroid
kylechar9075b082017-09-12 16:59:1035 : public viz::mojom::CompositorFrameSinkClient,
Fady Samuelbac0f1a2017-08-02 15:54:0236 public viz::ExternalBeginFrameSourceClient,
Eric Karl465a5252018-01-10 21:16:2737 public viz::HostFrameSinkClient,
38 public ui::CompositorLockClient {
khushalsagara693aa72016-08-16 22:18:0639 public:
eseckler8c15fc32016-12-20 20:22:2040 class Client {
41 public:
42 virtual void SetBeginFrameSource(
Fady Samuelc645ffe2017-07-24 17:28:2043 viz::BeginFrameSource* begin_frame_source) = 0;
samansb779eca2017-03-02 22:16:3744 virtual void DidReceiveCompositorFrameAck() = 0;
Brian Anderson69624e752018-03-01 23:25:0345 virtual void DidPresentCompositorFrame(uint32_t presentation_token,
46 base::TimeTicks time,
47 base::TimeDelta refresh,
48 uint32_t flags) = 0;
49 virtual void DidDiscardCompositorFrame(uint32_t presentation_token) = 0;
Fady Samuel4f7f0fb32017-07-28 15:33:3750 virtual void ReclaimResources(
51 const std::vector<viz::ReturnedResource>&) = 0;
yiyixae38c332017-11-14 18:58:2752 virtual void OnFrameTokenChanged(uint32_t frame_token) = 0;
Eric Karldb7eb242018-05-16 17:16:5953 virtual void DidReceiveFirstFrameAfterNavigation() = 0;
eseckler8c15fc32016-12-20 20:22:2054 };
khushalsagara693aa72016-08-16 22:18:0655
56 DelegatedFrameHostAndroid(ViewAndroid* view,
kylechara0900162017-07-14 17:35:2557 viz::HostFrameSinkManager* host_frame_sink_manager,
xlai9351829f2017-01-27 18:39:1358 Client* client,
Fady Samueld5c26182017-07-12 02:43:3359 const viz::FrameSinkId& frame_sink_id);
khushalsagara693aa72016-08-16 22:18:0660
61 ~DelegatedFrameHostAndroid() override;
62
Ria Jiangd89b70552018-02-22 05:36:2663 void SubmitCompositorFrame(
64 const viz::LocalSurfaceId& local_surface_id,
65 viz::CompositorFrame frame,
danakj54af81a2018-05-24 23:59:0266 base::Optional<viz::HitTestRegionList> hit_test_region_list);
Fady Samuelc296f5fb2017-07-21 04:02:1967 void DidNotProduceFrame(const viz::BeginFrameAck& ack);
khushalsagara693aa72016-08-16 22:18:0668
Fady Samueldba483c2018-05-30 04:42:3569 void EvictDelegatedFrame();
khushalsagara693aa72016-08-16 22:18:0670
71 bool HasDelegatedContent() const;
72
Fady Samueld5c26182017-07-12 02:43:3373 viz::FrameSinkId GetFrameSinkId() const;
khushalsagara693aa72016-08-16 22:18:0674
Yuri Wiitalab9ad27a2017-09-06 19:13:5075 // Should only be called when the host has a content layer. Use this for one-
76 // off screen capture, not for video. Always provides RGBA_BITMAP
77 // CopyOutputResults.
Yuri Wiitala419ed0f2018-02-22 23:21:3878 void CopyFromCompositingSurface(
79 const gfx::Rect& src_subrect,
80 const gfx::Size& output_size,
81 base::OnceCallback<void(const SkBitmap&)> callback);
82 bool CanCopyFromCompositingSurface() const;
khushalsagara693aa72016-08-16 22:18:0683
danakj1120f4c2016-09-15 02:05:3284 void CompositorFrameSinkChanged();
khushalsagara693aa72016-08-16 22:18:0685
ennea487a272016-09-30 19:56:1886 // Called when this DFH is attached/detached from a parent browser compositor
87 // and needs to be attached to the surface hierarchy.
starazaa231112017-02-07 17:53:2488 void AttachToCompositor(WindowAndroidCompositor* compositor);
89 void DetachFromCompositor();
ennea487a272016-09-30 19:56:1890
Fady Samueldba483c2018-05-30 04:42:3591 void EmbedSurface(const viz::LocalSurfaceId& new_pending_local_surface_id,
92 const gfx::Size& new_pending_size_in_pixels,
93 cc::DeadlinePolicy deadline_policy);
Eric Karlbaa55ff32018-01-18 00:46:1194
Eric Karlb8823c312018-05-09 03:08:3995 // Called when we begin a resize operation. Takes the compositor lock until we
96 // receive a frame of the expected size.
97 void PixelSizeWillChange(const gfx::Size& pixel_size);
98
Eric Karlbaa55ff32018-01-18 00:46:1199 // Returns the ID for the current Surface. Returns an invalid ID if no
100 // surface exists (!HasDelegatedContent()).
101 const viz::SurfaceId& SurfaceId() const;
102
Saman Sami26a1fcd2018-04-10 17:12:21103 void TakeFallbackContentFrom(DelegatedFrameHostAndroid* other);
104
Eric Karldb7eb242018-05-16 17:16:59105 void DidNavigate();
106
khushalsagara693aa72016-08-16 22:18:06107 private:
kylechar9075b082017-09-12 16:59:10108 // viz::mojom::CompositorFrameSinkClient implementation.
samans8d3604f2017-04-11 22:15:30109 void DidReceiveCompositorFrameAck(
Fady Samuel4f7f0fb32017-07-28 15:33:37110 const std::vector<viz::ReturnedResource>& resources) override;
Peng Huang5207a6e2017-10-26 00:39:30111 void DidPresentCompositorFrame(uint32_t presentation_token,
112 base::TimeTicks time,
113 base::TimeDelta refresh,
114 uint32_t flags) override;
115 void DidDiscardCompositorFrame(uint32_t presentation_token) override;
Fady Samuelc296f5fb2017-07-21 04:02:19116 void OnBeginFrame(const viz::BeginFrameArgs& args) override;
danakj30464ba12017-06-29 21:26:45117 void ReclaimResources(
Fady Samuel4f7f0fb32017-07-28 15:33:37118 const std::vector<viz::ReturnedResource>& resources) override;
Bill Orr372a1262017-07-20 00:18:39119 void OnBeginFramePausedChanged(bool paused) override;
samansb779eca2017-03-02 22:16:37120
Fady Samuelc645ffe2017-07-24 17:28:20121 // viz::ExternalBeginFrameSourceClient implementation.
samansb779eca2017-03-02 22:16:37122 void OnNeedsBeginFrames(bool needs_begin_frames) override;
samansb779eca2017-03-02 22:16:37123
Fady Samuelbac0f1a2017-08-02 15:54:02124 // viz::HostFrameSinkClient implementation.
Fady Samuel5b7fb8e2017-08-08 16:58:22125 void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
yiyixae38c332017-11-14 18:58:27126 void OnFrameTokenChanged(uint32_t frame_token) override;
Fady Samuelbac0f1a2017-08-02 15:54:02127
Eric Karl465a5252018-01-10 21:16:27128 // ui::CompositorLockClient implementation.
129 void CompositorLockTimedOut() override;
130
samansb779eca2017-03-02 22:16:37131 void CreateNewCompositorFrameSinkSupport();
khushalsagara693aa72016-08-16 22:18:06132
Fady Samueld5c26182017-07-12 02:43:33133 const viz::FrameSinkId frame_sink_id_;
fsamuelb6acafa2016-10-04 03:21:52134
khushalsagara693aa72016-08-16 22:18:06135 ViewAndroid* view_;
136
kylechara0900162017-07-14 17:35:25137 viz::HostFrameSinkManager* const host_frame_sink_manager_;
starazaa231112017-02-07 17:53:24138 WindowAndroidCompositor* registered_parent_compositor_ = nullptr;
eseckler8c15fc32016-12-20 20:22:20139 Client* client_;
khushalsagara693aa72016-08-16 22:18:06140
danakjc391f332017-07-12 20:45:52141 std::unique_ptr<viz::CompositorFrameSinkSupport> support_;
Fady Samuelc645ffe2017-07-24 17:28:20142 viz::ExternalBeginFrameSource begin_frame_source_;
khushalsagara693aa72016-08-16 22:18:06143
samanse7398c552017-03-21 21:36:28144 bool has_transparent_background_ = false;
khushalsagara693aa72016-08-16 22:18:06145
146 scoped_refptr<cc::SurfaceLayer> content_layer_;
147
Eric Karlbaa55ff32018-01-18 00:46:11148 const bool enable_surface_synchronization_;
Eric Karldb7eb242018-05-16 17:16:59149 const bool enable_viz_;
Eric Karlbaa55ff32018-01-18 00:46:11150
Eric Karlb8823c312018-05-09 03:08:39151 // The size we are resizing to. Once we receive a frame of this size we can
152 // release any resize compositor lock.
153 gfx::Size expected_pixel_size_;
154
Eric Karl465a5252018-01-10 21:16:27155 // A lock that is held from the point at which we attach to the compositor to
156 // the point at which we submit our first frame to the compositor. This
157 // ensures that the compositor doesn't swap without a frame available.
158 std::unique_ptr<ui::CompositorLock> compositor_attach_until_frame_lock_;
159
Eric Karlb8823c312018-05-09 03:08:39160 // A lock that is held from the point we begin resizing this frame to the
161 // point at which we receive a frame of the correct size.
162 std::unique_ptr<ui::CompositorLock> compositor_pending_resize_lock_;
163
Eric Karldb7eb242018-05-16 17:16:59164 // Whether we've received a frame from the renderer since navigating.
Fady Samueldba483c2018-05-30 04:42:35165 // Only used when surface synchronization is on.
166 uint32_t first_parent_sequence_number_after_navigation_ = 0;
Eric Karldb7eb242018-05-16 17:16:59167 bool received_frame_after_navigation_ = false;
Fady Samueldba483c2018-05-30 04:42:35168
169 // The local surface id as of the most recent call to
170 // EmbedSurface. This is the surface that we expect future frames to
171 // reference. This will eventually equal the active surface.
172 viz::LocalSurfaceId pending_local_surface_id_;
Eric Karldb7eb242018-05-16 17:16:59173
khushalsagara693aa72016-08-16 22:18:06174 DISALLOW_COPY_AND_ASSIGN(DelegatedFrameHostAndroid);
175};
176
177} // namespace ui
178
179#endif // UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_