37 const std::string& application_name,
38 std::vector<std::string> enabled_extensions,
39 uint32_t application_version,
44 api_version_(api_version),
47 std::vector<VkExtensionProperties> supported_extensions =
48 GetSupportedInstanceExtensions(vk_);
49 bool enable_instance_debugging =
50 enable_validation_layers_ &&
51 ExtensionSupported(supported_extensions,
56 if (enable_instance_debugging) {
60 if (ExtensionSupported(supported_extensions,
61 VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME)) {
65 enabled_extensions.emplace_back(
66 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
67 enabled_extensions.emplace_back(
68 VK_KHR_EXTERNAL_MEMORY_CAPABILITIES_EXTENSION_NAME);
72 std::vector<const char*> extensions;
74 extensions.reserve(enabled_extensions.size());
75 for (
size_t i = 0;
i < enabled_extensions.size();
i++) {
76 extensions.push_back(enabled_extensions[
i].c_str());
81 const std::vector<std::string> enabled_layers =
84 std::vector<const char*>
layers;
86 layers.reserve(enabled_layers.size());
87 for (
size_t i = 0;
i < enabled_layers.size();
i++) {
88 layers.push_back(enabled_layers[
i].c_str());
93 const VkApplicationInfo info = {
94 .sType = VK_STRUCTURE_TYPE_APPLICATION_INFO,
96 .pApplicationName = application_name.c_str(),
97 .applicationVersion = application_version,
98 .pEngineName =
"FlutterEngine",
99 .engineVersion = VK_MAKE_VERSION(1, 0, 0),
100 .apiVersion = api_version_,
103 const VkDebugReportCallbackCreateInfoEXT debug_report_info = {
104 .sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
106 .flags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT |
107 VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT |
108 VK_DEBUG_REPORT_DEBUG_BIT_EXT,
109 .pfnCallback = &DebugReportCallback,
112 const VkInstanceCreateInfo create_info = {
113 .sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
114 .pNext = ExtensionSupported(supported_extensions,
115 VK_EXT_DEBUG_REPORT_EXTENSION_NAME)
119 .pApplicationInfo = &info,
120 .enabledLayerCount =
static_cast<uint32_t
>(
layers.
size()),
121 .ppEnabledLayerNames =
layers.data(),
122 .enabledExtensionCount =
static_cast<uint32_t
>(extensions.size()),
123 .ppEnabledExtensionNames = extensions.data(),
128 VkInstance
instance = VK_NULL_HANDLE;
132 FML_LOG(ERROR) <<
"Creating application instance failed with error:\n"
133 << initialization_logs_;
139 initialization_logs_enabled_ =
false;
140 initialization_logs_.clear();
144 FML_DLOG(INFO) <<
"Could not set up instance proc addresses.";
150 <<
"Destroying Vulkan instance";
151 vk_.DestroyInstance(
i,
nullptr);
154 if (enable_instance_debugging) {
155 auto debug_report = std::make_unique<VulkanDebugReport>(vk_, instance_);
156 if (!debug_report->IsValid()) {
157 FML_DLOG(INFO) <<
"Vulkan debugging was enabled but could not be set up "
158 "for this instance.";
160 debug_report_ = std::move(debug_report);
161 FML_DLOG(INFO) <<
"Debug reporting is enabled.";
VulkanApplication(VulkanProcTable &vk, const std::string &application_name, std::vector< std::string > enabled_extensions, uint32_t application_version=VK_MAKE_VERSION(1, 0, 0), uint32_t api_version=VK_MAKE_VERSION(1, 0, 0), bool enable_validation_layers=false)
bool enable_validation_layers