Skip to content

Commit d22aef3

Browse files
author
John Bauman
authored
Log Vulkan loader errors if the instance failed creation on Fuchsia (flutter#52935)
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 *If you had to change anything in the [flutter/tests] repo, include a link to the migration guide as per the [breaking change policy].* [C++, Objective-C, Java style guides]: https://github.com/flutter/engine/blob/main/CONTRIBUTING.md#style
1 parent e127e78 commit d22aef3

File tree

2 files changed

+58
-8
lines changed

2 files changed

+58
-8
lines changed

vulkan/vulkan_application.cc

Lines changed: 42 additions & 5 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,16 @@ VulkanApplication::VulkanApplication(
96127

97128
if (VK_CALL_LOG_ERROR(vk_.CreateInstance(&create_info, nullptr, &instance)) !=
98129
VK_SUCCESS) {
99-
FML_DLOG(INFO) << "Could not create application instance.";
130+
FML_LOG(ERROR) << "Creating application instance failed with error:\n"
131+
<< initialization_logs_;
100132
return;
101133
}
102134

135+
// The debug report callback will also be used in vkDestroyInstance, but we
136+
// don't need its data there.
137+
initialization_logs_enabled_ = false;
138+
initialization_logs_.clear();
139+
103140
// Now that we have an instance, set up instance proc table entries.
104141
if (!vk_.SetupInstanceProcAddresses(VulkanHandle<VkInstance>(instance))) {
105142
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)