• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Flutter 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 FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_EXTERNAL_VIEW_EMBEDDER_H_
6 #define FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_EXTERNAL_VIEW_EMBEDDER_H_
7 
8 #include <map>
9 #include <unordered_map>
10 
11 #include "flutter/flow/embedded_views.h"
12 #include "flutter/fml/macros.h"
13 #include "flutter/shell/platform/embedder/embedder_render_target.h"
14 #include "third_party/skia/include/core/SkPictureRecorder.h"
15 
16 namespace flutter {
17 
18 //------------------------------------------------------------------------------
19 /// @brief      The external view embedder used by the generic embedder API.
20 ///             This class acts a proxy between the rasterizer and the embedder
21 ///             when the rasterizer is rendering into multiple layers. It asks
22 ///             the embedder for the render targets for the various layers the
23 ///             rasterizer is rendering into, recycles the render targets as
24 ///             necessary and converts rasterizer specific metadata into an
25 ///             embedder friendly format so that it can present the layers
26 ///             on-screen.
27 ///
28 class EmbedderExternalViewEmbedder final : public ExternalViewEmbedder {
29  public:
30   using CreateRenderTargetCallback =
31       std::function<std::unique_ptr<EmbedderRenderTarget>(
32           GrContext* context,
33           const FlutterBackingStoreConfig& config)>;
34   using PresentCallback =
35       std::function<bool(const std::vector<const FlutterLayer*>& layers)>;
36 
37   //----------------------------------------------------------------------------
38   /// @brief      Creates an external view embedder used by the generic embedder
39   ///             API.
40   ///
41   /// @param[in]  create_render_target_callback
42   ///                                     The render target callback used to
43   ///                                     request the render target for a layer.
44   /// @param[in]  present_callback        The callback used to forward a
45   ///                                     collection of layers (backed by
46   ///                                     fulfilled render targets) to the
47   ///                                     embedder for presentation.
48   ///
49   EmbedderExternalViewEmbedder(
50       CreateRenderTargetCallback create_render_target_callback,
51       PresentCallback present_callback);
52 
53   //----------------------------------------------------------------------------
54   /// @brief      Collects the external view embedder.
55   ///
56   ~EmbedderExternalViewEmbedder() override;
57 
58  private:
59   // |ExternalViewEmbedder|
60   void CancelFrame() override;
61 
62   // |ExternalViewEmbedder|
63   void BeginFrame(SkISize frame_size, GrContext* context) override;
64 
65   // |ExternalViewEmbedder|
66   void PrerollCompositeEmbeddedView(
67       int view_id,
68       std::unique_ptr<EmbeddedViewParams> params) override;
69 
70   // |ExternalViewEmbedder|
71   std::vector<SkCanvas*> GetCurrentCanvases() override;
72 
73   // |ExternalViewEmbedder|
74   SkCanvas* CompositeEmbeddedView(int view_id) override;
75 
76   // |ExternalViewEmbedder|
77   bool SubmitFrame(GrContext* context) override;
78 
79   // |ExternalViewEmbedder|
80   sk_sp<SkSurface> GetRootSurface() override;
81 
82  private:
83   using ViewIdentifier = int64_t;
84   struct RegistryKey {
85     ViewIdentifier view_identifier = 0;
86     SkISize size = SkISize::Make(0, 0);
87 
RegistryKeyRegistryKey88     RegistryKey(ViewIdentifier view_identifier,
89                 const FlutterBackingStoreConfig& config)
90         : view_identifier(view_identifier),
91           size(SkISize::Make(config.size.width, config.size.height)) {}
92 
93     struct Hash {
operatorRegistryKey::Hash94       constexpr std::size_t operator()(RegistryKey const& key) const {
95         return key.view_identifier;
96       };
97     };
98 
99     struct Equal {
operatorRegistryKey::Equal100       constexpr bool operator()(const RegistryKey& lhs,
101                                 const RegistryKey& rhs) const {
102         return lhs.view_identifier == rhs.view_identifier &&
103                lhs.size == rhs.size;
104       }
105     };
106   };
107 
108   const CreateRenderTargetCallback create_render_target_callback_;
109   const PresentCallback present_callback_;
110   using Registry = std::unordered_map<RegistryKey,
111                                       std::shared_ptr<EmbedderRenderTarget>,
112                                       RegistryKey::Hash,
113                                       RegistryKey::Equal>;
114 
115   SkISize pending_frame_size_ = SkISize::Make(0, 0);
116   std::map<ViewIdentifier, std::unique_ptr<SkPictureRecorder>>
117       pending_recorders_;
118   std::map<ViewIdentifier, EmbeddedViewParams> pending_params_;
119   std::vector<ViewIdentifier> composition_order_;
120   std::shared_ptr<EmbedderRenderTarget> root_render_target_;
121   Registry registry_;
122 
123   void Reset();
124 
125   FML_DISALLOW_COPY_AND_ASSIGN(EmbedderExternalViewEmbedder);
126 };
127 
128 }  // namespace flutter
129 
130 #endif  // FLUTTER_SHELL_PLATFORM_EMBEDDER_EMBEDDER_EXTERNAL_VIEW_EMBEDDER_H_
131