deadlock fix + defrag timing tweak
							parent
							
								
									313b4b81cc
								
							
						
					
					
						commit
						e482783c42
					
				|  | @ -78,6 +78,7 @@ static uint32_t deviceExtensionCount = SDL_arraysize(deviceExtensionNames); | ||||||
| #define POOLED_TRANSFER_BUFFER_SIZE 16000000    /* 16MB */ | #define POOLED_TRANSFER_BUFFER_SIZE 16000000    /* 16MB */ | ||||||
| #define UBO_BUFFER_SIZE 16000 			        /* 16KB */ | #define UBO_BUFFER_SIZE 16000 			        /* 16KB */ | ||||||
| #define DESCRIPTOR_POOL_STARTING_SIZE 128 | #define DESCRIPTOR_POOL_STARTING_SIZE 128 | ||||||
|  | #define DEFRAG_TIME 200 | ||||||
| #define WINDOW_DATA "Refresh_VulkanWindowData" | #define WINDOW_DATA "Refresh_VulkanWindowData" | ||||||
| 
 | 
 | ||||||
| #define IDENTITY_SWIZZLE 		\ | #define IDENTITY_SWIZZLE 		\ | ||||||
|  | @ -1810,7 +1811,8 @@ typedef struct VulkanRenderer | ||||||
| 	SDL_mutex *renderTargetFetchLock; | 	SDL_mutex *renderTargetFetchLock; | ||||||
| 
 | 
 | ||||||
| 	uint8_t needDefrag; | 	uint8_t needDefrag; | ||||||
| 	uint32_t defragTimer; | 	uint64_t defragTimestamp; | ||||||
|  | 	uint8_t defragInProgress; | ||||||
| 
 | 
 | ||||||
