13 const vk::Instance& instance) {
19 vk::DebugUtilsMessengerCreateInfoEXT messenger_info;
20 messenger_info.messageSeverity =
21 vk::DebugUtilsMessageSeverityFlagBitsEXT::eWarning |
22 vk::DebugUtilsMessageSeverityFlagBitsEXT::eError;
23 messenger_info.messageType =
24 vk::DebugUtilsMessageTypeFlagBitsEXT::eGeneral |
25 vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance |
26 vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation;
27 messenger_info.pUserData =
this;
28 messenger_info.pfnUserCallback = DebugUtilsMessengerCallback;
30 auto messenger = instance.createDebugUtilsMessengerEXTUnique(messenger_info);
32 if (messenger.result != vk::Result::eSuccess) {
33 FML_LOG(ERROR) <<
"Could not create debug messenger: "
34 << vk::to_string(messenger.result);
38 messenger_ = std::move(messenger.value);
48 static std::string
JoinLabels(
const VkDebugUtilsLabelEXT* labels,
50 std::stringstream stream;
51 for (
size_t i = 0u; i < count; i++) {
52 stream << labels[i].pLabelName;
53 if (i != count - 1u) {
61 const VkDebugUtilsObjectNameInfoEXT* names,
63 std::stringstream stream;
64 for (
size_t i = 0u; i < count; i++) {
65 stream << vk::to_string(vk::ObjectType(names[i].objectType)) <<
" ["
66 << names[i].objectHandle <<
"] [";
67 if (names[i].pObjectName !=
nullptr) {
68 stream << names[i].pObjectName;
73 if (i != count - 1u) {
80 VKAPI_ATTR VkBool32 VKAPI_CALL DebugReportVK::DebugUtilsMessengerCallback(
81 VkDebugUtilsMessageSeverityFlagBitsEXT severity,
82 VkDebugUtilsMessageTypeFlagsEXT type,
83 const VkDebugUtilsMessengerCallbackDataEXT* callback_data,
88 static_cast<vk::DebugUtilsMessageSeverityFlagBitsEXT
>(
90 static_cast<vk::DebugUtilsMessageTypeFlagsEXT
>(type),
94 case Result::kContinue:
102 DebugReportVK::Result DebugReportVK::OnDebugCallback(
103 vk::DebugUtilsMessageSeverityFlagBitsEXT severity,
104 vk::DebugUtilsMessageTypeFlagsEXT type,
105 const VkDebugUtilsMessengerCallbackDataEXT* data) {
108 if (strstr(data->pMessageIdName,
"CoreValidation-Shader-OutputNotConsumed") !=
110 return Result::kContinue;
118 if (data->messageIdNumber ==
static_cast<int32_t
>(0x82ae5050)) {
119 return Result::kContinue;
122 std::vector<std::pair<std::string, std::string>> items;
124 items.emplace_back(
"Severity", vk::to_string(severity));
126 items.emplace_back(
"Type", vk::to_string(type));
128 if (data->pMessageIdName) {
129 items.emplace_back(
"ID Name", data->pMessageIdName);
132 items.emplace_back(
"ID Number", std::to_string(data->messageIdNumber));
134 if (
auto queues =
JoinLabels(data->pQueueLabels, data->queueLabelCount);
136 items.emplace_back(
"Queue Breadcrumbs", std::move(queues));
138 items.emplace_back(
"Queue Breadcrumbs",
"[NONE]");
141 if (
auto cmd_bufs =
JoinLabels(data->pCmdBufLabels, data->cmdBufLabelCount);
143 items.emplace_back(
"CMD Buffer Breadcrumbs", std::move(cmd_bufs));
145 items.emplace_back(
"CMD Buffer Breadcrumbs",
"[NONE]");
151 items.emplace_back(
"Related Objects", std::move(related));
154 if (data->pMessage) {
155 items.emplace_back(
"Trigger", data->pMessage);
160 for (
const auto& item : items) {
161 padding = std::max(padding, item.first.size());
166 std::stringstream stream;
170 stream <<
"--- Vulkan Debug Report ----------------------------------------";
174 for (
const auto& item : items) {
175 stream <<
"| " << std::setw(
static_cast<int>(padding)) << item.first
176 << std::setw(0) <<
": " << item.second << std::endl;
179 stream <<
"-----------------------------------------------------------------";
181 if (type == vk::DebugUtilsMessageTypeFlagBitsEXT::ePerformance) {
182 FML_LOG(INFO) << stream.str();
187 return Result::kContinue;