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