Vulkan: Dont immediately crash on bad pipeline cache

This commit is contained in:
Exzap 2023-09-09 14:09:40 +02:00
parent 62889adfde
commit c168cf536a

View File

@ -2119,18 +2119,14 @@ void VulkanRenderer::CreatePipelineCache()
if (fs::exists(dir)) if (fs::exists(dir))
{ {
const auto filename = dir / fmt::format("{:016x}.bin", CafeSystem::GetForegroundTitleId()); const auto filename = dir / fmt::format("{:016x}.bin", CafeSystem::GetForegroundTitleId());
auto file = std::ifstream(filename, std::ios::in | std::ios::binary | std::ios::ate); auto file = std::ifstream(filename, std::ios::in | std::ios::binary | std::ios::ate);
if (file.is_open()) if (file.is_open())
{ {
const size_t fileSize = file.tellg(); const size_t fileSize = file.tellg();
file.seekg(0, std::ifstream::beg); file.seekg(0, std::ifstream::beg);
cacheData.resize(fileSize); cacheData.resize(fileSize);
file.read((char*)cacheData.data(), cacheData.size()); file.read((char*)cacheData.data(), cacheData.size());
file.close(); file.close();
cemuLog_logDebug(LogType::Force, "pipeline cache loaded");
} }
} }
@ -2140,7 +2136,16 @@ void VulkanRenderer::CreatePipelineCache()
createInfo.pInitialData = cacheData.data(); createInfo.pInitialData = cacheData.data();
VkResult result = vkCreatePipelineCache(m_logicalDevice, &createInfo, nullptr, &m_pipeline_cache); VkResult result = vkCreatePipelineCache(m_logicalDevice, &createInfo, nullptr, &m_pipeline_cache);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
UnrecoverableError(fmt::format("Failed to create pipeline cache: {}", result).c_str()); {
cemuLog_log(LogType::Force, "Failed to open Vulkan pipeline cache: {}", result);
// unable to load the existing cache, start with an empty cache instead
createInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
createInfo.initialDataSize = 0;
createInfo.pInitialData = nullptr;
result = vkCreatePipelineCache(m_logicalDevice, &createInfo, nullptr, &m_pipeline_cache);
if (result != VK_SUCCESS)
UnrecoverableError(fmt::format("Failed to create new Vulkan pipeline cache: {}", result).c_str());
}
size_t cache_size = 0; size_t cache_size = 0;
vkGetPipelineCacheData(m_logicalDevice, m_pipeline_cache, &cache_size, nullptr); vkGetPipelineCacheData(m_logicalDevice, m_pipeline_cache, &cache_size, nullptr);