// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #include #include "common/logging/log.h" #include "video_core/vulkan_common/vulkan_debug_callback.h" namespace Vulkan { namespace { VkBool32 DebugUtilCallback(VkDebugUtilsMessageSeverityFlagBitsEXT severity, VkDebugUtilsMessageTypeFlagsEXT type, const VkDebugUtilsMessengerCallbackDataEXT* data, [[maybe_unused]] void* user_data) { // Skip logging known false-positive validation errors switch (static_cast(data->messageIdNumber)) { #ifdef ANDROID case 0xbf9cf353u: // VUID-vkCmdBindVertexBuffers2-pBuffers-04111 // The below are due to incorrect reporting of extendedDynamicState case 0x1093bebbu: // VUID-vkCmdSetCullMode-None-03384 case 0x9215850fu: // VUID-vkCmdSetDepthTestEnable-None-03352 case 0x86bf18dcu: // VUID-vkCmdSetDepthWriteEnable-None-03354 case 0x0792ad08u: // VUID-vkCmdSetStencilOp-None-03351 case 0x93e1ba4eu: // VUID-vkCmdSetFrontFace-None-03383 case 0xac9c13c5u: // VUID-vkCmdSetStencilTestEnable-None-03350 case 0xc9a2001bu: // VUID-vkCmdSetDepthBoundsTestEnable-None-03349 case 0x8b7159a7u: // VUID-vkCmdSetDepthCompareOp-None-03353 // The below are due to incorrect reporting of extendedDynamicState2 case 0xb13c8036u: // VUID-vkCmdSetDepthBiasEnable-None-04872 case 0xdff2e5c1u: // VUID-vkCmdSetRasterizerDiscardEnable-None-04871 case 0x0cc85f41u: // VUID-vkCmdSetPrimitiveRestartEnable-None-04866 case 0x01257b492: // VUID-vkCmdSetLogicOpEXT-None-0486 // The below are due to incorrect reporting of vertexInputDynamicState case 0x398e0dabu: // VUID-vkCmdSetVertexInputEXT-None-04790 // The below are due to incorrect reporting of extendedDynamicState3 case 0x970c11a5u: // VUID-vkCmdSetColorWriteMaskEXT-extendedDynamicState3ColorWriteMask-07364 case 0x6b453f78u: // VUID-vkCmdSetColorBlendEnableEXT-extendedDynamicState3ColorBlendEnable-07355 case 0xf66469d0u: // VUID-vkCmdSetColorBlendEquationEXT-extendedDynamicState3ColorBlendEquation-07356 case 0x1d43405eu: // VUID-vkCmdSetLogicOpEnableEXT-extendedDynamicState3LogicOpEnable-07365 case 0x638462e8u: // VUID-vkCmdSetDepthClampEnableEXT-extendedDynamicState3DepthClampEnable-07448 // Misc case 0xe0a2da61u: // VUID-vkCmdDrawIndexed-format-07753 #else case 0x682a878au: // VUID-vkCmdBindVertexBuffers2EXT-pBuffers-parameter case 0x99fb7dfdu: // UNASSIGNED-RequiredParameter (vkCmdBindVertexBuffers2EXT pBuffers[0]) case 0xe8616bf2u: // Bound VkDescriptorSet 0x0[] was destroyed. Likely push_descriptor related case 0x1608dec0u: // Image layout in vkUpdateDescriptorSet doesn't match descriptor use case 0x55362756u: // Descriptor binding and framebuffer attachment overlap #endif return VK_FALSE; default: break; } const std::string_view message{data->pMessage}; if (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { LOG_CRITICAL(Render_Vulkan, "{}", message); } else if (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { LOG_WARNING(Render_Vulkan, "{}", message); } else if (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT) { LOG_INFO(Render_Vulkan, "{}", message); } else if (severity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT) { LOG_DEBUG(Render_Vulkan, "{}", message); } return VK_FALSE; } VkBool32 DebugReportCallback(VkDebugReportFlagsEXT flags, VkDebugReportObjectTypeEXT objectType, uint64_t object, size_t location, int32_t messageCode, const char* pLayerPrefix, const char* pMessage, void* pUserData) { const VkDebugReportFlagBitsEXT severity = static_cast(flags); const std::string_view message{pMessage}; if (severity & VK_DEBUG_REPORT_ERROR_BIT_EXT) { LOG_CRITICAL(Render_Vulkan, "{}", message); } else if (severity & VK_DEBUG_REPORT_WARNING_BIT_EXT) { LOG_WARNING(Render_Vulkan, "{}", message); } else if (severity & VK_DEBUG_REPORT_INFORMATION_BIT_EXT) { LOG_INFO(Render_Vulkan, "{}", message); } else if (severity & VK_DEBUG_REPORT_DEBUG_BIT_EXT) { LOG_DEBUG(Render_Vulkan, "{}", message); } return VK_FALSE; } } // Anonymous namespace vk::DebugUtilsMessenger CreateDebugUtilsCallback(const vk::Instance& instance) { return instance.CreateDebugUtilsMessenger(VkDebugUtilsMessengerCreateInfoEXT{ .sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT, .pNext = nullptr, .flags = 0, .messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT, .messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT, .pfnUserCallback = DebugUtilCallback, .pUserData = nullptr, }); } vk::DebugReportCallback CreateDebugReportCallback(const vk::Instance& instance) { return instance.CreateDebugReportCallback({ .sType = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, .pNext = nullptr, .flags = VK_DEBUG_REPORT_DEBUG_BIT_EXT | VK_DEBUG_REPORT_INFORMATION_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, .pfnCallback = DebugReportCallback, .pUserData = nullptr, }); } } // namespace Vulkan