diff --git a/src/Refresh_Driver_Vulkan.c b/src/Refresh_Driver_Vulkan.c index a515d53..6e97606 100644 --- a/src/Refresh_Driver_Vulkan.c +++ b/src/Refresh_Driver_Vulkan.c @@ -1342,6 +1342,7 @@ typedef struct VulkanRenderer SDL_mutex *allocatorLock; SDL_mutex *submitLock; SDL_mutex *acquireFenceLock; + SDL_mutex *acquireCommandBufferLock; #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ vkfntype_##func func; @@ -3975,7 +3976,7 @@ static void VULKAN_DestroyDevice( GraphicsPipelineLayoutHashArray graphicsPipelineLayoutHashArray; ComputePipelineLayoutHashArray computePipelineLayoutHashArray; VulkanMemorySubAllocator *allocator; - uint32_t i, j, k; + int32_t i, j, k; VULKAN_Wait(device->driverData); @@ -4123,6 +4124,8 @@ static void VULKAN_DestroyDevice( VULKAN_INTERNAL_DestroySwapchain(renderer, renderer->swapchainDatas[i]->windowHandle); } + SDL_free(renderer->swapchainDatas); + for (i = 0; i < VK_MAX_MEMORY_TYPES; i += 1) { allocator = &renderer->memoryAllocator->subAllocators[i]; @@ -4155,6 +4158,7 @@ static void VULKAN_DestroyDevice( SDL_DestroyMutex(renderer->allocatorLock); SDL_DestroyMutex(renderer->submitLock); SDL_DestroyMutex(renderer->acquireFenceLock); + SDL_DestroyMutex(renderer->acquireCommandBufferLock); renderer->vkDestroyDevice(renderer->logicalDevice, NULL); renderer->vkDestroyInstance(renderer->instance, NULL); @@ -7604,9 +7608,13 @@ static Refresh_CommandBuffer* VULKAN_AcquireCommandBuffer( SDL_threadID threadID = SDL_ThreadID(); + SDL_LockMutex(renderer->acquireCommandBufferLock); + VulkanCommandBuffer *commandBuffer = VULKAN_INTERNAL_GetInactiveCommandBufferFromPool(renderer, threadID); + SDL_UnlockMutex(renderer->acquireCommandBufferLock); + /* State tracking */ commandBuffer->currentComputePipeline = NULL; @@ -8055,11 +8063,24 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( } commandBuffer->renderPassesToDestroyCount = 0; + SDL_LockMutex(renderer->acquireCommandBufferLock); + + if (commandBuffer->commandPool->inactiveCommandBufferCount == commandBuffer->commandPool->inactiveCommandBufferCapacity) + { + commandBuffer->commandPool->inactiveCommandBufferCapacity += 1; + commandBuffer->commandPool->inactiveCommandBuffers = SDL_realloc( + commandBuffer->commandPool->inactiveCommandBuffers, + commandBuffer->commandPool->inactiveCommandBufferCapacity * sizeof(VulkanCommandBuffer*) + ); + } + commandBuffer->commandPool->inactiveCommandBuffers[ commandBuffer->commandPool->inactiveCommandBufferCount ] = commandBuffer; commandBuffer->commandPool->inactiveCommandBufferCount += 1; + SDL_UnlockMutex(renderer->acquireCommandBufferLock); + renderer->vkResetFences( renderer->logicalDevice, 1, @@ -8084,26 +8105,13 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( commandBuffer->inFlightFence = VK_NULL_HANDLE; - /* Return this command buffer to its pool */ + /* Remove this command buffer from the submitted list */ for (i = 0; i < renderer->submittedCommandBufferCount; i += 1) { if (renderer->submittedCommandBuffers[i] == commandBuffer) { renderer->submittedCommandBuffers[i] = renderer->submittedCommandBuffers[renderer->submittedCommandBufferCount - 1]; renderer->submittedCommandBufferCount -= 1; - - if (commandBuffer->commandPool->inactiveCommandBufferCount == commandBuffer->commandPool->inactiveCommandBufferCapacity) - { - commandBuffer->commandPool->inactiveCommandBufferCapacity += 1; - - commandBuffer->commandPool->inactiveCommandBuffers = SDL_realloc( - commandBuffer->commandPool->inactiveCommandBuffers, - commandBuffer->commandPool->inactiveCommandBufferCapacity * sizeof(VulkanCommandBuffer*) - ); - } - - commandBuffer->commandPool->inactiveCommandBuffers[commandBuffer->commandPool->inactiveCommandBufferCount] = commandBuffer; - commandBuffer->commandPool->inactiveCommandBufferCount += 1; } } } @@ -8114,7 +8122,7 @@ static void VULKAN_Wait( VulkanRenderer *renderer = (VulkanRenderer*) driverData; VulkanCommandBuffer *commandBuffer; VkResult result; - uint32_t i; + int32_t i; for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) { @@ -9159,6 +9167,7 @@ static Refresh_Device* VULKAN_CreateDevice( renderer->allocatorLock = SDL_CreateMutex(); renderer->submitLock = SDL_CreateMutex(); renderer->acquireFenceLock = SDL_CreateMutex(); + renderer->acquireCommandBufferLock = SDL_CreateMutex(); /* Create fence lists */