Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
swapchain_vk.cc
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
6
11
12#if FML_OS_ANDROID
14#endif // FML_OS_ANDROID
15
16namespace impeller {
17
18std::shared_ptr<SwapchainVK> SwapchainVK::Create(
19 const std::shared_ptr<Context>& context,
20 vk::UniqueSurfaceKHR surface,
21 const ISize& size,
22 bool enable_msaa) {
23 auto swapchain = std::shared_ptr<KHRSwapchainVK>(
24 new KHRSwapchainVK(context, std::move(surface), size, enable_msaa));
25 if (!swapchain->IsValid()) {
26 VALIDATION_LOG << "Could not create valid swapchain.";
27 return nullptr;
28 }
29 return swapchain;
30}
31
32#if FML_OS_ANDROID
33std::shared_ptr<SwapchainVK> SwapchainVK::Create(
34 const std::shared_ptr<Context>& context,
35 ANativeWindow* p_window,
36 const CreateTransactionCB& cb,
37 bool enable_msaa) {
38 TRACE_EVENT0("impeller", "CreateAndroidSwapchain");
39 if (!context) {
40 return nullptr;
41 }
42
43 android::NativeWindow window(p_window);
44 if (!window.IsValid()) {
45 return nullptr;
46 }
47
48 // Use AHB Swapchains if they are opted in.
52 android_get_device_api_level() >= 34 ? cb : CreateTransactionCB({});
53 auto surface_control = std::shared_ptr(
54 android::SurfaceControl::Create(window.GetHandle(), "ImpellerSurface"));
55 auto ahb_swapchain =
56 std::shared_ptr<AHBSwapchainVK>(new AHBSwapchainVK(context, //
57 surface_control, //
58 callback, //
59 window.GetSize(), //
60 enable_msaa //
61 ));
62
63 if (ahb_swapchain->IsValid()) {
64 return ahb_swapchain;
65 } else {
67 << "Could not create AHB swapchain. Falling back to KHR variant.";
68 }
69 }
70
71 vk::AndroidSurfaceCreateInfoKHR surface_info;
72 surface_info.setWindow(window.GetHandle());
73 auto [result, surface] =
74 ContextVK::Cast(*context).GetInstance().createAndroidSurfaceKHRUnique(
75 surface_info);
76 if (result != vk::Result::eSuccess) {
77 VALIDATION_LOG << "Could not create KHR Android Surface: "
78 << vk::to_string(result);
79 return nullptr;
80 }
81
82 // Fallback to KHR swapchains if AHB swapchains aren't available.
83 return Create(context, std::move(surface), window.GetSize(), enable_msaa);
84}
85#endif // FML_OS_ANDROID
86
87SwapchainVK::SwapchainVK() = default;
88
90
91} // namespace impeller
static bool IsAvailableOnPlatform()
static ContextVK & Cast(Context &base)
bool GetShouldEnableSurfaceControlSwapchain() const
Whether the Android Surface control based swapchain should be enabled.
vk::Instance GetInstance() const
A swapchain implemented backed by VK_KHR_swapchain and VK_KHR_surface.
static std::shared_ptr< SwapchainVK > Create(const std::shared_ptr< Context > &context, vk::UniqueSurfaceKHR surface, const ISize &size, bool enable_msaa=true)
static std::unique_ptr< SurfaceControl > Create(ANativeWindow *window, const char *debug_name=nullptr)
Creates a new surface control and adds it as a child of the given window.
VkSwapchainKHR swapchain
Definition main.cc:80
GLFWwindow * window
Definition main.cc:60
VkSurfaceKHR surface
Definition main.cc:65
FlutterDesktopBinaryReply callback
std::function< android::SurfaceTransaction()> CreateTransactionCB
#define TRACE_EVENT0(category_group, name)
#define VALIDATION_LOG
Definition validation.h:91
struct ANativeWindow ANativeWindow