| #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ | #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ | ||||||
| 		vkfntype_##func func; | 		vkfntype_##func func; | ||||||
|  | @ -2356,6 +2358,7 @@ static void VULKAN_INTERNAL_RemoveMemoryUsedRegion( | ||||||
| 	if (!usedRegion->allocation->dedicated) | 	if (!usedRegion->allocation->dedicated) | ||||||
| 	{ | 	{ | ||||||
| 		renderer->needDefrag = 1; | 		renderer->needDefrag = 1; | ||||||
|  | 		renderer->defragTimestamp = SDL_GetTicks64() + DEFRAG_TIME; /* reset timer so we batch defrags */ | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	SDL_free(usedRegion); | 	SDL_free(usedRegion); | ||||||
|  | @ -3445,8 +3448,6 @@ static void VULKAN_INTERNAL_RemoveFramebuffersContainingView( | ||||||
| 	FramebufferHash *hash; | 	FramebufferHash *hash; | ||||||
| 	int32_t i, j; | 	int32_t i, j; | ||||||
| 
 | 
 | ||||||
| 	SDL_LockMutex(renderer->framebufferFetchLock); |  | ||||||
| 
 |  | ||||||
| 	for (i = renderer->framebufferHashArray.count - 1; i >= 0; i -= 1) | 	for (i = renderer->framebufferHashArray.count - 1; i >= 0; i -= 1) | ||||||
| 	{ | 	{ | ||||||
| 		hash = &renderer->framebufferHashArray.elements[i].key; | 		hash = &renderer->framebufferHashArray.elements[i].key; | ||||||
|  | @ -3469,8 +3470,6 @@ static void VULKAN_INTERNAL_RemoveFramebuffersContainingView( | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 |  | ||||||
| 	SDL_UnlockMutex(renderer->framebufferFetchLock); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture( | static void VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture( | ||||||
|  | @ -3478,8 +3477,15 @@ static void VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture( | ||||||
| 	VulkanTexture *texture | 	VulkanTexture *texture | ||||||
| ) { | ) { | ||||||
| 	RenderTargetHash *hash; | 	RenderTargetHash *hash; | ||||||
|  | 	VkImageView *viewsToCheck; | ||||||
|  | 	int32_t viewsToCheckCount; | ||||||
|  | 	int32_t viewsToCheckCapacity; | ||||||
| 	int32_t i; | 	int32_t i; | ||||||
| 
 | 
 | ||||||
|  | 	viewsToCheckCapacity = 16; | ||||||
|  | 	viewsToCheckCount = 0; | ||||||
|  | 	viewsToCheck = SDL_malloc(sizeof(VkImageView) * viewsToCheckCapacity); | ||||||
|  | 
 | ||||||
| 	SDL_LockMutex(renderer->renderTargetFetchLock); | 	SDL_LockMutex(renderer->renderTargetFetchLock); | ||||||
| 
 | 
 | ||||||
| 	for (i = renderer->renderTargetHashArray.count - 1; i >= 0; i -= 1) | 	for (i = renderer->renderTargetHashArray.count - 1; i >= 0; i -= 1) | ||||||
|  | @ -3488,11 +3494,17 @@ static void VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture( | ||||||
| 
 | 
 | ||||||
| 		if (hash->texture == texture) | 		if (hash->texture == texture) | ||||||
| 		{ | 		{ | ||||||
| 			VULKAN_INTERNAL_RemoveFramebuffersContainingView( | 			EXPAND_ARRAY_IF_NEEDED( | ||||||
| 				renderer, | 				viewsToCheck, | ||||||
| 				renderer->renderTargetHashArray.elements[i].value->view | 				VkImageView, | ||||||
|  | 				viewsToCheckCount + 1, | ||||||
|  | 				viewsToCheckCapacity, | ||||||
|  | 				viewsToCheckCapacity * 2 | ||||||
| 			); | 			); | ||||||
| 
 | 
 | ||||||
|  | 			viewsToCheck[viewsToCheckCount] = renderer->renderTargetHashArray.elements[i].value->view; | ||||||
|  | 			viewsToCheckCount += 1; | ||||||
|  | 
 | ||||||
| 			VULKAN_INTERNAL_DestroyRenderTarget( | 			VULKAN_INTERNAL_DestroyRenderTarget( | ||||||
| 				renderer, | 				renderer, | ||||||
| 				renderer->renderTargetHashArray.elements[i].value | 				renderer->renderTargetHashArray.elements[i].value | ||||||
|  | @ -3502,10 +3514,26 @@ static void VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture( | ||||||
| 				&renderer->renderTargetHashArray, | 				&renderer->renderTargetHashArray, | ||||||
| 				i | 				i | ||||||
| 			); | 			); | ||||||
|  | 
 | ||||||
|  | 			Refresh_LogInfo("destroying render target!"); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	SDL_UnlockMutex(renderer->renderTargetFetchLock); | 	SDL_UnlockMutex(renderer->renderTargetFetchLock); | ||||||
|  | 
 | ||||||
|  | 	SDL_LockMutex(renderer->framebufferFetchLock); | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < viewsToCheckCount; i += 1) | ||||||
|  | 	{ | ||||||
|  | 		VULKAN_INTERNAL_RemoveFramebuffersContainingView( | ||||||
|  | 			renderer, | ||||||
|  | 			viewsToCheck[i] | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	SDL_UnlockMutex(renderer->framebufferFetchLock); | ||||||
|  | 
 | ||||||
|  | 	SDL_free(viewsToCheck); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_INTERNAL_DestroyTexture( | static void VULKAN_INTERNAL_DestroyTexture( | ||||||
|  | @ -3550,11 +3578,6 @@ static void VULKAN_INTERNAL_DestroyRenderTarget( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VulkanRenderTarget *renderTarget | 	VulkanRenderTarget *renderTarget | ||||||
| ) { | ) { | ||||||
| 	VULKAN_INTERNAL_RemoveFramebuffersContainingView( |  | ||||||
| 		renderer, |  | ||||||
| 		renderTarget->view |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	renderer->vkDestroyImageView( | 	renderer->vkDestroyImageView( | ||||||
| 		renderer->logicalDevice, | 		renderer->logicalDevice, | ||||||
| 		renderTarget->view, | 		renderTarget->view, | ||||||
|  | @ -10430,11 +10453,9 @@ static void VULKAN_Submit( | ||||||
| 	VULKAN_INTERNAL_PerformPendingDestroys(renderer); | 	VULKAN_INTERNAL_PerformPendingDestroys(renderer); | ||||||
| 
 | 
 | ||||||
| 	/* Defrag! */ | 	/* Defrag! */ | ||||||
| 	if (renderer->needDefrag) | 	if (renderer->needDefrag && !renderer->defragInProgress) | ||||||
| 	{ | 	{ | ||||||
| 		renderer->defragTimer += 1; | 		if (SDL_GetTicks64() >= renderer->defragTimestamp) | ||||||
| 
 |  | ||||||
| 		if (renderer->defragTimer == 1) |  | ||||||
| 		{ | 		{ | ||||||
| 			VULKAN_INTERNAL_DefragmentMemory(renderer); | 			VULKAN_INTERNAL_DefragmentMemory(renderer); | ||||||
| 		} | 		} | ||||||
|  | @ -10464,6 +10485,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 	SDL_LockMutex(renderer->allocatorLock); | 	SDL_LockMutex(renderer->allocatorLock); | ||||||
| 
 | 
 | ||||||
| 	renderer->needDefrag = 0; | 	renderer->needDefrag = 0; | ||||||
|  | 	renderer->defragInProgress = 1; | ||||||
| 
 | 
 | ||||||
| 	beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; | 	beginInfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO; | ||||||
| 	beginInfo.pNext = NULL; | 	beginInfo.pNext = NULL; | ||||||
|  | @ -10679,13 +10701,15 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 
 | 
 | ||||||
| 	SDL_UnlockMutex(renderer->allocatorLock); | 	SDL_UnlockMutex(renderer->allocatorLock); | ||||||
| 
 | 
 | ||||||
|  | 	renderer->defragTimestamp = SDL_GetTicks64() + DEFRAG_TIME; | ||||||
|  | 
 | ||||||
| 	VULKAN_Submit( | 	VULKAN_Submit( | ||||||
| 		(Refresh_Renderer*) renderer, | 		(Refresh_Renderer*) renderer, | ||||||
| 		1, | 		1, | ||||||
| 		(Refresh_CommandBuffer**) &commandBuffer | 		(Refresh_CommandBuffer**) &commandBuffer | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	renderer->defragTimer = 0; | 	renderer->defragInProgress = 0; | ||||||
| 
 | 
 | ||||||
| 	return 1; | 	return 1; | ||||||
| } | } | ||||||
|  | @ -11988,7 +12012,8 @@ static Refresh_Device* VULKAN_CreateDevice( | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	renderer->needDefrag = 0; | 	renderer->needDefrag = 0; | ||||||
| 	renderer->defragTimer = 0; | 	renderer->defragTimestamp = 0; | ||||||
|  | 	renderer->defragInProgress = 0; | ||||||
| 
 | 
 | ||||||
| 	return result; | 	return result; | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue