| Flutter Impeller |

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
5 #include "impeller/renderer/backend/vulkan/swapchain/swapchain_vk.h"
6
7 #include "flutter/fml/trace_event.h"
8 #include "impeller/renderer/backend/vulkan/context_vk.h"
9 #include "impeller/renderer/backend/vulkan/swapchain/khr/khr_swapchain_vk.h"
10 #include "impeller/renderer/backend/vulkan/vk.h"
11
12 #if FML_OS_ANDROID
13 #include "impeller/renderer/backend/vulkan/swapchain/ahb/ahb_swapchain_vk.h"
14 #endif // FML_OS_ANDROID
15
16 namespace impeller {
17
18 std::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
33 std::shared_ptr<SwapchainVK> SwapchainVK::Create(
34 const std::shared_ptr<Context>& context,
35 ANativeWindow* p_window,
36 bool enable_msaa) {
37 TRACE_EVENT0("impeller", "CreateAndroidSwapchain");
38 if (!context) {
39 return nullptr;
40 }
41
42 android::NativeWindow window(p_window);
43 if (!window.IsValid()) {
44 return nullptr;
45 }
46
47 vk::AndroidSurfaceCreateInfoKHR surface_info;
48 surface_info.setWindow(window.GetHandle());
49 auto [result, surface] =
50 ContextVK::Cast(*context).GetInstance().createAndroidSurfaceKHRUnique(
51 surface_info);
52 if (result != vk::Result::eSuccess) {
53 VALIDATION_LOG << "Could not create KHR Android Surface: "
54 << vk::to_string(result);
55 return nullptr;
56 }
57
58 // Use AHB Swapchains if they are opted in.
59 if (ContextVK::Cast(*context).GetShouldEnableSurfaceControlSwapchain() &&
60 AHBSwapchainVK::IsAvailableOnPlatform()) {
61 FML_LOG(WARNING) << "Using Android SurfaceControl Swapchain.";
62 auto ahb_swapchain = std::shared_ptr<AHBSwapchainVK>(new AHBSwapchainVK(
63 context, //
64 window.GetHandle(), //
65 surface, //
66 window.GetSize(), //
67 enable_msaa //
68 ));
69
70 if (ahb_swapchain->IsValid()) {
71 return ahb_swapchain;
72 } else {
73 VALIDATION_LOG
74 << "Could not create AHB swapchain. Falling back to KHR variant.";
75 }
76 }
77
78 // Fallback to KHR swapchains if AHB swapchains aren't available.
79 return Create(context, std::move(surface), window.GetSize(), enable_msaa);
80 }
81 #endif // FML_OS_ANDROID
82
83 SwapchainVK::SwapchainVK() = default;
84
85 SwapchainVK::~SwapchainVK() = default;
86
87 } // namespace impeller
ahb_swapchain_vk.h
impeller::AHBSwapchainVK::IsAvailableOnPlatform
static bool IsAvailableOnPlatform()
Definition: ahb_swapchain_vk.cc:15
impeller::BackendCast< ContextVK, Context >::Cast
static ContextVK & Cast(Context &base)
Definition: backend_cast.h:13
impeller::ContextVK::GetShouldEnableSurfaceControlSwapchain
bool GetShouldEnableSurfaceControlSwapchain() const
Whether the Android Surface control based swapchain should be enabled.
Definition: context_vk.cc:733
impeller::ContextVK::GetInstance
vk::Instance GetInstance() const
Definition: context_vk.cc:583
impeller::KHRSwapchainVK
A swapchain implemented backed by VK_KHR_swapchain and VK_KHR_surface.
Definition: khr_swapchain_vk.h:24
impeller::SwapchainVK::~SwapchainVK
virtual ~SwapchainVK()
impeller::SwapchainVK::SwapchainVK
SwapchainVK()
impeller::SwapchainVK::Create
static std::shared_ptr< SwapchainVK > Create(const std::shared_ptr< Context > &context, vk::UniqueSurfaceKHR surface, const ISize &size, bool enable_msaa=true)
Definition: swapchain_vk.cc:18
context_vk.h
khr_swapchain_vk.h
impeller
Definition: allocation.cc:12
impeller::TSize
Definition: size.h:25
swapchain_vk.h
VALIDATION_LOG
#define VALIDATION_LOG
Definition: validation.h:91
vk.h