Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit bd1acfd

Browse files
author
John Bauman
committed
Log Vulkan loader errors if the instance failed creation on Fuchsia
The vulkan loader can output logs to help us debug why instance creation fails. To catch these logs, we need to pass a debug report callback to vkCreateInstance (since the only other debug report callback is set up after the instance is created). Outputting logs is currently only enabled on Fuchsia, since other platforms may have fallbacks and wouldn't want the error logspam. Fixes flutter/flutter#82928
1 parent 9063095 commit bd1acfd

File tree

2 files changed

+60
-7
lines changed

2 files changed

+60
-7
lines changed

vulkan/vulkan_application.cc

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,36 @@
1313

1414
namespace vulkan {
1515

16+
// static
17+
VKAPI_ATTR VkBool32 VulkanApplication::DebugReportCallback(
18+
VkDebugReportFlagsEXT flags,
19+
VkDebugReportObjectTypeEXT objectType,
20+
uint64_t object,
21+
size_t location,
22+
int32_t messageCode,
23+
const char* pLayerPrefix,
24+
const char* pMessage,
25+
void* pUserData) {
26+
auto application = static_cast<VulkanApplication*>(pUserData);
27+
if (application->initialization_logs_enabled_) {
28+
application->initialization_logs_ += pMessage;
29+
application->initialization_logs_ += "\n";
30+
}
31+
32+
return VK_FALSE;
33+
}
34+
1635
VulkanApplication::VulkanApplication(
1736
VulkanProcTable& p_vk, // NOLINT
1837
const std::string& application_name,
1938
std::vector<std::string> enabled_extensions,
2039
uint32_t application_version,
2140
uint32_t api_version,
2241
bool enable_validation_layers)
23-
: vk_(p_vk),
42+
: valid_(false),
43+
enable_validation_layers_(enable_validation_layers),
2444
api_version_(api_version),
25-
valid_(false),
26-
enable_validation_layers_(enable_validation_layers) {
45+
vk_(p_vk) {
2746
// Check if we want to enable debugging.
2847
std::vector<VkExtensionProperties> supported_extensions =
2948
GetSupportedInstanceExtensions(vk_);
@@ -79,9 +98,21 @@ VulkanApplication::VulkanApplication(
7998
.apiVersion = api_version_,
8099
};
81100

101+
const VkDebugReportCallbackCreateInfoEXT debug_report_info = {
102+
.sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT,
103+
.pNext = nullptr,
104+
.flags = VK_DEBUG_REPORT_INFORMATION_BIT_EXT |
105+
VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT |
106+
VK_DEBUG_REPORT_DEBUG_BIT_EXT,
107+
.pfnCallback = &DebugReportCallback,
108+
.pUserData = this};
109+
82110
const VkInstanceCreateInfo create_info = {
83111
.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO,
84-
.pNext = nullptr,
112+
.pNext = ExtensionSupported(supported_extensions,
113+
VK_EXT_DEBUG_REPORT_EXTENSION_NAME)
114+
? &debug_report_info
115+
: nullptr,
85116
.flags = 0,
86117
.pApplicationInfo = &info,
87118
.enabledLayerCount = static_cast<uint32_t>(layers.size()),
@@ -96,10 +127,19 @@ VulkanApplication::VulkanApplication(
96127

97128
if (VK_CALL_LOG_ERROR(vk_.CreateInstance(&create_info, nullptr, &instance)) !=
98129
VK_SUCCESS) {
130+
#if OS_FUCHSIA
131+
FML_LOG(ERROR) << "Creating instance failed with error:\n"
132+
<< initialization_logs_;
133+
#endif
99134
FML_DLOG(INFO) << "Could not create application instance.";
100135
return;
101136
}
102137

138+
// The debug report callback will also be used in vkDestroyInstance, but we
139+
// don't need its data there.
140+
initialization_logs_enabled_ = false;
141+
initialization_logs_.clear();
142+
103143
// Now that we have an instance, set up instance proc table entries.
104144
if (!vk_.SetupInstanceProcAddresses(VulkanHandle<VkInstance>(instance))) {
105145
FML_DLOG(INFO) << "Could not set up instance proc addresses.";

vulkan/vulkan_application.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,19 +44,32 @@ class VulkanApplication {
4444
std::unique_ptr<VulkanDevice> AcquireFirstCompatibleLogicalDevice() const;
4545

4646
private:
47+
// Located at the beginning so it outlives instance_.
48+
std::string initialization_logs_;
49+
bool initialization_logs_enabled_ = true;
50+
bool valid_;
51+
bool enable_validation_layers_;
52+
uint8_t padding_;
53+
uint32_t api_version_;
4754
VulkanProcTable& vk_;
4855
VulkanHandle<VkInstance> instance_;
49-
uint32_t api_version_;
5056
std::unique_ptr<VulkanDebugReport> debug_report_;
51-
bool valid_;
52-
bool enable_validation_layers_;
5357

5458
std::vector<VkPhysicalDevice> GetPhysicalDevices() const;
5559
std::vector<VkExtensionProperties> GetSupportedInstanceExtensions(
5660
const VulkanProcTable& vk) const;
5761
bool ExtensionSupported(
5862
const std::vector<VkExtensionProperties>& supported_extensions,
5963
const std::string& extension_name);
64+
static VKAPI_ATTR VkBool32 DebugReportCallback(
65+
VkDebugReportFlagsEXT flags,
66+
VkDebugReportObjectTypeEXT objectType,
67+
uint64_t object,
68+
size_t location,
69+
int32_t messageCode,
70+
const char* pLayerPrefix,
71+
const char* pMessage,
72+
void* pUserData);
6073

6174
FML_DISALLOW_COPY_AND_ASSIGN(VulkanApplication);
6275
};

0 commit comments

Comments
 (0)