fence autorelease during command buffer clean
							parent
							
								
									4b50e9cec7
								
							
						
					
					
						commit
						7f11d20941
					
				|  | @ -9934,6 +9934,77 @@ static void VULKAN_SetSwapchainPresentMode( | ||||||
| 
 | 
 | ||||||
| /* Submission structure */ | /* Submission structure */ | ||||||
| 
 | 
 | ||||||
|  | static VkFence VULKAN_INTERNAL_AcquireFenceFromPool( | ||||||
|  | 	VulkanRenderer *renderer | ||||||
|  | ) { | ||||||
|  | 	VkFenceCreateInfo fenceCreateInfo; | ||||||
|  | 	VkFence fence; | ||||||
|  | 	VkResult vulkanResult; | ||||||
|  | 
 | ||||||
|  | 	if (renderer->fencePool.availableFenceCount == 0) | ||||||
|  | 	{ | ||||||
|  | 		/* Create fence */ | ||||||
|  | 		fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; | ||||||
|  | 		fenceCreateInfo.pNext = NULL; | ||||||
|  | 		fenceCreateInfo.flags = 0; | ||||||
|  | 
 | ||||||
|  | 		vulkanResult = renderer->vkCreateFence( | ||||||
|  | 			renderer->logicalDevice, | ||||||
|  | 			&fenceCreateInfo, | ||||||
|  | 			NULL, | ||||||
|  | 			&fence | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		if (vulkanResult != VK_SUCCESS) | ||||||
|  | 		{ | ||||||
|  | 			LogVulkanResultAsError("vkCreateFence", vulkanResult); | ||||||
|  | 			return NULL; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return fence; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	SDL_LockMutex(renderer->fencePool.lock); | ||||||
|  | 
 | ||||||
|  | 	fence = renderer->fencePool.availableFences[renderer->fencePool.availableFenceCount - 1]; | ||||||
|  | 	renderer->fencePool.availableFenceCount -= 1; | ||||||
|  | 
 | ||||||
|  | 	vulkanResult = renderer->vkResetFences( | ||||||
|  | 		renderer->logicalDevice, | ||||||
|  | 		1, | ||||||
|  | 		&fence | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	if (vulkanResult != VK_SUCCESS) | ||||||
|  | 	{ | ||||||
|  | 		LogVulkanResultAsError("vkResetFences", vulkanResult); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	SDL_UnlockMutex(renderer->fencePool.lock); | ||||||
|  | 
 | ||||||
|  | 	return fence; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void VULKAN_INTERNAL_ReturnFenceToPool( | ||||||
|  | 	VulkanRenderer *renderer, | ||||||
|  | 	VkFence fence | ||||||
|  | ) { | ||||||
|  | 	SDL_LockMutex(renderer->fencePool.lock); | ||||||
|  | 
 | ||||||
|  | 	EXPAND_ARRAY_IF_NEEDED( | ||||||
|  | 		renderer->fencePool.availableFences, | ||||||
|  | 		VkFence, | ||||||
|  | 		renderer->fencePool.availableFenceCount + 1, | ||||||
|  | 		renderer->fencePool.availableFenceCapacity, | ||||||
|  | 		renderer->fencePool.availableFenceCapacity * 2 | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	renderer->fencePool.availableFences[renderer->fencePool.availableFenceCount] = fence; | ||||||
|  | 	renderer->fencePool.availableFenceCount += 1; | ||||||
|  | 
 | ||||||
|  | 	SDL_UnlockMutex(renderer->fencePool.lock); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void VULKAN_INTERNAL_PerformPendingDestroys( | static void VULKAN_INTERNAL_PerformPendingDestroys( | ||||||
| 	VulkanRenderer *renderer | 	VulkanRenderer *renderer | ||||||
| ) { | ) { | ||||||
|  | @ -10049,6 +10120,16 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
| 	VulkanUniformBuffer *uniformBuffer; | 	VulkanUniformBuffer *uniformBuffer; | ||||||
| 	DescriptorSetData *descriptorSetData; | 	DescriptorSetData *descriptorSetData; | ||||||
| 
 | 
 | ||||||
|  | 	if (commandBuffer->autoReleaseFence) | ||||||
|  | 	{ | ||||||
|  | 		VULKAN_INTERNAL_ReturnFenceToPool( | ||||||
|  | 			renderer, | ||||||
|  | 			commandBuffer->inFlightFence | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		commandBuffer->inFlightFence = VK_NULL_HANDLE; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/* Bound uniform buffers are now available */ | 	/* Bound uniform buffers are now available */ | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < commandBuffer->boundUniformBufferCount; i += 1) | 	for (i = 0; i < commandBuffer->boundUniformBufferCount; i += 1) | ||||||
|  | @ -10204,27 +10285,15 @@ static void VULKAN_Wait( | ||||||
| 	VkResult result; | 	VkResult result; | ||||||
| 	int32_t i; | 	int32_t i; | ||||||
| 
 | 
 | ||||||
| 	SDL_LockMutex(renderer->submitLock); | 	result = renderer->vkDeviceWaitIdle(renderer->logicalDevice); | ||||||
| 
 | 
 | ||||||
| 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) | 	if (result != VK_SUCCESS) | ||||||
| 	{ | 	{ | ||||||
| 		commandBuffer = renderer->submittedCommandBuffers[i]; | 		LogVulkanResultAsError("vkDeviceWaitIdle", result); | ||||||
| 
 | 		return; | ||||||
| 		result = renderer->vkWaitForFences( |  | ||||||
| 			renderer->logicalDevice, |  | ||||||
| 			1, |  | ||||||
| 			&commandBuffer->inFlightFence, |  | ||||||
| 			VK_TRUE, |  | ||||||
| 			UINT64_MAX |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		if (result != VK_SUCCESS) |  | ||||||
| 		{ |  | ||||||
| 			LogVulkanResultAsError("vkWaitForFences", result); |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* TODO: consider if it's not a good idea to do cleanup here */ | 	SDL_LockMutex(renderer->submitLock); | ||||||
| 
 | 
 | ||||||
| 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) | 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) | ||||||
| 	{ | 	{ | ||||||
|  | @ -10237,69 +10306,6 @@ static void VULKAN_Wait( | ||||||
| 	SDL_UnlockMutex(renderer->submitLock); | 	SDL_UnlockMutex(renderer->submitLock); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static VkFence VULKAN_INTERNAL_AcquireFenceFromPool( |  | ||||||
| 	VulkanRenderer *renderer |  | ||||||
| ) { |  | ||||||
| 	VkFenceCreateInfo fenceCreateInfo; |  | ||||||
| 	VkFence fence; |  | ||||||
| 	VkResult vulkanResult; |  | ||||||
| 
 |  | ||||||
| 	if (renderer->fencePool.availableFenceCount == 0) |  | ||||||
| 	{ |  | ||||||
| 		/* Create fence */ |  | ||||||
| 		fenceCreateInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO; |  | ||||||
| 		fenceCreateInfo.pNext = NULL; |  | ||||||
| 		fenceCreateInfo.flags = 0; |  | ||||||
| 
 |  | ||||||
| 		vulkanResult = renderer->vkCreateFence( |  | ||||||
| 			renderer->logicalDevice, |  | ||||||
| 			&fenceCreateInfo, |  | ||||||
| 			NULL, |  | ||||||
| 			&fence |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		if (vulkanResult != VK_SUCCESS) |  | ||||||
| 		{ |  | ||||||
| 			LogVulkanResultAsError("vkCreateFence", vulkanResult); |  | ||||||
| 			return NULL; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		return fence; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	fence = renderer->fencePool.availableFences[renderer->fencePool.availableFenceCount - 1]; |  | ||||||
| 	renderer->fencePool.availableFenceCount -= 1; |  | ||||||
| 
 |  | ||||||
| 	vulkanResult = renderer->vkResetFences( |  | ||||||
| 		renderer->logicalDevice, |  | ||||||
| 		1, |  | ||||||
| 		&fence |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	if (vulkanResult != VK_SUCCESS) |  | ||||||
| 	{ |  | ||||||
| 		LogVulkanResultAsError("vkResetFences", vulkanResult); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	return fence; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void VULKAN_INTERNAL_ReturnFenceToPool( |  | ||||||
| 	VulkanRenderer *renderer, |  | ||||||
| 	VkFence fence |  | ||||||
| ) { |  | ||||||
| 	EXPAND_ARRAY_IF_NEEDED( |  | ||||||
| 		renderer->fencePool.availableFences, |  | ||||||
| 		VkFence, |  | ||||||
| 		renderer->fencePool.availableFenceCount + 1, |  | ||||||
| 		renderer->fencePool.availableFenceCapacity, |  | ||||||
| 		renderer->fencePool.availableFenceCapacity * 2 |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	renderer->fencePool.availableFences[renderer->fencePool.availableFenceCount] = fence; |  | ||||||
| 	renderer->fencePool.availableFenceCount += 1; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static Refresh_Fence* VULKAN_SubmitAndAcquireFence( | static Refresh_Fence* VULKAN_SubmitAndAcquireFence( | ||||||
| 	Refresh_Renderer *driverData, | 	Refresh_Renderer *driverData, | ||||||
| 	Refresh_CommandBuffer *commandBuffer | 	Refresh_CommandBuffer *commandBuffer | ||||||
|  | @ -10442,16 +10448,6 @@ static void VULKAN_Submit( | ||||||
| 
 | 
 | ||||||
| 		if (vulkanResult == VK_SUCCESS) | 		if (vulkanResult == VK_SUCCESS) | ||||||
| 		{ | 		{ | ||||||
| 			if (renderer->submittedCommandBuffers[i]->autoReleaseFence) |  | ||||||
| 			{ |  | ||||||
| 				VULKAN_INTERNAL_ReturnFenceToPool( |  | ||||||
| 					renderer, |  | ||||||
| 					renderer->submittedCommandBuffers[i]->inFlightFence |  | ||||||
| 				); |  | ||||||
| 
 |  | ||||||
| 				renderer->submittedCommandBuffers[i]->inFlightFence = VK_NULL_HANDLE; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			VULKAN_INTERNAL_CleanCommandBuffer( | 			VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
| 				renderer, | 				renderer, | ||||||
| 				renderer->submittedCommandBuffers[i] | 				renderer->submittedCommandBuffers[i] | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue