| 1475 | } |
| 1476 | #endif |
| 1477 | VKAPI_ATTR vk::Bool32 VKAPI_CALL Demo::debug_messenger_callback(vk::DebugUtilsMessageSeverityFlagBitsEXT messageSeverity, |
| 1478 | vk::DebugUtilsMessageTypeFlagsEXT messageType, |
| 1479 | const vk::DebugUtilsMessengerCallbackDataEXT *pCallbackData, |
| 1480 | void *pUserData) { |
| 1481 | std::ostringstream message; |
| 1482 | Demo &demo = *static_cast<Demo *>(pUserData); |
| 1483 | |
| 1484 | if (demo.use_break) { |
| 1485 | #ifndef WIN32 |
| 1486 | raise(SIGTRAP); |
| 1487 | #else |
| 1488 | DebugBreak(); |
| 1489 | #endif |
| 1490 | } |
| 1491 | message << vk::to_string(vk::DebugUtilsMessageSeverityFlagBitsEXT(messageSeverity)); |
| 1492 | message << " : " + vk::to_string(vk::DebugUtilsMessageTypeFlagsEXT(messageType)); |
| 1493 | |
| 1494 | if (vk::DebugUtilsMessageTypeFlagsEXT(messageType) & vk::DebugUtilsMessageTypeFlagBitsEXT::eValidation) { |
| 1495 | validation_error = 1; |
| 1496 | } |
| 1497 | |
| 1498 | message << " - Message Id Number: " << std::to_string(pCallbackData->messageIdNumber); |
| 1499 | message << " | Message Id Name: " << (pCallbackData->pMessageIdName == nullptr ? "" : pCallbackData->pMessageIdName) << "\n\t" |
| 1500 | << pCallbackData->pMessage << "\n"; |
| 1501 | |
| 1502 | if (pCallbackData->objectCount > 0) { |
| 1503 | message << "\n\tObjects - " << pCallbackData->objectCount << "\n"; |
| 1504 | for (uint32_t object = 0; object < pCallbackData->objectCount; ++object) { |
| 1505 | message << "\t\tObject[" << object << "] - " |
| 1506 | << vk::to_string(vk::ObjectType(pCallbackData->pObjects[object].objectType)) << ", Handle "; |
| 1507 | |
| 1508 | // Print handle correctly if it is a dispatchable handle - aka a pointer |
| 1509 | vk::ObjectType t = pCallbackData->pObjects[object].objectType; |
| 1510 | if (t == vk::ObjectType::eInstance || t == vk::ObjectType::ePhysicalDevice || t == vk::ObjectType::eDevice || |
| 1511 | t == vk::ObjectType::eCommandBuffer || t == vk::ObjectType::eQueue) { |
| 1512 | message << reinterpret_cast<void *>(static_cast<uintptr_t>(pCallbackData->pObjects[object].objectHandle)); |
| 1513 | } else { |
| 1514 | message << pCallbackData->pObjects[object].objectHandle; |
| 1515 | } |
| 1516 | if (NULL != pCallbackData->pObjects[object].pObjectName && strlen(pCallbackData->pObjects[object].pObjectName) > 0) { |
| 1517 | message << ", Name \"" << pCallbackData->pObjects[object].pObjectName << "\"\n"; |
| 1518 | } else { |
| 1519 | message << "\n"; |
| 1520 | } |
| 1521 | } |
| 1522 | } |
| 1523 | if (pCallbackData->cmdBufLabelCount > 0) { |
| 1524 | message << "\n\tCommand Buffer Labels - " << pCallbackData->cmdBufLabelCount << "\n"; |
| 1525 | for (uint32_t cmd_buf_label = 0; cmd_buf_label < pCallbackData->cmdBufLabelCount; ++cmd_buf_label) { |
| 1526 | message << "\t\tLabel[" << cmd_buf_label << "] - " << pCallbackData->pCmdBufLabels[cmd_buf_label].pLabelName << " { " |
| 1527 | << pCallbackData->pCmdBufLabels[cmd_buf_label].color[0] << ", " |
| 1528 | << pCallbackData->pCmdBufLabels[cmd_buf_label].color[1] << ", " |
| 1529 | << pCallbackData->pCmdBufLabels[cmd_buf_label].color[2] << ", " |
| 1530 | << pCallbackData->pCmdBufLabels[cmd_buf_label].color[2] << "}\n"; |
| 1531 | } |
| 1532 | } |
| 1533 | |
| 1534 | #ifdef _WIN32 |