Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions cpp/infernux/function/renderer/VkShaderCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ void VkShaderCache::LoadShader(const char *name, const std::vector<char> &spirvC
}

std::string typeStr(type);
std::lock_guard<std::mutex> lock(m_mutex);
if (typeStr == "vert" || typeStr == "vertex") {
m_vertModules[name] = module;
m_vertCodes[name] = spirvCode;
Expand All @@ -44,6 +45,7 @@ void VkShaderCache::LoadShader(const char *name, const std::vector<char> &spirvC
void VkShaderCache::UnloadShader(const char *name, VkDevice device)
{
std::string nameStr(name);
std::lock_guard<std::mutex> lock(m_mutex);
m_renderMetas.erase(nameStr);

auto vertIt = m_vertModules.find(nameStr);
Expand All @@ -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<std::mutex> lock(m_mutex);
if (type == "vert" || type == "vertex") {
return m_vertModules.find(name) != m_vertModules.end();
}
Expand All @@ -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<std::mutex> lock(m_mutex);
const auto &map = (type == "vertex") ? m_vertModules : m_fragModules;
auto it = map.find(name);
if (it != map.end())
Expand All @@ -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<std::mutex> lock(m_mutex);
m_renderMetas[shaderId] = meta;
}

const ShaderRenderMeta *VkShaderCache::GetRenderMeta(const std::string &shaderId) const
{
std::lock_guard<std::mutex> lock(m_mutex);
auto it = m_renderMetas.find(shaderId);
return (it != m_renderMetas.end()) ? &it->second : nullptr;
}
Expand Down Expand Up @@ -143,11 +149,13 @@ const std::vector<char> *VkShaderCache::FindCodeInMap(const std::unordered_map<s

const std::vector<char> *VkShaderCache::FindVertCode(const std::string &id) const
{
std::lock_guard<std::mutex> lock(m_mutex);
return FindCodeInMap(m_vertCodes, id);
}

const std::vector<char> *VkShaderCache::FindFragCode(const std::string &id) const
{
std::lock_guard<std::mutex> lock(m_mutex);
return FindCodeInMap(m_fragCodes, id);
}

Expand All @@ -157,6 +165,7 @@ const std::vector<char> *VkShaderCache::FindFragCode(const std::string &id) cons

void VkShaderCache::DestroyModules(vk::VkPipelineManager &pm)
{
std::lock_guard<std::mutex> lock(m_mutex);
for (auto &[name, shader] : m_vertModules)
pm.DestroyShaderModule(shader);
for (auto &[name, shader] : m_fragModules)
Expand All @@ -165,6 +174,7 @@ void VkShaderCache::DestroyModules(vk::VkPipelineManager &pm)

void VkShaderCache::Clear()
{
std::lock_guard<std::mutex> lock(m_mutex);
m_programCache.Clear();
m_vertCodes.clear();
m_fragCodes.clear();
Expand All @@ -179,6 +189,7 @@ void VkShaderCache::Clear()

void VkShaderCache::DumpAvailableKeys(std::string &outVert, std::string &outFrag) const
{
std::lock_guard<std::mutex> lock(m_mutex);
outVert.clear();
outFrag.clear();
for (const auto &kv : m_vertCodes)
Expand Down
2 changes: 2 additions & 0 deletions cpp/infernux/function/renderer/VkShaderCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

#include <function/renderer/shader/ShaderProgram.h>

#include <mutex>
#include <string>
#include <unordered_map>
#include <vector>
Expand Down Expand Up @@ -123,6 +124,7 @@ class VkShaderCache
std::unordered_map<std::string, std::vector<char>> m_fragCodes;
std::unordered_map<std::string, ShaderRenderMeta> m_renderMetas;
ShaderProgramCache m_programCache;
mutable std::mutex m_mutex;
};

} // namespace infernux
1 change: 1 addition & 0 deletions cpp/infernux/function/renderer/VkTextureCache.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ size_t VkTextureCache::EvictByPrefix(const std::string &prefix)

void VkTextureCache::Clear()
{
std::lock_guard<std::mutex> lock(m_mutex);
m_textures.clear();
}

Expand Down
2 changes: 1 addition & 1 deletion cpp/infernux/function/renderer/VkTextureCache.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down