blob: 4b963dde93153e356626a0ea5b8f4ae0457ba1a5 [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"
Fady Samuel1a21156e2017-07-13 04:57:2912#include "components/viz/common/surfaces/surface_info.h"
Fady Samuelbac0f1a2017-08-02 15:54:0213#include "components/viz/host/host_frame_sink_client.h"
danakjc391f332017-07-12 20:45:5214#include "components/viz/service/frame_sinks/compositor_frame_sink_support.h"
kylechar9075b082017-09-12 16:59:1015#include "services/viz/public/interfaces/compositing/compositor_frame_sink.mojom.h"
khushalsagara693aa72016-08-16 22:18:0616#include "ui/android/ui_android_export.h"
Eric Karl465a5252018-01-10 21:16:2717#include "ui/compositor/compositor_lock.h"
khushalsagara693aa72016-08-16 22:18:0618
19namespace cc {
khushalsagara693aa72016-08-16 22:18:0620class SurfaceLayer;
khushalsagara693aa72016-08-16 22:18:0621enum class SurfaceDrawStatus;
khushalsagara693aa72016-08-16 22:18:0622} // namespace cc
23
kylechara0900162017-07-14 17:35:2524namespace viz {
danakj5e0a12b2017-09-25 17:26:4925class CompositorFrame;
Fady Samueldea5e8f2017-07-19 21:41:3326class FrameSinkManagerImpl;
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;
Fady Samuel4f7f0fb32017-07-28 15:33:3745 virtual void ReclaimResources(
46 const std::vector<viz::ReturnedResource>&) = 0;
yiyixae38c332017-11-14 18:58:2747 virtual void OnFrameTokenChanged(uint32_t frame_token) = 0;
eseckler8c15fc32016-12-20 20:22:2048 };
khushalsagara693aa72016-08-16 22:18:0649
50 DelegatedFrameHostAndroid(ViewAndroid* view,
kylechara0900162017-07-14 17:35:2551 viz::HostFrameSinkManager* host_frame_sink_manager,
Fady Samueldea5e8f2017-07-19 21:41:3352 viz::FrameSinkManagerImpl* frame_sink_manager,
xlai9351829f2017-01-27 18:39:1353 Client* client,
Fady Samueld5c26182017-07-12 02:43:3354 const viz::FrameSinkId& frame_sink_id);
khushalsagara693aa72016-08-16 22:18:0655
56 ~DelegatedFrameHostAndroid() override;
57
Fady Samueld5c26182017-07-12 02:43:3358 void SubmitCompositorFrame(const viz::LocalSurfaceId& local_surface_id,
danakj5e0a12b2017-09-25 17:26:4959 viz::CompositorFrame frame);
Fady Samuelc296f5fb2017-07-21 04:02:1960 void DidNotProduceFrame(const viz::BeginFrameAck& ack);
khushalsagara693aa72016-08-16 22:18:0661
62 void DestroyDelegatedContent();
63
64 bool HasDelegatedContent() const;
65
Fady Samueld5c26182017-07-12 02:43:3366 viz::FrameSinkId GetFrameSinkId() const;
khushalsagara693aa72016-08-16 22:18:0667
Yuri Wiitalab9ad27a2017-09-06 19:13:5068 // Should only be called when the host has a content layer. Use this for one-
69 // off screen capture, not for video. Always provides RGBA_BITMAP
70 // CopyOutputResults.
khushalsagara693aa72016-08-16 22:18:0671 void RequestCopyOfSurface(
72 WindowAndroidCompositor* compositor,
73 const gfx::Rect& src_subrect_in_pixel,
Fady Samueldfecb7d2017-07-26 11:41:0474 viz::CopyOutputRequest::CopyOutputRequestCallback result_callback);
khushalsagara693aa72016-08-16 22:18:0675
danakj1120f4c2016-09-15 02:05:3276 void CompositorFrameSinkChanged();
khushalsagara693aa72016-08-16 22:18:0677
ennea487a272016-09-30 19:56:1878 // Called when this DFH is attached/detached from a parent browser compositor
79 // and needs to be attached to the surface hierarchy.
starazaa231112017-02-07 17:53:2480 void AttachToCompositor(WindowAndroidCompositor* compositor);
81 void DetachFromCompositor();
ennea487a272016-09-30 19:56:1882
kenrb2b5d08b2017-03-08 22:31:2983 // Returns the ID for the current Surface.
Fady Samueld5c26182017-07-12 02:43:3384 viz::SurfaceId SurfaceId() const;
kenrb2b5d08b2017-03-08 22:31:2985
khushalsagara693aa72016-08-16 22:18:0686 private:
kylechar9075b082017-09-12 16:59:1087 // viz::mojom::CompositorFrameSinkClient implementation.
samans8d3604f2017-04-11 22:15:3088 void DidReceiveCompositorFrameAck(
Fady Samuel4f7f0fb32017-07-28 15:33:3789 const std::vector<viz::ReturnedResource>& resources) override;
Peng Huang5207a6e2017-10-26 00:39:3090 void DidPresentCompositorFrame(uint32_t presentation_token,
91 base::TimeTicks time,
92 base::TimeDelta refresh,
93 uint32_t flags) override;
94 void DidDiscardCompositorFrame(uint32_t presentation_token) override;
Fady Samuelc296f5fb2017-07-21 04:02:1995 void OnBeginFrame(const viz::BeginFrameArgs& args) override;
danakj30464ba12017-06-29 21:26:4596 void ReclaimResources(
Fady Samuel4f7f0fb32017-07-28 15:33:3797 const std::vector<viz::ReturnedResource>& resources) override;
Bill Orr372a1262017-07-20 00:18:3998 void OnBeginFramePausedChanged(bool paused) override;
samansb779eca2017-03-02 22:16:3799
Fady Samuelc645ffe2017-07-24 17:28:20100 // viz::ExternalBeginFrameSourceClient implementation.
samansb779eca2017-03-02 22:16:37101 void OnNeedsBeginFrames(bool needs_begin_frames) override;
samansb779eca2017-03-02 22:16:37102
Fady Samuelbac0f1a2017-08-02 15:54:02103 // viz::HostFrameSinkClient implementation.
Fady Samuel5b7fb8e2017-08-08 16:58:22104 void OnFirstSurfaceActivation(const viz::SurfaceInfo& surface_info) override;
yiyixae38c332017-11-14 18:58:27105 void OnFrameTokenChanged(uint32_t frame_token) override;
Fady Samuelbac0f1a2017-08-02 15:54:02106
Eric Karl465a5252018-01-10 21:16:27107 // ui::CompositorLockClient implementation.
108 void CompositorLockTimedOut() override;
109
samansb779eca2017-03-02 22:16:37110 void CreateNewCompositorFrameSinkSupport();
khushalsagara693aa72016-08-16 22:18:06111
Fady Samueld5c26182017-07-12 02:43:33112 const viz::FrameSinkId frame_sink_id_;
fsamuelb6acafa2016-10-04 03:21:52113
khushalsagara693aa72016-08-16 22:18:06114 ViewAndroid* view_;
115
kylechara0900162017-07-14 17:35:25116 viz::HostFrameSinkManager* const host_frame_sink_manager_;
Fady Samueldea5e8f2017-07-19 21:41:33117 viz::FrameSinkManagerImpl* const frame_sink_manager_;
starazaa231112017-02-07 17:53:24118 WindowAndroidCompositor* registered_parent_compositor_ = nullptr;
eseckler8c15fc32016-12-20 20:22:20119 Client* client_;
khushalsagara693aa72016-08-16 22:18:06120
danakjc391f332017-07-12 20:45:52121 std::unique_ptr<viz::CompositorFrameSinkSupport> support_;
Fady Samuelc645ffe2017-07-24 17:28:20122 viz::ExternalBeginFrameSource begin_frame_source_;
khushalsagara693aa72016-08-16 22:18:06123
Fady Samuel1a21156e2017-07-13 04:57:29124 viz::SurfaceInfo surface_info_;
samanse7398c552017-03-21 21:36:28125 bool has_transparent_background_ = false;
khushalsagara693aa72016-08-16 22:18:06126
127 scoped_refptr<cc::SurfaceLayer> content_layer_;
128
Eric Karl465a5252018-01-10 21:16:27129 // A lock that is held from the point at which we attach to the compositor to
130 // the point at which we submit our first frame to the compositor. This
131 // ensures that the compositor doesn't swap without a frame available.
132 std::unique_ptr<ui::CompositorLock> compositor_attach_until_frame_lock_;
133
khushalsagara693aa72016-08-16 22:18:06134 DISALLOW_COPY_AND_ASSIGN(DelegatedFrameHostAndroid);
135};
136
137} // namespace ui
138
139#endif // UI_ANDROID_DELEGATED_FRAME_HOST_ANDROID_H_