From 7508881670d7fa2dd4217bfae8e81137c969ee76 Mon Sep 17 00:00:00 2001 From: piercashuang <85528253+piercashuang@users.noreply.github.com> Date: Sun, 10 May 2026 18:03:17 +0800 Subject: [PATCH] [opt]thread safe --- cpp/infernux/function/renderer/VkShaderCache.cpp | 11 +++++++++++ cpp/infernux/function/renderer/VkShaderCache.h | 2 ++ cpp/infernux/function/renderer/VkTextureCache.cpp | 1 + cpp/infernux/function/renderer/VkTextureCache.h | 2 +- 4 files changed, 15 insertions(+), 1 deletion(-) diff --git a/cpp/infernux/function/renderer/VkShaderCache.cpp b/cpp/infernux/function/renderer/VkShaderCache.cpp index bb5c11ca..c2505ab1 100644 --- a/cpp/infernux/function/renderer/VkShaderCache.cpp +++ b/cpp/infernux/function/renderer/VkShaderCache.cpp @@ -29,6 +29,7 @@ void VkShaderCache::LoadShader(const char *name, const std::vector &spirvC } std::string typeStr(type); + std::lock_guard lock(m_mutex); if (typeStr == "vert" || typeStr == "vertex") { m_vertModules[name] = module; m_vertCodes[name] = spirvCode; @@ -44,6 +45,7 @@ void VkShaderCache::LoadShader(const char *name, const std::vector &spirvC void VkShaderCache::UnloadShader(const char *name, VkDevice device) { std::string nameStr(name); + std::lock_guard lock(m_mutex); m_renderMetas.erase(nameStr); auto vertIt = m_vertModules.find(nameStr); @@ -63,6 +65,7 @@ void VkShaderCache::UnloadShader(const char *name, VkDevice device) bool VkShaderCache::HasShader(const std::string &name, const std::string &type) const { + std::lock_guard lock(m_mutex); if (type == "vert" || type == "vertex") { return m_vertModules.find(name) != m_vertModules.end(); } @@ -74,6 +77,7 @@ bool VkShaderCache::HasShader(const std::string &name, const std::string &type) VkShaderModule VkShaderCache::GetModule(const std::string &name, const std::string &type) const { + std::lock_guard lock(m_mutex); const auto &map = (type == "vertex") ? m_vertModules : m_fragModules; auto it = map.find(name); if (it != map.end()) @@ -99,11 +103,13 @@ void VkShaderCache::StoreRenderMeta(const std::string &shaderId, const std::stri meta.passTag = passTag; meta.stencil = stencil; meta.alphaClip = alphaClip; + std::lock_guard lock(m_mutex); m_renderMetas[shaderId] = meta; } const ShaderRenderMeta *VkShaderCache::GetRenderMeta(const std::string &shaderId) const { + std::lock_guard lock(m_mutex); auto it = m_renderMetas.find(shaderId); return (it != m_renderMetas.end()) ? &it->second : nullptr; } @@ -143,11 +149,13 @@ const std::vector *VkShaderCache::FindCodeInMap(const std::unordered_map *VkShaderCache::FindVertCode(const std::string &id) const { + std::lock_guard lock(m_mutex); return FindCodeInMap(m_vertCodes, id); } const std::vector *VkShaderCache::FindFragCode(const std::string &id) const { + std::lock_guard lock(m_mutex); return FindCodeInMap(m_fragCodes, id); } @@ -157,6 +165,7 @@ const std::vector *VkShaderCache::FindFragCode(const std::string &id) cons void VkShaderCache::DestroyModules(vk::VkPipelineManager &pm) { + std::lock_guard lock(m_mutex); for (auto &[name, shader] : m_vertModules) pm.DestroyShaderModule(shader); for (auto &[name, shader] : m_fragModules) @@ -165,6 +174,7 @@ void VkShaderCache::DestroyModules(vk::VkPipelineManager &pm) void VkShaderCache::Clear() { + std::lock_guard lock(m_mutex); m_programCache.Clear(); m_vertCodes.clear(); m_fragCodes.clear(); @@ -179,6 +189,7 @@ void VkShaderCache::Clear() void VkShaderCache::DumpAvailableKeys(std::string &outVert, std::string &outFrag) const { + std::lock_guard lock(m_mutex); outVert.clear(); outFrag.clear(); for (const auto &kv : m_vertCodes) diff --git a/cpp/infernux/function/renderer/VkShaderCache.h b/cpp/infernux/function/renderer/VkShaderCache.h index 60818104..cd334af7 100644 --- a/cpp/infernux/function/renderer/VkShaderCache.h +++ b/cpp/infernux/function/renderer/VkShaderCache.h @@ -11,6 +11,7 @@ #include +#include #include #include #include @@ -123,6 +124,7 @@ class VkShaderCache std::unordered_map> m_fragCodes; std::unordered_map m_renderMetas; ShaderProgramCache m_programCache; + mutable std::mutex m_mutex; }; } // namespace infernux diff --git a/cpp/infernux/function/renderer/VkTextureCache.cpp b/cpp/infernux/function/renderer/VkTextureCache.cpp index 6e943d8c..4188544c 100644 --- a/cpp/infernux/function/renderer/VkTextureCache.cpp +++ b/cpp/infernux/function/renderer/VkTextureCache.cpp @@ -82,6 +82,7 @@ size_t VkTextureCache::EvictByPrefix(const std::string &prefix) void VkTextureCache::Clear() { + std::lock_guard lock(m_mutex); m_textures.clear(); } diff --git a/cpp/infernux/function/renderer/VkTextureCache.h b/cpp/infernux/function/renderer/VkTextureCache.h index 4baacb8b..62c6c3e8 100644 --- a/cpp/infernux/function/renderer/VkTextureCache.h +++ b/cpp/infernux/function/renderer/VkTextureCache.h @@ -60,7 +60,7 @@ class VkTextureCache /// Returns the number of entries removed. size_t EvictByPrefix(const std::string &prefix); - /// Clear all entries (not thread-safe — call only when renderer is idle). + /// Clear all entries. void Clear(); /// Acquire the internal mutex for multi-step atomic operations.