GPU: Ensure thread safety of Vulkan resource creation

This commit is contained in:
cosmonaut
2025-01-15 13:45:36 -08:00
parent c9d602307c
commit 355f69ebfe

View File

@@ -1198,7 +1198,6 @@ struct VulkanRenderer
SDL_Mutex *submitLock; SDL_Mutex *submitLock;
SDL_Mutex *acquireCommandBufferLock; SDL_Mutex *acquireCommandBufferLock;
SDL_Mutex *acquireUniformBufferLock; SDL_Mutex *acquireUniformBufferLock;
SDL_Mutex *renderPassFetchLock;
SDL_Mutex *framebufferFetchLock; SDL_Mutex *framebufferFetchLock;
SDL_Mutex *windowLock; SDL_Mutex *windowLock;
@@ -4924,7 +4923,6 @@ static void VULKAN_DestroyDevice(
SDL_DestroyMutex(renderer->submitLock); SDL_DestroyMutex(renderer->submitLock);
SDL_DestroyMutex(renderer->acquireCommandBufferLock); SDL_DestroyMutex(renderer->acquireCommandBufferLock);
SDL_DestroyMutex(renderer->acquireUniformBufferLock); SDL_DestroyMutex(renderer->acquireUniformBufferLock);
SDL_DestroyMutex(renderer->renderPassFetchLock);
SDL_DestroyMutex(renderer->framebufferFetchLock); SDL_DestroyMutex(renderer->framebufferFetchLock);
SDL_DestroyMutex(renderer->windowLock); SDL_DestroyMutex(renderer->windowLock);
@@ -7092,15 +7090,11 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass(
key.depthStencilTargetDescription.stencilStoreOp = depthStencilTargetInfo->stencil_store_op; key.depthStencilTargetDescription.stencilStoreOp = depthStencilTargetInfo->stencil_store_op;
} }
SDL_LockMutex(renderer->renderPassFetchLock);
bool result = SDL_FindInHashTable( bool result = SDL_FindInHashTable(
renderer->renderPassHashTable, renderer->renderPassHashTable,
(const void *)&key, (const void *)&key,
(const void **)&renderPassWrapper); (const void **)&renderPassWrapper);
SDL_UnlockMutex(renderer->renderPassFetchLock);
if (result) { if (result) {
return renderPassWrapper->handle; return renderPassWrapper->handle;
} }
@@ -7123,14 +7117,11 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass(
renderPassWrapper = SDL_malloc(sizeof(VulkanRenderPassHashTableValue)); renderPassWrapper = SDL_malloc(sizeof(VulkanRenderPassHashTableValue));
renderPassWrapper->handle = renderPassHandle; renderPassWrapper->handle = renderPassHandle;
SDL_LockMutex(renderer->renderPassFetchLock);
SDL_InsertIntoHashTable( SDL_InsertIntoHashTable(
renderer->renderPassHashTable, renderer->renderPassHashTable,
(const void *)allocedKey, (const void *)allocedKey,
(const void *)renderPassWrapper); (const void *)renderPassWrapper);
SDL_UnlockMutex(renderer->renderPassFetchLock);
return renderPassHandle; return renderPassHandle;
} }
@@ -11653,7 +11644,6 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
renderer->submitLock = SDL_CreateMutex(); renderer->submitLock = SDL_CreateMutex();
renderer->acquireCommandBufferLock = SDL_CreateMutex(); renderer->acquireCommandBufferLock = SDL_CreateMutex();
renderer->acquireUniformBufferLock = SDL_CreateMutex(); renderer->acquireUniformBufferLock = SDL_CreateMutex();
renderer->renderPassFetchLock = SDL_CreateMutex();
renderer->framebufferFetchLock = SDL_CreateMutex(); renderer->framebufferFetchLock = SDL_CreateMutex();
renderer->windowLock = SDL_CreateMutex(); renderer->windowLock = SDL_CreateMutex();
@@ -11705,6 +11695,7 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
// Initialize caches // Initialize caches
// manually synchronized due to submission timing
renderer->commandPoolHashTable = SDL_CreateHashTable( renderer->commandPoolHashTable = SDL_CreateHashTable(
(void *)renderer, (void *)renderer,
64, 64,
@@ -11713,14 +11704,16 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
VULKAN_INTERNAL_CommandPoolHashNuke, VULKAN_INTERNAL_CommandPoolHashNuke,
false, false); false, false);
// thread-safe
renderer->renderPassHashTable = SDL_CreateHashTable( renderer->renderPassHashTable = SDL_CreateHashTable(
(void *)renderer, (void *)renderer,
64, 64,
VULKAN_INTERNAL_RenderPassHashFunction, VULKAN_INTERNAL_RenderPassHashFunction,
VULKAN_INTERNAL_RenderPassHashKeyMatch, VULKAN_INTERNAL_RenderPassHashKeyMatch,
VULKAN_INTERNAL_RenderPassHashNuke, VULKAN_INTERNAL_RenderPassHashNuke,
false, false); true, false);
// manually synchronized due to iteration
renderer->framebufferHashTable = SDL_CreateHashTable( renderer->framebufferHashTable = SDL_CreateHashTable(
(void *)renderer, (void *)renderer,
64, 64,
@@ -11729,29 +11722,32 @@ static SDL_GPUDevice *VULKAN_CreateDevice(bool debugMode, bool preferLowPower, S
VULKAN_INTERNAL_FramebufferHashNuke, VULKAN_INTERNAL_FramebufferHashNuke,
false, false); false, false);
// thread-safe
renderer->graphicsPipelineResourceLayoutHashTable = SDL_CreateHashTable( renderer->graphicsPipelineResourceLayoutHashTable = SDL_CreateHashTable(
(void *)renderer, (void *)renderer,
64, 64,
VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashFunction, VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashFunction,
VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashKeyMatch, VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashKeyMatch,
VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashNuke, VULKAN_INTERNAL_GraphicsPipelineResourceLayoutHashNuke,
false, false); true, false);
// thread-safe
renderer->computePipelineResourceLayoutHashTable = SDL_CreateHashTable( renderer->computePipelineResourceLayoutHashTable = SDL_CreateHashTable(
(void *)renderer, (void *)renderer,
64, 64,
VULKAN_INTERNAL_ComputePipelineResourceLayoutHashFunction, VULKAN_INTERNAL_ComputePipelineResourceLayoutHashFunction,
VULKAN_INTERNAL_ComputePipelineResourceLayoutHashKeyMatch, VULKAN_INTERNAL_ComputePipelineResourceLayoutHashKeyMatch,
VULKAN_INTERNAL_ComputePipelineResourceLayoutHashNuke, VULKAN_INTERNAL_ComputePipelineResourceLayoutHashNuke,
false, false); true, false);
// thread-safe
renderer->descriptorSetLayoutHashTable = SDL_CreateHashTable( renderer->descriptorSetLayoutHashTable = SDL_CreateHashTable(
(void *)renderer, (void *)renderer,
64, 64,
VULKAN_INTERNAL_DescriptorSetLayoutHashFunction, VULKAN_INTERNAL_DescriptorSetLayoutHashFunction,
VULKAN_INTERNAL_DescriptorSetLayoutHashKeyMatch, VULKAN_INTERNAL_DescriptorSetLayoutHashKeyMatch,
VULKAN_INTERNAL_DescriptorSetLayoutHashNuke, VULKAN_INTERNAL_DescriptorSetLayoutHashNuke,
false, false); true, false);
// Initialize fence pool // Initialize fence pool