Skip to content

Commit

Permalink
Vulkan: Extend the cacheLock usage in GetShaders (was unsafe, though …
Browse files Browse the repository at this point in the history
…mildly)
  • Loading branch information
hrydgard committed Sep 23, 2023
1 parent c4ad324 commit 9a515c8
Showing 1 changed file with 11 additions and 17 deletions.
28 changes: 11 additions & 17 deletions GPU/Vulkan/ShaderManagerVulkan.cpp
Expand Up @@ -333,6 +333,8 @@ void ShaderManagerVulkan::GetShaders(int prim, VertexDecoder *decoder, VulkanVer
return;
}

std::lock_guard<std::mutex> guard(cacheLock_);

VulkanContext *vulkan = (VulkanContext *)draw_->GetNativeObject(Draw::NativeObject::CONTEXT);
VulkanVertexShader *vs = nullptr;
if (!vsCache_.Get(VSID, &vs)) {
Expand All @@ -345,14 +347,12 @@ void ShaderManagerVulkan::GetShaders(int prim, VertexDecoder *decoder, VulkanVer
_assert_msg_(success, "VS gen error: %s", genErrorString.c_str());
_assert_msg_(strlen(codeBuffer_) < CODE_BUFFER_SIZE, "VS length error: %d", (int)strlen(codeBuffer_));

std::lock_guard<std::mutex> guard(cacheLock_);
if (!vsCache_.Get(VSID, &vs)) {
vs = new VulkanVertexShader(vulkan, VSID, flags, codeBuffer_, useHWTransform);
vsCache_.Insert(VSID, vs);
}
// Don't need to re-lookup anymore, now that we lock wider.
vs = new VulkanVertexShader(vulkan, VSID, flags, codeBuffer_, useHWTransform);
vsCache_.Insert(VSID, vs);
}

VulkanFragmentShader *fs;
VulkanFragmentShader *fs = nullptr;
if (!fsCache_.Get(FSID, &fs)) {
// Fragment shader not in cache. Let's compile it.
std::string genErrorString;
Expand All @@ -362,14 +362,11 @@ void ShaderManagerVulkan::GetShaders(int prim, VertexDecoder *decoder, VulkanVer
_assert_msg_(success, "FS gen error: %s", genErrorString.c_str());
_assert_msg_(strlen(codeBuffer_) < CODE_BUFFER_SIZE, "FS length error: %d", (int)strlen(codeBuffer_));

std::lock_guard<std::mutex> guard(cacheLock_);
if (!fsCache_.Get(FSID, &fs)) {
fs = new VulkanFragmentShader(vulkan, FSID, flags, codeBuffer_);
fsCache_.Insert(FSID, fs);
}
fs = new VulkanFragmentShader(vulkan, FSID, flags, codeBuffer_);
fsCache_.Insert(FSID, fs);
}

VulkanGeometryShader *gs;
VulkanGeometryShader *gs = nullptr;
if (GSID.Bit(GS_BIT_ENABLED)) {
if (!gsCache_.Get(GSID, &gs)) {
// Geometry shader not in cache. Let's compile it.
Expand All @@ -378,11 +375,8 @@ void ShaderManagerVulkan::GetShaders(int prim, VertexDecoder *decoder, VulkanVer
_assert_msg_(success, "GS gen error: %s", genErrorString.c_str());
_assert_msg_(strlen(codeBuffer_) < CODE_BUFFER_SIZE, "GS length error: %d", (int)strlen(codeBuffer_));

std::lock_guard<std::mutex> guard(cacheLock_);
if (!gsCache_.Get(GSID, &gs)) {
gs = new VulkanGeometryShader(vulkan, GSID, codeBuffer_);
gsCache_.Insert(GSID, gs);
}
gs = new VulkanGeometryShader(vulkan, GSID, codeBuffer_);
gsCache_.Insert(GSID, gs);
}
} else {
gs = nullptr;
Expand Down

0 comments on commit 9a515c8

Please sign in to comment.