From b2949f114b144c0a7de6466d1f796706431dc191 Mon Sep 17 00:00:00 2001 From: kd-11 Date: Mon, 23 Dec 2024 23:23:36 +0300 Subject: [PATCH] vk: Wrap device fault handler in SEH2 --- rpcs3/Emu/RSX/VK/vkutils/shared.cpp | 50 +++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 14 deletions(-) diff --git a/rpcs3/Emu/RSX/VK/vkutils/shared.cpp b/rpcs3/Emu/RSX/VK/vkutils/shared.cpp index 41d116d30a..16bc0066ae 100644 --- a/rpcs3/Emu/RSX/VK/vkutils/shared.cpp +++ b/rpcs3/Emu/RSX/VK/vkutils/shared.cpp @@ -23,30 +23,52 @@ namespace vk { .sType = VK_STRUCTURE_TYPE_DEVICE_FAULT_COUNTS_EXT }; - g_render_device->_vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, nullptr); - std::vector address_info(fault_counts.addressInfoCount, VkDeviceFaultAddressInfoEXT{}); - std::vector vendor_info(fault_counts.vendorInfoCount, VkDeviceFaultVendorInfoEXT{}); - std::vector vendor_binary_data(fault_counts.vendorBinarySize); - VkDeviceFaultInfoEXT fault_info + std::vector address_info; + std::vector vendor_info; + std::vector vendor_binary_data; + std::string fault_description; + +#ifdef _MSC_VER + __try { - .sType = VK_STRUCTURE_TYPE_DEVICE_FAULT_INFO_EXT, - .pAddressInfos = address_info.data(), - .pVendorInfos = vendor_info.data(), - .pVendorBinaryData = vendor_binary_data.data() - }; +#endif + // Retrieve sizes + g_render_device->_vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, nullptr); - g_render_device->_vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, &fault_info); + // Resize arrays and fill + address_info.resize(fault_counts.addressInfoCount); + vendor_info.resize(fault_counts.vendorInfoCount); + vendor_binary_data.resize(fault_counts.vendorBinarySize); + + VkDeviceFaultInfoEXT fault_info + { + .sType = VK_STRUCTURE_TYPE_DEVICE_FAULT_INFO_EXT, + .pAddressInfos = address_info.data(), + .pVendorInfos = vendor_info.data(), + .pVendorBinaryData = vendor_binary_data.data() + }; + g_render_device->_vkGetDeviceFaultInfoEXT(*g_render_device, &fault_counts, &fault_info); + + fault_description = fault_info.description; +#ifdef _MSC_VER + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + rsx_log.error("Driver crashed retrieving extended crash information. Are you running on an NVIDIA card?"); + return "Extended fault information is not available. The driver crashed when retrieving the details."; + } +#endif std::string fault_message = fmt::format( "Device Fault Information:\n" "Fault Summary:\n" " %s\n\n", - fault_info.description); + fault_description); if (!address_info.empty()) { - fmt::append(fault_message, " Address Fault Information:\n", fault_info.description); + fmt::append(fault_message, " Address Fault Information:\n", fault_description); for (const auto& fault : address_info) { @@ -78,7 +100,7 @@ namespace vk if (!vendor_info.empty()) { - fmt::append(fault_message, " Vendor Fault Information:\n", fault_info.description); + fmt::append(fault_message, " Vendor Fault Information:\n", fault_description); for (const auto& fault : vendor_info) {