memory fixes
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
							parent
							
								
									209b4ae6dd
								
							
						
					
					
						commit
						bb948846c0
					
				|  | @ -1447,6 +1447,7 @@ typedef struct VulkanRenderer | ||||||
| /* Forward declarations */ | /* Forward declarations */ | ||||||
| 
 | 
 | ||||||
| static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer, VulkanCommandBuffer *commandBuffer); | static void VULKAN_INTERNAL_BeginCommandBuffer(VulkanRenderer *renderer, VulkanCommandBuffer *commandBuffer); | ||||||
|  | static void VULKAN_Wait(Refresh_Renderer *driverData); | ||||||
| static void VULKAN_Submit(Refresh_Renderer *driverData, uint32_t commandBufferCount, Refresh_CommandBuffer **pCommandBuffers); | static void VULKAN_Submit(Refresh_Renderer *driverData, uint32_t commandBufferCount, Refresh_CommandBuffer **pCommandBuffers); | ||||||
| 
 | 
 | ||||||
| /* Error Handling */ | /* Error Handling */ | ||||||
|  | @ -3617,6 +3618,7 @@ static void VULKAN_INTERNAL_DeactivateUnusedImageDescriptorSets( | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | /* FIXME: get rid of descriptor set caching */ | ||||||
| static void VULKAN_INTERNAL_ResetDescriptorSetData(VulkanRenderer* renderer) | static void VULKAN_INTERNAL_ResetDescriptorSetData(VulkanRenderer* renderer) | ||||||
| { | { | ||||||
| 	uint32_t i, j; | 	uint32_t i, j; | ||||||
|  | @ -3665,18 +3667,13 @@ static void VULKAN_INTERNAL_ResetDescriptorSetData(VulkanRenderer* renderer) | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_INTERNAL_PostWorkCleanup(VulkanRenderer* renderer) |  | ||||||
| { |  | ||||||
| 	/* Reset descriptor set data */ |  | ||||||
| 	VULKAN_INTERNAL_ResetDescriptorSetData(renderer); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| /* Swapchain */ | /* Swapchain */ | ||||||
| 
 | 
 | ||||||
| static uint8_t VULKAN_INTERNAL_QuerySwapChainSupport( | static uint8_t VULKAN_INTERNAL_QuerySwapChainSupport( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VkPhysicalDevice physicalDevice, | 	VkPhysicalDevice physicalDevice, | ||||||
| 	VkSurfaceKHR surface, | 	VkSurfaceKHR surface, | ||||||
|  | 	uint32_t graphicsFamilyIndex, | ||||||
| 	SwapChainSupportDetails *outputDetails | 	SwapChainSupportDetails *outputDetails | ||||||
| ) { | ) { | ||||||
| 	VkResult result; | 	VkResult result; | ||||||
|  | @ -3684,17 +3681,20 @@ static uint8_t VULKAN_INTERNAL_QuerySwapChainSupport( | ||||||
| 	uint32_t presentModeCount; | 	uint32_t presentModeCount; | ||||||
| 	VkBool32 supportsPresent; | 	VkBool32 supportsPresent; | ||||||
| 
 | 
 | ||||||
| 	renderer->vkGetPhysicalDeviceSurfaceSupportKHR( | 	if (graphicsFamilyIndex != UINT32_MAX) | ||||||
| 		physicalDevice, |  | ||||||
| 		renderer->queueFamilyIndices.graphicsFamily, |  | ||||||
| 		surface, |  | ||||||
| 		&supportsPresent |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	if (!supportsPresent) |  | ||||||
| 	{ | 	{ | ||||||
| 		Refresh_LogWarn("This surface does not support presenting!"); | 		renderer->vkGetPhysicalDeviceSurfaceSupportKHR( | ||||||
| 		return 0; | 			physicalDevice, | ||||||
|  | 			graphicsFamilyIndex, | ||||||
|  | 			surface, | ||||||
|  | 			&supportsPresent | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		if (!supportsPresent) | ||||||
|  | 		{ | ||||||
|  | 			Refresh_LogWarn("This surface does not support presenting!"); | ||||||
|  | 			return 0; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	result = renderer->vkGetPhysicalDeviceSurfaceCapabilitiesKHR( | 	result = renderer->vkGetPhysicalDeviceSurfaceCapabilitiesKHR( | ||||||
|  | @ -3899,6 +3899,7 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		renderer->physicalDevice, | 		renderer->physicalDevice, | ||||||
| 		swapchainData->surface, | 		swapchainData->surface, | ||||||
|  | 		renderer->queueFamilyIndices.graphicsFamily, | ||||||
| 		&swapchainSupportDetails | 		&swapchainSupportDetails | ||||||
| 	)) { | 	)) { | ||||||
| 		renderer->vkDestroySurfaceKHR( | 		renderer->vkDestroySurfaceKHR( | ||||||
|  | @ -4335,23 +4336,13 @@ static void VULKAN_DestroyDevice( | ||||||
|     Refresh_Device *device |     Refresh_Device *device | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer* renderer = (VulkanRenderer*) device->driverData; | 	VulkanRenderer* renderer = (VulkanRenderer*) device->driverData; | ||||||
| 	VkResult waitResult; |  | ||||||
| 	CommandPoolHashArray commandPoolHashArray; | 	CommandPoolHashArray commandPoolHashArray; | ||||||
| 	GraphicsPipelineLayoutHashArray graphicsPipelineLayoutHashArray; | 	GraphicsPipelineLayoutHashArray graphicsPipelineLayoutHashArray; | ||||||
| 	ComputePipelineLayoutHashArray computePipelineLayoutHashArray; | 	ComputePipelineLayoutHashArray computePipelineLayoutHashArray; | ||||||
| 	VulkanMemorySubAllocator *allocator; | 	VulkanMemorySubAllocator *allocator; | ||||||
| 	uint32_t i, j, k; | 	uint32_t i, j, k; | ||||||
| 
 | 
 | ||||||
| 	waitResult = renderer->vkDeviceWaitIdle(renderer->logicalDevice); | 	VULKAN_Wait(device->driverData); | ||||||
| 
 |  | ||||||
| 	if (waitResult != VK_SUCCESS) |  | ||||||
| 	{ |  | ||||||
| 		LogVulkanResultAsError("vkDeviceWaitIdle", waitResult); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	/* We have to do this twice so the rotation happens correctly */ |  | ||||||
| 	VULKAN_INTERNAL_PostWorkCleanup(renderer); |  | ||||||
| 	VULKAN_INTERNAL_PostWorkCleanup(renderer); |  | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyVertexUniformBuffer->vulkanBuffer); | 	VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyVertexUniformBuffer->vulkanBuffer); | ||||||
| 	VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyFragmentUniformBuffer->vulkanBuffer); | 	VULKAN_INTERNAL_DestroyBuffer(renderer, renderer->dummyFragmentUniformBuffer->vulkanBuffer); | ||||||
|  | @ -8617,6 +8608,29 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
| 	SDL_UnlockMutex(renderer->acquireFenceLock); | 	SDL_UnlockMutex(renderer->acquireFenceLock); | ||||||
| 
 | 
 | ||||||
| 	commandBuffer->inFlightFence = VK_NULL_HANDLE; | 	commandBuffer->inFlightFence = VK_NULL_HANDLE; | ||||||
|  | 
 | ||||||
|  | 	/* Return this command buffer to its pool */ | ||||||
|  | 	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; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_Wait( | static void VULKAN_Wait( | ||||||
|  | @ -8669,27 +8683,6 @@ static void VULKAN_Submit( | ||||||
| 
 | 
 | ||||||
| 	SDL_LockMutex(renderer->submitLock); | 	SDL_LockMutex(renderer->submitLock); | ||||||
| 
 | 
 | ||||||
| 	/* Check if we can perform any cleanups */ |  | ||||||
| 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) |  | ||||||
| 	{ |  | ||||||
| 		/* If we set a timeout of 0, we can query the command buffer state */ |  | ||||||
| 		vulkanResult = renderer->vkWaitForFences( |  | ||||||
| 			renderer->logicalDevice, |  | ||||||
| 			1, |  | ||||||
| 			&renderer->submittedCommandBuffers[i]->inFlightFence, |  | ||||||
| 			VK_TRUE, |  | ||||||
| 			0 |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		if (vulkanResult == VK_SUCCESS) |  | ||||||
| 		{ |  | ||||||
| 			VULKAN_INTERNAL_CleanCommandBuffer( |  | ||||||
| 				renderer, |  | ||||||
| 				renderer->submittedCommandBuffers[i] |  | ||||||
| 			); |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	commandBuffers = SDL_stack_alloc(VkCommandBuffer, commandBufferCount); | 	commandBuffers = SDL_stack_alloc(VkCommandBuffer, commandBufferCount); | ||||||
| 	submitInfos = SDL_stack_alloc(VkSubmitInfo, commandBufferCount); | 	submitInfos = SDL_stack_alloc(VkSubmitInfo, commandBufferCount); | ||||||
| 
 | 
 | ||||||
|  | @ -8744,6 +8737,7 @@ static void VULKAN_Submit( | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/* Wait for any previous submissions on swapchains */ | ||||||
| 	for (i = 0; i < commandBufferCount; i += 1) | 	for (i = 0; i < commandBufferCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		currentCommandBuffer = (VulkanCommandBuffer*)pCommandBuffers[i]; | 		currentCommandBuffer = (VulkanCommandBuffer*)pCommandBuffers[i]; | ||||||
|  | @ -8754,7 +8748,7 @@ static void VULKAN_Submit( | ||||||
| 
 | 
 | ||||||
| 			if (swapchainData->inFlightFence != VK_NULL_HANDLE) | 			if (swapchainData->inFlightFence != VK_NULL_HANDLE) | ||||||
| 			{ | 			{ | ||||||
| 				renderer->vkWaitForFences( | 				vulkanResult = renderer->vkWaitForFences( | ||||||
| 					renderer->logicalDevice, | 					renderer->logicalDevice, | ||||||
| 					1, | 					1, | ||||||
| 					&swapchainData->inFlightFence, | 					&swapchainData->inFlightFence, | ||||||
|  | @ -8774,6 +8768,27 @@ static void VULKAN_Submit( | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	/* Check if we can perform any cleanups */ | ||||||
|  | 	for (i = renderer->submittedCommandBufferCount - 1; i >= 0; i -= 1) | ||||||
|  | 	{ | ||||||
|  | 		/* If we set a timeout of 0, we can query the command buffer state */ | ||||||
|  | 		vulkanResult = renderer->vkWaitForFences( | ||||||
|  | 			renderer->logicalDevice, | ||||||
|  | 			1, | ||||||
|  | 			&renderer->submittedCommandBuffers[i]->inFlightFence, | ||||||
|  | 			VK_TRUE, | ||||||
|  | 			0 | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		if (vulkanResult == VK_SUCCESS) | ||||||
|  | 		{ | ||||||
|  | 			VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
|  | 				renderer, | ||||||
|  | 				renderer->submittedCommandBuffers[i] | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/* Acquire a fence */ | 	/* Acquire a fence */ | ||||||
| 	fence = VULKAN_INTERNAL_AcquireFence(renderer); | 	fence = VULKAN_INTERNAL_AcquireFence(renderer); | ||||||
| 
 | 
 | ||||||
|  | @ -9169,6 +9184,7 @@ static uint8_t VULKAN_INTERNAL_IsDeviceSuitable( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		physicalDevice, | 		physicalDevice, | ||||||
| 		surface, | 		surface, | ||||||
|  | 		UINT32_MAX, | ||||||
| 		&swapChainSupportDetails | 		&swapChainSupportDetails | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue