Flutter Engine
 
Loading...
Searching...
No Matches
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"
20#include "vulkan/vulkan_handles.hpp"
21
22namespace impeller {
23
25
26static constexpr const size_t kMaxPendingPresents = 2u;
27
29 vk::UniqueFence acquire;
30 vk::UniqueSemaphore render_ready = {};
31 std::shared_ptr<ExternalSemaphoreVK> present_ready;
32 std::shared_ptr<CommandBuffer> final_cmd_buffer;
33 bool is_valid = false;
34
35 explicit AHBFrameSynchronizerVK(const vk::Device& device);
36
38
39 bool IsValid() const;
40
41 bool WaitForFence(const vk::Device& device);
42};
43
44//------------------------------------------------------------------------------
45/// @brief The implementation of a swapchain at a specific size. Resizes to
46/// the surface will cause the instance of the swapchain impl at
47/// that size to be discarded along with all its caches and
48/// transients.
49///
51 : public std::enable_shared_from_this<AHBSwapchainImplVK> {
52 public:
53 //----------------------------------------------------------------------------
54 /// @brief Create a swapchain of a specific size whose images will be
55 /// presented to the provided surface control.
56 ///
57 /// @param[in] context The context whose allocators will be used to
58 /// create swapchain image resources.
59 /// @param[in] surface_control The surface control to which the swapchain
60 /// images will be presented.
61 /// @param[in] size The size of the swapchain images. This is
62 /// constant for the lifecycle of the swapchain
63 /// impl.
64 /// @param[in] enable_msaa If the swapchain images will be presented
65 /// using a render target that enables MSAA. This
66 /// allows for additional caching of transients.
67 ///
68 /// @return A valid swapchain impl if one can be created. `nullptr`
69 /// otherwise.
70 ///
71 static std::shared_ptr<AHBSwapchainImplVK> Create(
72 const std::weak_ptr<Context>& context,
73 std::weak_ptr<android::SurfaceControl> surface_control,
74 const CreateTransactionCB& cb,
75 const ISize& size,
76 bool enable_msaa);
77
79
81
83
84 //----------------------------------------------------------------------------
85 /// @return The size of the swapchain images that will be displayed on the
86 /// surface control.
87 ///
88 const ISize& GetSize() const;
89
90 //----------------------------------------------------------------------------
91 /// @return If the swapchain impl is valid. If it is not, the instance
92 /// must be discarded. There is no error recovery.
93 ///
94 bool IsValid() const;
95
96 //----------------------------------------------------------------------------
97 /// @brief Get the descriptor used to create the hardware buffers that
98 /// will be displayed on the surface control.
99 ///
100 /// @return The descriptor.
101 ///
103
104 //----------------------------------------------------------------------------
105 /// @brief Acquire the next surface that can be used to present to the
106 /// swapchain.
107 ///
108 /// @return A surface if one can be created. If one cannot be created, it
109 /// is likely due to resource exhaustion.
110 ///
111 std::unique_ptr<Surface> AcquireNextDrawable();
112
113 void AddFinalCommandBuffer(std::shared_ptr<CommandBuffer> cmd_buffer);
114
115 private:
116 using AutoSemaSignaler = std::shared_ptr<fml::ScopedCleanupClosure>;
117
118 std::weak_ptr<android::SurfaceControl> surface_control_;
120 std::shared_ptr<AHBTexturePoolVK> pool_;
121 std::shared_ptr<SwapchainTransientsVK> transients_;
122
123 // In C++20, this mutex can be replaced by the shared pointer specialization
124 // of std::atomic.
125 Mutex currently_displayed_texture_mutex_;
126 std::shared_ptr<AHBTextureSourceVK> currently_displayed_texture_
127 IPLR_GUARDED_BY(currently_displayed_texture_mutex_);
128
129 std::vector<std::unique_ptr<AHBFrameSynchronizerVK>> frame_data_;
130 size_t frame_index_ = 0;
132 bool is_valid_ = false;
133
134 explicit AHBSwapchainImplVK(
135 const std::weak_ptr<Context>& context,
136 std::weak_ptr<android::SurfaceControl> surface_control,
137 const CreateTransactionCB& cb,
138 const ISize& size,
139 bool enable_msaa);
140
141 bool Present(const std::shared_ptr<AHBTextureSourceVK>& texture);
142
143 vk::UniqueSemaphore CreateRenderReadySemaphore(
144 const std::shared_ptr<fml::UniqueFD>& fd) const;
145
146 bool ImportRenderReady(
147 const std::shared_ptr<fml::UniqueFD>& render_ready_fence,
148 const std::shared_ptr<AHBTextureSourceVK>& texture);
149
150 std::shared_ptr<ExternalSemaphoreVK> SubmitSignalForPresentReady(
151 const std::shared_ptr<AHBTextureSourceVK>& texture) const;
152
153 void OnTextureUpdatedOnSurfaceControl(
154 std::shared_ptr<AHBTextureSourceVK> texture,
155 ASurfaceTransactionStats* stats);
156};
157
158} // namespace impeller
159
160#endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_SWAPCHAIN_AHB_AHB_SWAPCHAIN_IMPL_VK_H_
The implementation of a swapchain at a specific size. Resizes to the surface will cause the instance ...
static std::shared_ptr< AHBSwapchainImplVK > Create(const std::weak_ptr< Context > &context, std::weak_ptr< android::SurfaceControl > surface_control, const CreateTransactionCB &cb, const ISize &size, bool enable_msaa)
Create a swapchain of a specific size whose images will be presented to the provided surface control.
AHBSwapchainImplVK(const AHBSwapchainImplVK &)=delete
std::unique_ptr< Surface > AcquireNextDrawable()
Acquire the next surface that can be used to present to the swapchain.
const android::HardwareBufferDescriptor & GetDescriptor() const
Get the descriptor used to create the hardware buffers that will be displayed on the surface control.
void AddFinalCommandBuffer(std::shared_ptr< CommandBuffer > cmd_buffer)
AHBSwapchainImplVK & operator=(const AHBSwapchainImplVK &)=delete
A wrapper for ASurfaceTransaction. https://developer.android.com/ndk/reference/group/native-activity#...
VkDevice device
Definition main.cc:69
FlTexture * texture
std::function< android::SurfaceTransaction()> CreateTransactionCB
static constexpr const size_t kMaxPendingPresents
std::shared_ptr< CommandBuffer > final_cmd_buffer
bool WaitForFence(const vk::Device &device)
std::shared_ptr< ExternalSemaphoreVK > present_ready
A descriptor use to specify hardware buffer allocations.
#define IPLR_GUARDED_BY(x)