Flutter Impeller
ahb_swapchain_impl_vk.h
Go to the documentation of this file.
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_IMPELLER_RENDERER_BACKEND_VULKAN_SWAPCHAIN_AHB_AHB_SWAPCHAIN_IMPL_VK_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_SWAPCHAIN_AHB_AHB_SWAPCHAIN_IMPL_VK_H_
7 
8 #include <memory>
9 
10 #include "flutter/fml/closure.h"
11 #include "flutter/fml/synchronization/semaphore.h"
12 #include "impeller/base/thread.h"
20 
21 namespace impeller {
22 
23 //------------------------------------------------------------------------------
24 /// @brief The implementation of a swapchain at a specific size. Resizes to
25 /// the surface will cause the instance of the swapchain impl at
26 /// that size to be discarded along with all its caches and
27 /// transients.
28 ///
29 class AHBSwapchainImplVK final
30  : public std::enable_shared_from_this<AHBSwapchainImplVK> {
31  public:
32  //----------------------------------------------------------------------------
33  /// @brief Create a swapchain of a specific size whose images will be
34  /// presented to the provided surface control.
35  ///
36  /// @param[in] context The context whose allocators will be used to
37  /// create swapchain image resources.
38  /// @param[in] surface_control The surface control to which the swapchain
39  /// images will be presented.
40  /// @param[in] size The size of the swapchain images. This is
41  /// constant for the lifecycle of the swapchain
42  /// impl.
43  /// @param[in] enable_msaa If the swapchain images will be presented
44  /// using a render target that enables MSAA. This
45  /// allows for additional caching of transients.
46  ///
47  /// @return A valid swapchain impl if one can be created. `nullptr`
48  /// otherwise.
49  ///
50  static std::shared_ptr<AHBSwapchainImplVK> Create(
51  const std::weak_ptr<Context>& context,
52  std::weak_ptr<android::SurfaceControl> surface_control,
53  const ISize& size,
54  bool enable_msaa,
55  size_t swapchain_image_count);
56 
58 
59  AHBSwapchainImplVK(const AHBSwapchainImplVK&) = delete;
60 
62 
63  //----------------------------------------------------------------------------
64  /// @return The size of the swapchain images that will be displayed on the
65  /// surface control.
66  ///
67  const ISize& GetSize() const;
68 
69  //----------------------------------------------------------------------------
70  /// @return If the swapchain impl is valid. If it is not, the instance
71  /// must be discarded. There is no error recovery.
72  ///
73  bool IsValid() const;
74 
75  //----------------------------------------------------------------------------
76  /// @brief Get the descriptor used to create the hardware buffers that
77  /// will be displayed on the surface control.
78  ///
79  /// @return The descriptor.
80  ///
82 
83  //----------------------------------------------------------------------------
84  /// @brief Acquire the next surface that can be used to present to the
85  /// swapchain.
86  ///
87  /// @return A surface if one can be created. If one cannot be created, it
88  /// is likely due to resource exhaustion.
89  ///
90  std::unique_ptr<Surface> AcquireNextDrawable();
91 
92  private:
93  using AutoSemaSignaler = std::shared_ptr<fml::ScopedCleanupClosure>;
94 
95  std::weak_ptr<android::SurfaceControl> surface_control_;
97  std::shared_ptr<AHBTexturePoolVK> pool_;
98  std::shared_ptr<SwapchainTransientsVK> transients_;
99  // In C++20, this mutex can be replaced by the shared pointer specialization
100  // of std::atomic.
101  Mutex currently_displayed_texture_mutex_;
102  std::shared_ptr<AHBTextureSourceVK> currently_displayed_texture_
103  IPLR_GUARDED_BY(currently_displayed_texture_mutex_);
104  std::shared_ptr<fml::Semaphore> pending_presents_;
105  bool is_valid_ = false;
106 
107  explicit AHBSwapchainImplVK(
108  const std::weak_ptr<Context>& context,
109  std::weak_ptr<android::SurfaceControl> surface_control,
110  const ISize& size,
111  bool enable_msaa,
112  size_t swapchain_image_count);
113 
114  bool Present(const AutoSemaSignaler& signaler,
115  const std::shared_ptr<AHBTextureSourceVK>& texture);
116 
117  vk::UniqueFence CreateRenderReadyFence(
118  const std::shared_ptr<fml::UniqueFD>& fd) const;
119 
120  bool SubmitWaitForRenderReady(
121  const std::shared_ptr<fml::UniqueFD>& render_ready_fence,
122  const std::shared_ptr<AHBTextureSourceVK>& texture) const;
123 
124  std::shared_ptr<ExternalFenceVK> SubmitSignalForPresentReady(
125  const std::shared_ptr<AHBTextureSourceVK>& texture) const;
126 
127  void OnTextureUpdatedOnSurfaceControl(
128  const AutoSemaSignaler& signaler,
129  std::shared_ptr<AHBTextureSourceVK> texture,
130  ASurfaceTransactionStats* stats);
131 };
132 
133 } // namespace impeller
134 
135 #endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_SWAPCHAIN_AHB_AHB_SWAPCHAIN_IMPL_VK_H_
hardware_buffer.h
impeller::AHBSwapchainImplVK::GetDescriptor
const android::HardwareBufferDescriptor & GetDescriptor() const
Get the descriptor used to create the hardware buffers that will be displayed on the surface control.
Definition: ahb_swapchain_impl_vk.cc:86
impeller::AHBSwapchainImplVK::operator=
AHBSwapchainImplVK & operator=(const AHBSwapchainImplVK &)=delete
impeller::AHBSwapchainImplVK::AcquireNextDrawable
std::unique_ptr< Surface > AcquireNextDrawable()
Acquire the next surface that can be used to present to the swapchain.
Definition: ahb_swapchain_impl_vk.cc:91
surface_control.h
swapchain_transients_vk.h
impeller::AHBSwapchainImplVK
The implementation of a swapchain at a specific size. Resizes to the surface will cause the instance ...
Definition: ahb_swapchain_impl_vk.h:29
impeller::AHBSwapchainImplVK::Create
static std::shared_ptr< AHBSwapchainImplVK > Create(const std::weak_ptr< Context > &context, std::weak_ptr< android::SurfaceControl > surface_control, const ISize &size, bool enable_msaa, size_t swapchain_image_count)
Create a swapchain of a specific size whose images will be presented to the provided surface control.
Definition: ahb_swapchain_impl_vk.cc:43
external_fence_vk.h
surface.h
impeller::AHBSwapchainImplVK::AHBSwapchainImplVK
AHBSwapchainImplVK(const AHBSwapchainImplVK &)=delete
impeller::TSize
Definition: size.h:19
impeller::android::HardwareBufferDescriptor
A descriptor use to specify hardware buffer allocations.
Definition: hardware_buffer.h:47
ahb_texture_source_vk.h
impeller::AHBSwapchainImplVK::~AHBSwapchainImplVK
~AHBSwapchainImplVK()
impeller::AHBSwapchainImplVK::GetSize
const ISize & GetSize() const
Definition: ahb_swapchain_impl_vk.cc:78
ahb_texture_pool_vk.h
impeller::AHBSwapchainImplVK::IsValid
bool IsValid() const
Definition: ahb_swapchain_impl_vk.cc:82
thread.h
impeller
Definition: allocation.cc:12