blob: ba3b53aaf5ecee0b2388b8254a2ecd95c9c1bf97 [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"
danakjf20f4502017-09-26 17:13:3110#include "components/viz/common/frame_sinks/copy_output_request.h"
Fady Samuel4f7f0fb32017-07-28 15:33:3711#include "components/viz/common/resources/returned_resource.h"
Eric Karlbaa55ff32018-01-18 00:46:1112#include "components/viz/common/surfaces/parent_local_surface_id_allocator.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
69 void DestroyDelegatedContent();
70
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
Eric Karldb7eb242018-05-16 17:16:5991 void SynchronizeVisualProperties(gfx::Size size_in_pixels);
Eric Karlbaa55ff32018-01-18 00:46:1192
Eric Karlb8823c312018-05-09 03:08:3993 // Called when we begin a resize operation. Takes the compositor lock until we
94 // receive a frame of the expected size.
95 void PixelSizeWillChange(const gfx::Size& pixel_size);
96
Eric Karlbaa55ff32018-01-18 00:46:1197 // Returns the ID for the current Surface. Returns an invalid ID if no
98 // surface exists (!HasDelegatedContent()).
99 const viz::SurfaceId& SurfaceId() const;
100
101 // Returns the local surface ID for this delegated content.
102 const viz::LocalSurfaceId& GetLocalSurfaceId() const;
kenrb2b5d08b2017-03-08 22:31:29103
Fady Samueldb67d4e3e2018-05-17 00:59:45104 // TODO(fsamuel): We should move the viz::ParentLocalSurfaceIdAllocator to
105 // RenderWidgetHostViewAndroid.
106 viz::ParentLocalSurfaceIdAllocator* GetLocalSurfaceIdAllocator() {
107 return &local_surface_id_allocator_;
108 }
109
Saman Sami26a1fcd2018-04-10 17:12:21110 void TakeFallbackContentFrom(DelegatedFrameHostAndroid* other);
111
Eric Karldb7eb242018-05-16 17:16:59112 void DidNavigate();
113
khushalsagara693aa72016-08-16 22:18:06114 private:
kylechar9075b082017-09-12 16:59:10115 // viz::mojom::CompositorFrameSinkClient implementation.
samans8d3604f2017-04-11 22:15:30116 void DidReceiveCompositorFrameAck(
Fady Samuel4f7f0fb32017-07-28 15:33:37117 const std::vector<viz::ReturnedResource>& resources) override;
Peng Huang5207a6e2017-10-26 00:39:30118 void DidPresentCompositorFrame(uint32_t presentation_token,
119 base::TimeTicks time,
120 base::TimeDelta refresh,
121 uint32_t flags) override;
122 void DidDiscardCompositorFrame(uint32_t presentation_token) override;
Fady Samuelc296f5fb2017-07-21 04:02:19123 void OnBeginFrame(const viz::BeginFrameArgs& args) override;
danakj30464ba12017-06-29 21:26:45124 void ReclaimResources(
Fady Samuel4f7f0fb32017-07-28 15:33:37125 const std::vector<viz::ReturnedResource>& resources) override;
Bill Orr372a1262017-07-20 00:18:39126 void OnBeginFramePausedChanged(bool paused) override;
samansb779eca2017-03-02 22:16:37127
Fady Samuelc645ffe2017-07-24 17:28:20128 // viz::ExternalBeginFrameSourceClient implementation.
samansb779eca2017-03-02 22:16:37129 void OnNeedsBeginFrames(bool needs_begin_frames) override;
samansb779eca2017-03-02 22:16:37130
Fady Samuelbac0f1a2017-08-02 15:54:02131 // viz::HostFrameSinkClient implementation.
Fady Samuel5b7fb8e2017-08-08 16:58:22132 void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
yiyixae38c332017-11-14 18:58:27133 void OnFrameTokenChanged(uint32_t frame_token) override;
Fady Samuelbac0f1a2017-08-02 15:54:02134
Eric Karl465a5252018-01-10 21:16:27135 // ui::CompositorLockClient implementation.
136 void CompositorLockTimedOut() override;
137
samansb779eca2017-03-02 22:16:37138 void CreateNewCompositorFrameSinkSupport();
khushalsagara693aa72016-08-16 22:18:06139
Fady Samueld5c26182017-07-12 02:43:33140 const viz::FrameSinkId frame_sink_id_;
fsamuelb6acafa2016-10-04 03:21:52141
khushalsagara693aa72016-08-16 22:18:06142 ViewAndroid* view_;
143
kylechara0900162017-07-14 17:35:25144 viz::HostFrameSinkManager* const host_frame_sink_manager_;
starazaa231112017-02-07 17:53:24145 WindowAndroidCompositor* registered_parent_compositor_ = nullptr;
eseckler8c15fc32016-12-20 20:22:20146 Client* client_;
khushalsagara693aa72016-08-16 22:18:06147
danakjc391f332017-07-12 20:45:52148 std::unique_ptr<viz::CompositorFrameSinkSupport> support_;
Fady Samuelc645ffe2017-07-24 17:28:20149 viz::ExternalBeginFrameSource begin_frame_source_;
khushalsagara693aa72016-08-16 22:18:06150
Fady Samuel1a21156e2017-07-13 04:57:29151 viz::SurfaceInfo surface_info_;
samanse7398c552017-03-21 21:36:28152 bool has_transparent_background_ = false;
khushalsagara693aa72016-08-16 22:18:06153
154 scoped_refptr<cc::SurfaceLayer> content_layer_;
155
Eric Karlbaa55ff32018-01-18 00:46:11156 const bool enable_surface_synchronization_;
Eric Karldb7eb242018-05-16 17:16:59157 const bool enable_viz_;
Eric Karlbaa55ff32018-01-18 00:46:11158 viz::ParentLocalSurfaceIdAllocator local_surface_id_allocator_;
Eric Karlbaa55ff32018-01-18 00:46:11159
Eric Karlb8823c312018-05-09 03:08:39160 // The size we are resizing to. Once we receive a frame of this size we can
161 // release any resize compositor lock.
162 gfx::Size expected_pixel_size_;
163
Eric Karl465a5252018-01-10 21:16:27164 // A lock that is held from the point at which we attach to the compositor to
165 // the point at which we submit our first frame to the compositor. This
166 // ensures that the compositor doesn't swap without a frame available.
167 std::unique_ptr<ui::CompositorLock> compositor_attach_until_frame_lock_;
168
Eric Karlb8823c312018-05-09 03:08:39169 // A lock that is held from the point we begin resizing this frame to the
170 // point at which we receive a frame of the correct size.
171 std::unique_ptr<ui::CompositorLock> compositor_pending_resize_lock_;
172
Eric Karldb7eb242018-05-16 17:16:59173 // Whether we've received a frame from the renderer since navigating.
174 // Only used in Viz mode.
175 bool received_frame_after_navigation_ = false;
176 uint32_t parent_sequence_number_at_navigation_ = 0;
177
khushalsagara693aa72016-08-16 22:18:06178 DISALLOW_COPY_AND_ASSIGN(DelegatedFrameHostAndroid);
179};
180
181} // namespace ui
182
183#endif // UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_