Flutter Engine
The Flutter Engine
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"
20
21namespace 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///
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
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::UniqueSemaphore CreateRenderReadySemaphore(
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_
The implementation of a swapchain at a specific size. Resizes to the surface will cause the instance ...
AHBSwapchainImplVK(const AHBSwapchainImplVK &)=delete
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.
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.
AHBSwapchainImplVK & operator=(const AHBSwapchainImplVK &)=delete
FlTexture * texture
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive keep the shell running after the Dart script has completed enable serial On low power devices with low core running concurrent GC tasks on threads can cause them to contend with the UI thread which could potentially lead to jank This option turns off all concurrent GC activities domain network JSON encoded network policy per domain This overrides the DisallowInsecureConnections switch Embedder can specify whether to allow or disallow insecure connections at a domain level old gen heap size
Definition: switches.h:259
dictionary stats
Definition: malisc.py:20
A descriptor use to specify hardware buffer allocations.