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 
6 
7 #include "flutter/fml/trace_event.h"
11 
12 #if FML_OS_ANDROID
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  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.
51  CreateTransactionCB callback =
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 
87 SwapchainVK::SwapchainVK() = default;
88 
89 SwapchainVK::~SwapchainVK() = default;
90 
91 } // namespace impeller
static bool IsAvailableOnPlatform()
static ContextVK & Cast(Context &base)
Definition: backend_cast.h:13
bool GetShouldEnableSurfaceControlSwapchain() const
Whether the Android Surface control based swapchain should be enabled.
Definition: context_vk.cc:743
vk::Instance GetInstance() const
Definition: context_vk.cc:587
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)
Definition: swapchain_vk.cc:18
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.
std::function< android::SurfaceTransaction()> CreateTransactionCB
std::shared_ptr< ContextGLES > context
#define VALIDATION_LOG
Definition: validation.h:91