Flutter Impeller
khr_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_KHR_KHR_SWAPCHAIN_IMPL_VK_H_
6 #define FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_SWAPCHAIN_KHR_KHR_SWAPCHAIN_IMPL_VK_H_
7 
8 #include <cstdint>
9 #include <memory>
10 #include <variant>
11 
12 #include "impeller/geometry/size.h"
15 
16 namespace impeller {
17 
18 class Context;
19 class KHRSwapchainImageVK;
20 class Surface;
21 struct KHRFrameSynchronizerVK;
22 
23 //------------------------------------------------------------------------------
24 /// @brief An instance of a swapchain that does NOT adapt to going out of
25 /// date with the underlying surface. Errors will be indicated when
26 /// the next drawable is acquired from this implementation of the
27 /// swapchain. If the error is due the swapchain going out of date,
28 /// the caller must recreate another instance by optionally
29 /// stealing this implementations guts.
30 ///
31 class KHRSwapchainImplVK final
32  : public std::enable_shared_from_this<KHRSwapchainImplVK> {
33  public:
34  static std::shared_ptr<KHRSwapchainImplVK> Create(
35  const std::shared_ptr<Context>& context,
36  vk::UniqueSurfaceKHR surface,
37  const ISize& size,
38  bool enable_msaa = true,
39  vk::SwapchainKHR old_swapchain = VK_NULL_HANDLE);
40 
42 
43  bool IsValid() const;
44 
45  struct AcquireResult {
46  std::unique_ptr<Surface> surface;
47  bool out_of_date = false;
48 
49  explicit AcquireResult(bool p_out_of_date = false)
50  : out_of_date(p_out_of_date) {}
51 
52  explicit AcquireResult(std::unique_ptr<Surface> p_surface)
53  : surface(std::move(p_surface)) {}
54  };
55 
56  AcquireResult AcquireNextDrawable();
57 
58  vk::Format GetSurfaceFormat() const;
59 
60  std::shared_ptr<Context> GetContext() const;
61 
62  std::pair<vk::UniqueSurfaceKHR, vk::UniqueSwapchainKHR> DestroySwapchain();
63 
64  const ISize& GetSize() const;
65 
66  private:
67  std::weak_ptr<Context> context_;
68  vk::UniqueSurfaceKHR surface_;
69  vk::Format surface_format_ = vk::Format::eUndefined;
70  vk::UniqueSwapchainKHR swapchain_;
71  std::shared_ptr<SwapchainTransientsVK> transients_;
72  std::vector<std::shared_ptr<KHRSwapchainImageVK>> images_;
73  std::vector<std::unique_ptr<KHRFrameSynchronizerVK>> synchronizers_;
74  size_t current_frame_ = 0u;
75  ISize size_;
76  bool enable_msaa_ = true;
77  bool is_valid_ = false;
78 
79  KHRSwapchainImplVK(const std::shared_ptr<Context>& context,
80  vk::UniqueSurfaceKHR surface,
81  const ISize& size,
82  bool enable_msaa,
83  vk::SwapchainKHR old_swapchain);
84 
85  bool Present(const std::shared_ptr<KHRSwapchainImageVK>& image,
86  uint32_t index);
87 
88  void WaitIdle() const;
89 
90  KHRSwapchainImplVK(const KHRSwapchainImplVK&) = delete;
91 
92  KHRSwapchainImplVK& operator=(const KHRSwapchainImplVK&) = delete;
93 };
94 
95 } // namespace impeller
96 
97 #endif // FLUTTER_IMPELLER_RENDERER_BACKEND_VULKAN_SWAPCHAIN_KHR_KHR_SWAPCHAIN_IMPL_VK_H_
impeller::KHRSwapchainImplVK::AcquireResult::surface
std::unique_ptr< Surface > surface
Definition: khr_swapchain_impl_vk.h:46
impeller::KHRSwapchainImplVK::GetSurfaceFormat
vk::Format GetSurfaceFormat() const
Definition: khr_swapchain_impl_vk.cc:306
impeller::KHRSwapchainImplVK::GetSize
const ISize & GetSize() const
Definition: khr_swapchain_impl_vk.cc:281
impeller::KHRSwapchainImplVK
An instance of a swapchain that does NOT adapt to going out of date with the underlying surface....
Definition: khr_swapchain_impl_vk.h:31
impeller::KHRSwapchainImplVK::AcquireNextDrawable
AcquireResult AcquireNextDrawable()
Definition: khr_swapchain_impl_vk.cc:314
swapchain_transients_vk.h
impeller::KHRSwapchainImplVK::DestroySwapchain
std::pair< vk::UniqueSurfaceKHR, vk::UniqueSwapchainKHR > DestroySwapchain()
Definition: khr_swapchain_impl_vk.cc:297
vk.h
impeller::KHRSwapchainImplVK::AcquireResult
Definition: khr_swapchain_impl_vk.h:45
impeller::TSize
Definition: size.h:19
impeller::KHRSwapchainImplVK::GetContext
std::shared_ptr< Context > GetContext() const
Definition: khr_swapchain_impl_vk.cc:310
impeller::KHRSwapchainImplVK::~KHRSwapchainImplVK
~KHRSwapchainImplVK()
Definition: khr_swapchain_impl_vk.cc:277
impeller::KHRSwapchainImplVK::IsValid
bool IsValid() const
Definition: khr_swapchain_impl_vk.cc:285
impeller::KHRSwapchainImplVK::Create
static std::shared_ptr< KHRSwapchainImplVK > Create(const std::shared_ptr< Context > &context, vk::UniqueSurfaceKHR surface, const ISize &size, bool enable_msaa=true, vk::SwapchainKHR old_swapchain=VK_NULL_HANDLE)
Definition: khr_swapchain_impl_vk.cc:118
std
Definition: comparable.h:95
impeller::KHRSwapchainImplVK::AcquireResult::AcquireResult
AcquireResult(bool p_out_of_date=false)
Definition: khr_swapchain_impl_vk.h:49
impeller::KHRSwapchainImplVK::AcquireResult::out_of_date
bool out_of_date
Definition: khr_swapchain_impl_vk.h:47
impeller::KHRSwapchainImplVK::AcquireResult::AcquireResult
AcquireResult(std::unique_ptr< Surface > p_surface)
Definition: khr_swapchain_impl_vk.h:52
impeller
Definition: aiks_blend_unittests.cc:18
size.h