fix some race conditions and memory leaks
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
68f857fa5c
commit
98b6518f2b
|
@ -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 */
|
||||
|
||||
|
|
Loading…
Reference in New Issue