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 *allocatorLock; | ||||||
| 	SDL_mutex *submitLock; | 	SDL_mutex *submitLock; | ||||||
| 	SDL_mutex *acquireFenceLock; | 	SDL_mutex *acquireFenceLock; | ||||||
|  | 	SDL_mutex *acquireCommandBufferLock; | ||||||
| 
 | 
 | ||||||
|     #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ |     #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ | ||||||
| 		vkfntype_##func func; | 		vkfntype_##func func; | ||||||
|  | @ -3975,7 +3976,7 @@ static void VULKAN_DestroyDevice( | ||||||
| 	GraphicsPipelineLayoutHashArray graphicsPipelineLayoutHashArray; | 	GraphicsPipelineLayoutHashArray graphicsPipelineLayoutHashArray; | ||||||
| 	ComputePipelineLayoutHashArray computePipelineLayoutHashArray; | 	ComputePipelineLayoutHashArray computePipelineLayoutHashArray; | ||||||
| 	VulkanMemorySubAllocator *allocator; | 	VulkanMemorySubAllocator *allocator; | ||||||
| 	uint32_t i, j, k; | 	int32_t i, j, k; | ||||||
| 
 | 
 | ||||||
| 	VULKAN_Wait(device->driverData); | 	VULKAN_Wait(device->driverData); | ||||||
| 
 | 
 | ||||||
|  | @ -4123,6 +4124,8 @@ static void VULKAN_DestroyDevice( | ||||||
| 		VULKAN_INTERNAL_DestroySwapchain(renderer, renderer->swapchainDatas[i]->windowHandle); | 		VULKAN_INTERNAL_DestroySwapchain(renderer, renderer->swapchainDatas[i]->windowHandle); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	SDL_free(renderer->swapchainDatas); | ||||||
|  | 
 | ||||||
| 	for (i = 0; i < VK_MAX_MEMORY_TYPES; i += 1) | 	for (i = 0; i < VK_MAX_MEMORY_TYPES; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		allocator = &renderer->memoryAllocator->subAllocators[i]; | 		allocator = &renderer->memoryAllocator->subAllocators[i]; | ||||||
|  | @ -4155,6 +4158,7 @@ static void VULKAN_DestroyDevice( | ||||||
| 	SDL_DestroyMutex(renderer->allocatorLock); | 	SDL_DestroyMutex(renderer->allocatorLock); | ||||||
| 	SDL_DestroyMutex(renderer->submitLock); | 	SDL_DestroyMutex(renderer->submitLock); | ||||||
| 	SDL_DestroyMutex(renderer->acquireFenceLock); | 	SDL_DestroyMutex(renderer->acquireFenceLock); | ||||||
|  | 	SDL_DestroyMutex(renderer->acquireCommandBufferLock); | ||||||
| 
 | 
 | ||||||
| 	renderer->vkDestroyDevice(renderer->logicalDevice, NULL); | 	renderer->vkDestroyDevice(renderer->logicalDevice, NULL); | ||||||
| 	renderer->vkDestroyInstance(renderer->instance, NULL); | 	renderer->vkDestroyInstance(renderer->instance, NULL); | ||||||
|  | @ -7604,9 +7608,13 @@ static Refresh_CommandBuffer* VULKAN_AcquireCommandBuffer( | ||||||
| 
 | 
 | ||||||
| 	SDL_threadID threadID = SDL_ThreadID(); | 	SDL_threadID threadID = SDL_ThreadID(); | ||||||
| 
 | 
 | ||||||
|  | 	SDL_LockMutex(renderer->acquireCommandBufferLock); | ||||||
|  | 
 | ||||||
| 	VulkanCommandBuffer *commandBuffer = | 	VulkanCommandBuffer *commandBuffer = | ||||||
| 		VULKAN_INTERNAL_GetInactiveCommandBufferFromPool(renderer, threadID); | 		VULKAN_INTERNAL_GetInactiveCommandBufferFromPool(renderer, threadID); | ||||||
| 
 | 
 | ||||||
|  | 	SDL_UnlockMutex(renderer->acquireCommandBufferLock); | ||||||
|  | 
 | ||||||
| 	/* State tracking */ | 	/* State tracking */ | ||||||
| 
 | 
 | ||||||
| 	commandBuffer->currentComputePipeline = NULL; | 	commandBuffer->currentComputePipeline = NULL; | ||||||
|  | @ -8055,11 +8063,24 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
| 	} | 	} | ||||||
| 	commandBuffer->renderPassesToDestroyCount = 0; | 	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->inactiveCommandBuffers[ | ||||||
| 		commandBuffer->commandPool->inactiveCommandBufferCount | 		commandBuffer->commandPool->inactiveCommandBufferCount | ||||||
| 	] = commandBuffer; | 	] = commandBuffer; | ||||||
| 	commandBuffer->commandPool->inactiveCommandBufferCount += 1; | 	commandBuffer->commandPool->inactiveCommandBufferCount += 1; | ||||||
| 
 | 
 | ||||||
|  | 	SDL_UnlockMutex(renderer->acquireCommandBufferLock); | ||||||
|  | 
 | ||||||
| 	renderer->vkResetFences( | 	renderer->vkResetFences( | ||||||
| 		renderer->logicalDevice, | 		renderer->logicalDevice, | ||||||
| 		1, | 		1, | ||||||
|  | @ -8084,26 +8105,13 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
| 
 | 
 | ||||||
| 	commandBuffer->inFlightFence = VK_NULL_HANDLE; | 	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) | 	for (i = 0; i < renderer->submittedCommandBufferCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		if (renderer->submittedCommandBuffers[i] == commandBuffer) | 		if (renderer->submittedCommandBuffers[i] == commandBuffer) | ||||||
| 		{ | 		{ | ||||||
| 			renderer->submittedCommandBuffers[i] = renderer->submittedCommandBuffers[renderer->submittedCommandBufferCount - 1]; | 			renderer->submittedCommandBuffers[i] = renderer->submittedCommandBuffers[renderer->submittedCommandBufferCount - 1]; | ||||||
| 			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; | 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanCommandBuffer *commandBuffer; | 	VulkanCommandBuffer *commandBuffer; | ||||||
| 	VkResult result; | 	VkResult result; | ||||||
| 	uint32_t i; | 	int32_t i; | ||||||
| 
 | 
 | ||||||
| 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) | 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) | ||||||
| 	{ | 	{ | ||||||
|  | @ -9159,6 +9167,7 @@ static Refresh_Device* VULKAN_CreateDevice( | ||||||
| 	renderer->allocatorLock = SDL_CreateMutex(); | 	renderer->allocatorLock = SDL_CreateMutex(); | ||||||
| 	renderer->submitLock = SDL_CreateMutex(); | 	renderer->submitLock = SDL_CreateMutex(); | ||||||
| 	renderer->acquireFenceLock = SDL_CreateMutex(); | 	renderer->acquireFenceLock = SDL_CreateMutex(); | ||||||
|  | 	renderer->acquireCommandBufferLock = SDL_CreateMutex(); | ||||||
| 
 | 
 | ||||||
| 	/* Create fence lists */ | 	/* Create fence lists */ | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue