Vulkan validation layers: Cap outputting the same message at 10 times.

This commit is contained in:
Henrik Rydgård 2022-12-22 23:07:42 +01:00
parent 463d703feb
commit 708162a2b0
2 changed files with 30 additions and 2 deletions

View File

@ -17,16 +17,30 @@
#include <string>
#include <sstream>
#include <map>
#include <mutex>
#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<int, int> g_errorCount;
std::mutex g_errorCountMutex;
// TODO: Call this when launching games in some clean way.
void VulkanClearValidationErrorCounts() {
std::lock_guard<std::mutex> 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<std::mutex> 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) {

View File

@ -26,3 +26,5 @@ struct VulkanLogOptions {
};
VKAPI_ATTR VkBool32 VKAPI_CALL VulkanDebugUtilsCallback(VkDebugUtilsMessageSeverityFlagBitsEXT messageSeverity, VkDebugUtilsMessageTypeFlagsEXT messageType, const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, void *pUserData);
void VulkanClearValidationErrorCounts();