From f1cd1d535bc8a90e14f302b33fb4f2d93f05d5d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Sun, 21 Nov 2021 21:23:15 +0100 Subject: [PATCH] Add a hidden setting to turn off the shader cache, for shader compile performance work --- Core/Config.cpp | 2 ++ Core/Config.h | 1 + GPU/GLES/GPU_GLES.cpp | 18 +++++++++++++----- GPU/Vulkan/GPU_Vulkan.cpp | 10 ++++++++++ 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Core/Config.cpp b/Core/Config.cpp index a0267b51bb..fbf79b44c5 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -914,6 +914,8 @@ static ConfigSetting graphicsSettings[] = { ConfigSetting("InflightFrames", &g_Config.iInflightFrames, 3, true, false), ConfigSetting("RenderDuplicateFrames", &g_Config.bRenderDuplicateFrames, false, true, true), + ConfigSetting("ShaderCache", &g_Config.bShaderCache, true, false, false), // Doesn't save. Ini-only. + ConfigSetting(false), }; diff --git a/Core/Config.h b/Core/Config.h index 7ded5c9aa0..88431ae644 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -224,6 +224,7 @@ public: bool bFragmentTestCache; int iSplineBezierQuality; // 0 = low , 1 = Intermediate , 2 = High bool bHardwareTessellation; + bool bShaderCache; // Hidden ini-only setting, useful for debugging shader compile times. std::vector vPostShaderNames; // Off for chain end (only Off for no shader) std::map mPostShaderSetting; diff --git a/GPU/GLES/GPU_GLES.cpp b/GPU/GLES/GPU_GLES.cpp index 44f92a7d29..57937cd9a8 100644 --- a/GPU/GLES/GPU_GLES.cpp +++ b/GPU/GLES/GPU_GLES.cpp @@ -103,10 +103,14 @@ GPU_GLES::GPU_GLES(GraphicsContext *gfxCtx, Draw::DrawContext *draw) // Load shader cache. std::string discID = g_paramSFO.GetDiscID(); if (discID.size()) { - File::CreateFullPath(GetSysDirectory(DIRECTORY_APP_CACHE)); - shaderCachePath_ = GetSysDirectory(DIRECTORY_APP_CACHE) / (discID + ".glshadercache"); - // Actually precompiled by IsReady() since we're single-threaded. - shaderManagerGL_->Load(shaderCachePath_); + if (g_Config.bShaderCache) { + File::CreateFullPath(GetSysDirectory(DIRECTORY_APP_CACHE)); + shaderCachePath_ = GetSysDirectory(DIRECTORY_APP_CACHE) / (discID + ".glshadercache"); + // Actually precompiled by IsReady() since we're single-threaded. + shaderManagerGL_->Load(shaderCachePath_); + } else { + INFO_LOG(G3D, "Shader cache disabled. Not loading."); + } } if (g_Config.bHardwareTessellation) { @@ -129,7 +133,11 @@ GPU_GLES::~GPU_GLES() { // everything should already be cleared since DeviceLost has been run. if (shaderCachePath_.Valid() && draw_) { - shaderManagerGL_->Save(shaderCachePath_); + if (g_Config.bShaderCache) { + shaderManagerGL_->Save(shaderCachePath_); + } else { + INFO_LOG(G3D, "Shader cache disabled. Not saving."); + } } framebufferManagerGL_->DestroyAllFBOs(); diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index acff52c000..18f55ffdc1 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -123,6 +123,11 @@ void GPU_Vulkan::CancelReady() { } void GPU_Vulkan::LoadCache(const Path &filename) { + if (!g_Config.bShaderCache) { + INFO_LOG(G3D, "Shader cache disabled. Not loading."); + return; + } + PSP_SetLoading("Loading shader cache..."); // Actually precompiled by IsReady() since we're single-threaded. FILE *f = File::OpenCFile(filename, "rb"); @@ -148,6 +153,11 @@ void GPU_Vulkan::LoadCache(const Path &filename) { } void GPU_Vulkan::SaveCache(const Path &filename) { + if (!g_Config.bShaderCache) { + INFO_LOG(G3D, "Shader cache disabled. Not saving."); + return; + } + if (!draw_) { // Already got the lost message, we're in shutdown. WARN_LOG(G3D, "Not saving shaders - shutting down from in-game.");