From 708162a2b0e1b8d1f007b37ee12f9ebb7fb5deb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Thu, 22 Dec 2022 23:07:42 +0100 Subject: [PATCH] Vulkan validation layers: Cap outputting the same message at 10 times. --- Common/GPU/Vulkan/VulkanDebug.cpp | 30 ++++++++++++++++++++++++++++-- Common/GPU/Vulkan/VulkanDebug.h | 2 ++ 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/Common/GPU/Vulkan/VulkanDebug.cpp b/Common/GPU/Vulkan/VulkanDebug.cpp index 7a3d3a079f..4daf41bdf7 100644 --- a/Common/GPU/Vulkan/VulkanDebug.cpp +++ b/Common/GPU/Vulkan/VulkanDebug.cpp @@ -17,16 +17,30 @@ #include #include +#include +#include #include "Common/Log.h" #include "Common/GPU/Vulkan/VulkanContext.h" #include "Common/GPU/Vulkan/VulkanDebug.h" +const int MAX_SAME_ERROR_COUNT = 10; + +// Used to stop outputting the same message over and over. +static std::map g_errorCount; +std::mutex g_errorCountMutex; + +// TODO: Call this when launching games in some clean way. +void VulkanClearValidationErrorCounts() { + std::lock_guard lock(g_errorCountMutex); + g_errorCount.clear(); +} + VKAPI_ATTR VkBool32 VKAPI_CALL VulkanDebugUtilsCallback( VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, - const VkDebugUtilsMessengerCallbackDataEXT* pCallbackData, - void* pUserData) { + const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, + void *pUserData) { const VulkanLogOptions *options = (const VulkanLogOptions *)pUserData; std::ostringstream message; @@ -49,6 +63,18 @@ VKAPI_ATTR VkBool32 VKAPI_CALL VulkanDebugUtilsCallback( return false; } + int count; + { + std::lock_guard lock(g_errorCountMutex); + count = g_errorCount[messageCode]++; + } + if (count == MAX_SAME_ERROR_COUNT) { + WARN_LOG(G3D, "Too many validation messages with message %d, stopping", messageCode); + } + if (count >= MAX_SAME_ERROR_COUNT) { + return false; + } + if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT) { message << "ERROR("; } else if (messageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT) { diff --git a/Common/GPU/Vulkan/VulkanDebug.h b/Common/GPU/Vulkan/VulkanDebug.h index 9287c1e8c5..c718a0303d 100644 --- a/Common/GPU/Vulkan/VulkanDebug.h +++ b/Common/GPU/Vulkan/VulkanDebug.h @@ -26,3 +26,5 @@ struct VulkanLogOptions { }; VKAPI_ATTR VkBool32 VKAPI_CALL VulkanDebugUtilsCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData); + +void VulkanClearValidationErrorCounts();