render target cleanup
							parent
							
								
									4c73c6c200
								
							
						
					
					
						commit
						fbff906aa3
					
				|  | @ -1695,6 +1695,7 @@ typedef struct VulkanRenderer | ||||||
| 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_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); | ||||||
|  | static void VULKAN_INTERNAL_DestroyRenderTarget(VulkanRenderer *renderer, VulkanRenderTarget *renderTarget); | ||||||
| 
 | 
 | ||||||
| /* Error Handling */ | /* Error Handling */ | ||||||
| 
 | 
 | ||||||
|  | @ -2601,51 +2602,6 @@ static void VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
| 
 | 
 | ||||||
| /* Resource Disposal */ | /* Resource Disposal */ | ||||||
| 
 | 
 | ||||||
| /* TODO: destroy associated framebuffers and render targets */ |  | ||||||
| static void VULKAN_INTERNAL_DestroyTexture( |  | ||||||
| 	VulkanRenderer* renderer, |  | ||||||
| 	VulkanTexture* texture |  | ||||||
| ) { |  | ||||||
| 	if (texture->allocation->dedicated) |  | ||||||
| 	{ |  | ||||||
| 		renderer->vkFreeMemory( |  | ||||||
| 			renderer->logicalDevice, |  | ||||||
| 			texture->allocation->memory, |  | ||||||
| 			NULL |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		SDL_DestroyMutex(texture->allocation->memoryLock); |  | ||||||
| 		SDL_free(texture->allocation->freeRegions); |  | ||||||
| 		SDL_free(texture->allocation); |  | ||||||
| 	} |  | ||||||
| 	else |  | ||||||
| 	{ |  | ||||||
| 		SDL_LockMutex(renderer->allocatorLock); |  | ||||||
| 
 |  | ||||||
| 		VULKAN_INTERNAL_NewMemoryFreeRegion( |  | ||||||
| 			texture->allocation, |  | ||||||
| 			texture->offset, |  | ||||||
| 			texture->memorySize |  | ||||||
| 		); |  | ||||||
| 
 |  | ||||||
| 		SDL_UnlockMutex(renderer->allocatorLock); |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	renderer->vkDestroyImageView( |  | ||||||
| 		renderer->logicalDevice, |  | ||||||
| 		texture->view, |  | ||||||
| 		NULL |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	renderer->vkDestroyImage( |  | ||||||
| 		renderer->logicalDevice, |  | ||||||
| 		texture->image, |  | ||||||
| 		NULL |  | ||||||
| 	); |  | ||||||
| 
 |  | ||||||
| 	SDL_free(texture); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| static void VULKAN_INTERNAL_RemoveFramebuffersContainingView( | static void VULKAN_INTERNAL_RemoveFramebuffersContainingView( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VkImageView view | 	VkImageView view | ||||||
|  | @ -2682,6 +2638,90 @@ static void VULKAN_INTERNAL_RemoveFramebuffersContainingView( | ||||||
| 	SDL_UnlockMutex(renderer->framebufferFetchLock); | 	SDL_UnlockMutex(renderer->framebufferFetchLock); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture( | ||||||
|  | 	VulkanRenderer *renderer, | ||||||
|  | 	VulkanTexture *texture | ||||||
|  | ) { | ||||||
|  | 	RenderTargetHash *hash; | ||||||
|  | 	int32_t i; | ||||||
|  | 
 | ||||||
|  | 	SDL_LockMutex(renderer->renderTargetFetchLock); | ||||||
|  | 
 | ||||||
|  | 	for (i = renderer->renderTargetHashArray.count - 1; i >= 0; i -= 1) | ||||||
|  | 	{ | ||||||
|  | 		hash = &renderer->renderTargetHashArray.elements[i].key; | ||||||
|  | 
 | ||||||
|  | 		if ((VulkanTexture*) hash->texture == texture) | ||||||
|  | 		{ | ||||||
|  | 			VULKAN_INTERNAL_RemoveFramebuffersContainingView( | ||||||
|  | 				renderer, | ||||||
|  | 				renderer->renderTargetHashArray.elements[i].value->view | ||||||
|  | 			); | ||||||
|  | 
 | ||||||
|  | 			VULKAN_INTERNAL_DestroyRenderTarget( | ||||||
|  | 				renderer, | ||||||
|  | 				renderer->renderTargetHashArray.elements[i].value | ||||||
|  | 			); | ||||||
|  | 
 | ||||||
|  | 			RenderTargetHash_Remove( | ||||||
|  | 				&renderer->renderTargetHashArray, | ||||||
|  | 				i | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	SDL_UnlockMutex(renderer->renderTargetFetchLock); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void VULKAN_INTERNAL_DestroyTexture( | ||||||
|  | 	VulkanRenderer* renderer, | ||||||
|  | 	VulkanTexture* texture | ||||||
|  | ) { | ||||||
|  | 	if (texture->allocation->dedicated) | ||||||
|  | 	{ | ||||||
|  | 		renderer->vkFreeMemory( | ||||||
|  | 			renderer->logicalDevice, | ||||||
|  | 			texture->allocation->memory, | ||||||
|  | 			NULL | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		SDL_DestroyMutex(texture->allocation->memoryLock); | ||||||
|  | 		SDL_free(texture->allocation->freeRegions); | ||||||
|  | 		SDL_free(texture->allocation); | ||||||
|  | 	} | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
|  | 		SDL_LockMutex(renderer->allocatorLock); | ||||||
|  | 
 | ||||||
|  | 		VULKAN_INTERNAL_NewMemoryFreeRegion( | ||||||
|  | 			texture->allocation, | ||||||
|  | 			texture->offset, | ||||||
|  | 			texture->memorySize | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		SDL_UnlockMutex(renderer->allocatorLock); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture( | ||||||
|  | 		renderer, | ||||||
|  | 		texture | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	renderer->vkDestroyImageView( | ||||||
|  | 		renderer->logicalDevice, | ||||||
|  | 		texture->view, | ||||||
|  | 		NULL | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	renderer->vkDestroyImage( | ||||||
|  | 		renderer->logicalDevice, | ||||||
|  | 		texture->image, | ||||||
|  | 		NULL | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	SDL_free(texture); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static void VULKAN_INTERNAL_DestroyRenderTarget( | static void VULKAN_INTERNAL_DestroyRenderTarget( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VulkanRenderTarget *renderTarget | 	VulkanRenderTarget *renderTarget | ||||||
|  | @ -2767,6 +2807,9 @@ static void VULKAN_INTERNAL_DestroyCommandPool( | ||||||
| 	{ | 	{ | ||||||
| 		commandBuffer = commandPool->inactiveCommandBuffers[i]; | 		commandBuffer = commandPool->inactiveCommandBuffers[i]; | ||||||
| 
 | 
 | ||||||
|  | 		SDL_free(commandBuffer->presentDatas); | ||||||
|  | 		SDL_free(commandBuffer->waitSemaphores); | ||||||
|  | 		SDL_free(commandBuffer->signalSemaphores); | ||||||
| 		SDL_free(commandBuffer->transferBuffers); | 		SDL_free(commandBuffer->transferBuffers); | ||||||
| 		SDL_free(commandBuffer->boundUniformBuffers); | 		SDL_free(commandBuffer->boundUniformBuffers); | ||||||
| 		SDL_free(commandBuffer->boundDescriptorSetDatas); | 		SDL_free(commandBuffer->boundDescriptorSetDatas); | ||||||
|  | @ -2848,9 +2891,9 @@ static void VULKAN_INTERNAL_DestroySwapchain( | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < swapchainData->imageCount; i += 1) | 	for (i = 0; i < swapchainData->imageCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		VULKAN_INTERNAL_RemoveFramebuffersContainingView( | 		VULKAN_INTERNAL_RemoveRenderTargetsContainingTexture( | ||||||
| 			renderer, | 			renderer, | ||||||
| 			swapchainData->textures[i].view | 			&swapchainData->textures[i] | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		renderer->vkDestroyImageView( | 		renderer->vkDestroyImageView( | ||||||
|  | @ -4071,7 +4114,10 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 	swapchainCreateInfo.imageColorSpace = swapchainData->surfaceFormat.colorSpace; | 	swapchainCreateInfo.imageColorSpace = swapchainData->surfaceFormat.colorSpace; | ||||||
| 	swapchainCreateInfo.imageExtent = swapchainData->extent; | 	swapchainCreateInfo.imageExtent = swapchainData->extent; | ||||||
| 	swapchainCreateInfo.imageArrayLayers = 1; | 	swapchainCreateInfo.imageArrayLayers = 1; | ||||||
| 	swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT; | 	swapchainCreateInfo.imageUsage = | ||||||
|  | 		VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | | ||||||
|  | 		VK_IMAGE_USAGE_TRANSFER_SRC_BIT | | ||||||
|  | 		VK_IMAGE_USAGE_TRANSFER_DST_BIT; | ||||||
| 	swapchainCreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; | 	swapchainCreateInfo.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE; | ||||||
| 	swapchainCreateInfo.queueFamilyIndexCount = 0; | 	swapchainCreateInfo.queueFamilyIndexCount = 0; | ||||||
| 	swapchainCreateInfo.pQueueFamilyIndices = NULL; | 	swapchainCreateInfo.pQueueFamilyIndices = NULL; | ||||||
|  | @ -4494,6 +4540,17 @@ static void VULKAN_DestroyDevice( | ||||||
| 		NULL | 		NULL | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->vertexUniformBufferPool); | ||||||
|  | 	VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->fragmentUniformBufferPool); | ||||||
|  | 	VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->computeUniformBufferPool); | ||||||
|  | 
 | ||||||
|  | 	for (i = renderer->swapchainDataCount - 1; i >= 0; i -= 1) | ||||||
|  | 	{ | ||||||
|  | 		VULKAN_INTERNAL_DestroySwapchain(renderer, renderer->swapchainDatas[i]->windowHandle); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	SDL_free(renderer->swapchainDatas); | ||||||
|  | 
 | ||||||
| 	for (i = 0; i < renderer->framebufferHashArray.count; i += 1) | 	for (i = 0; i < renderer->framebufferHashArray.count; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		renderer->vkDestroyFramebuffer( | 		renderer->vkDestroyFramebuffer( | ||||||
|  | @ -4516,16 +4573,7 @@ static void VULKAN_DestroyDevice( | ||||||
| 
 | 
 | ||||||
| 	SDL_free(renderer->renderPassHashArray.elements); | 	SDL_free(renderer->renderPassHashArray.elements); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->vertexUniformBufferPool); | 	SDL_free(renderer->renderTargetHashArray.elements); | ||||||
| 	VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->fragmentUniformBufferPool); |  | ||||||
| 	VULKAN_INTERNAL_DestroyUniformBufferPool(renderer, renderer->computeUniformBufferPool); |  | ||||||
| 
 |  | ||||||
| 	for (i = renderer->swapchainDataCount - 1; i >= 0; i -= 1) |  | ||||||
| 	{ |  | ||||||
| 		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) | ||||||
| 	{ | 	{ | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue