diff --git a/GPU/Vulkan/GPU_Vulkan.cpp b/GPU/Vulkan/GPU_Vulkan.cpp index ae3f4d9d13..f8d2a68b31 100644 --- a/GPU/Vulkan/GPU_Vulkan.cpp +++ b/GPU/Vulkan/GPU_Vulkan.cpp @@ -25,6 +25,7 @@ #include "Common/GraphicsContext.h" #include "Common/Serialize/Serializer.h" #include "Common/TimeUtil.h" +#include "Common/Thread/ThreadUtil.h" #include "Core/Config.h" #include "Core/Debugger/Breakpoints.h" @@ -94,11 +95,12 @@ GPU_Vulkan::GPU_Vulkan(GraphicsContext *gfxCtx, Draw::DrawContext *draw) shaderCachePath_ = GetSysDirectory(DIRECTORY_APP_CACHE) / (discID + ".vkshadercache"); shaderCacheLoaded_ = false; - std::thread th([&] { + shaderCacheLoadThread_ = std::thread([&] { + SetCurrentThreadName("VulkanLoadCache"); + AndroidJNIThreadContext ctx; LoadCache(shaderCachePath_); shaderCacheLoaded_ = true; }); - th.detach(); } else { shaderCacheLoaded_ = true; } @@ -180,6 +182,10 @@ void GPU_Vulkan::SaveCache(const Path &filename) { } GPU_Vulkan::~GPU_Vulkan() { + if (shaderCacheLoadThread_.joinable()) { + shaderCacheLoadThread_.join(); + } + if (draw_) { VulkanRenderManager *rm = (VulkanRenderManager *)draw_->GetNativeObject(Draw::NativeObject::RENDER_MANAGER); rm->DrainAndBlockCompileQueue(); diff --git a/GPU/Vulkan/GPU_Vulkan.h b/GPU/Vulkan/GPU_Vulkan.h index d5bae97988..4ba6558d2e 100644 --- a/GPU/Vulkan/GPU_Vulkan.h +++ b/GPU/Vulkan/GPU_Vulkan.h @@ -19,6 +19,7 @@ #include #include +#include #include "Common/File/Path.h" @@ -84,4 +85,6 @@ private: Path shaderCachePath_; std::atomic shaderCacheLoaded_{}; + + std::thread shaderCacheLoadThread_; }; diff --git a/GPU/Vulkan/ShaderManagerVulkan.cpp b/GPU/Vulkan/ShaderManagerVulkan.cpp index 969f96c536..9f58c80da4 100644 --- a/GPU/Vulkan/ShaderManagerVulkan.cpp +++ b/GPU/Vulkan/ShaderManagerVulkan.cpp @@ -239,6 +239,8 @@ void ShaderManagerVulkan::DeviceRestore(Draw::DrawContext *draw) { } void ShaderManagerVulkan::Clear() { + std::lock_guard guard(cacheLock_); + fsCache_.Iterate([&](const FShaderID &key, VulkanFragmentShader *shader) { delete shader; }); @@ -397,6 +399,7 @@ void ShaderManagerVulkan::GetShaders(int prim, VertexDecoder *decoder, VulkanVer } std::vector ShaderManagerVulkan::DebugGetShaderIDs(DebugShaderType type) { + std::lock_guard guard(cacheLock_); std::vector ids; switch (type) { case SHADER_TYPE_VERTEX: