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  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.
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 {
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
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:733
vk::Instance GetInstance() const
Definition: context_vk.cc:583
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
#define VALIDATION_LOG
Definition: validation.h:91