forked from MoonsideGames/Refresh
				
			texture dispose
							parent
							
								
									5a38907294
								
							
						
					
					
						commit
						9cecc63991
					
				|  | @ -1058,6 +1058,17 @@ typedef struct VulkanRenderer | ||||||
| 
 | 
 | ||||||
| 	SDL_mutex *allocatorLock; | 	SDL_mutex *allocatorLock; | ||||||
| 	SDL_mutex *commandLock; | 	SDL_mutex *commandLock; | ||||||
|  | 	SDL_mutex *disposeLock; | ||||||
|  | 
 | ||||||
|  | 	/* Deferred destroy storage */ | ||||||
|  | 
 | ||||||
|  | 	VulkanTexture **texturesToDestroy; | ||||||
|  | 	uint32_t texturesToDestroyCount; | ||||||
|  | 	uint32_t texturesToDestroyCapacity; | ||||||
|  | 
 | ||||||
|  | 	VulkanTexture **submittedTexturesToDestroy; | ||||||
|  | 	uint32_t submittedTexturesToDestroyCount; | ||||||
|  | 	uint32_t submittedTexturesToDestroyCapacity; | ||||||
| 
 | 
 | ||||||
|     #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ |     #define VULKAN_INSTANCE_FUNCTION(ext, ret, func, params) \ | ||||||
| 		vkfntype_##func func; | 		vkfntype_##func func; | ||||||
|  | @ -1853,9 +1864,47 @@ static void VULKAN_INTERNAL_DestroySwapchain(VulkanRenderer* renderer) | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_INTERNAL_PerformDeferredDestroys(VulkanRenderer* renderer) | static void VULKAN_INTERNAL_DestroyTexture( | ||||||
| { | 	VulkanRenderer* renderer, | ||||||
| 	/* TODO */ | 	VulkanTexture* texture | ||||||
|  | ) { | ||||||
|  | 	if (texture->allocation->dedicated) | ||||||
|  | 	{ | ||||||
|  | 		renderer->vkFreeMemory( | ||||||
|  | 			renderer->logicalDevice, | ||||||
|  | 			texture->allocation->memory, | ||||||
|  | 			NULL | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		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_DestroyTextureStagingBuffer( | static void VULKAN_INTERNAL_DestroyTextureStagingBuffer( | ||||||
|  | @ -1873,6 +1922,11 @@ static void VULKAN_INTERNAL_DestroySamplerDescriptorSetCache( | ||||||
| ) { | ) { | ||||||
| 	uint32_t i; | 	uint32_t i; | ||||||
| 
 | 
 | ||||||
|  | 	if (cache == NULL) | ||||||
|  | 	{ | ||||||
|  | 		return; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	for (i = 0; i < cache->samplerDescriptorPoolCount; i += 1) | 	for (i = 0; i < cache->samplerDescriptorPoolCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		renderer->vkDestroyDescriptorPool( | 		renderer->vkDestroyDescriptorPool( | ||||||
|  | @ -1894,6 +1948,47 @@ static void VULKAN_INTERNAL_DestroySamplerDescriptorSetCache( | ||||||
| 	SDL_free(cache); | 	SDL_free(cache); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static void VULKAN_INTERNAL_PerformDeferredDestroys(VulkanRenderer* renderer) | ||||||
|  | { | ||||||
|  | 	uint32_t i; | ||||||
|  | 
 | ||||||
|  | 	/* Destroy submitted resources */ | ||||||
|  | 
 | ||||||
|  | 	SDL_LockMutex(renderer->disposeLock); | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < renderer->submittedTexturesToDestroyCount; i += 1) | ||||||
|  | 	{ | ||||||
|  | 		VULKAN_INTERNAL_DestroyTexture( | ||||||
|  | 			renderer, | ||||||
|  | 			renderer->submittedTexturesToDestroy[i] | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 	renderer->submittedTexturesToDestroyCount = 0; | ||||||
|  | 
 | ||||||
|  | 	/* Re-size submitted destroy lists */ | ||||||
|  | 
 | ||||||
|  | 	if (renderer->submittedTexturesToDestroyCapacity < renderer->texturesToDestroyCount) | ||||||
|  | 	{ | ||||||
|  | 		renderer->submittedTexturesToDestroy = SDL_realloc( | ||||||
|  | 			renderer->submittedTexturesToDestroy, | ||||||
|  | 			sizeof(VulkanTexture*) * renderer->texturesToDestroyCount | ||||||
|  | 		); | ||||||
|  | 
 | ||||||
|  | 		renderer->submittedTexturesToDestroyCapacity = renderer->texturesToDestroyCount; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	/* Rotate destroy lists */ | ||||||
|  | 
 | ||||||
|  | 	for (i = 0; i < renderer->texturesToDestroyCount; i += 1) | ||||||
|  | 	{ | ||||||
|  | 		renderer->submittedTexturesToDestroy[i] = renderer->texturesToDestroy[i]; | ||||||
|  | 	} | ||||||
|  | 	renderer->submittedTexturesToDestroyCount = renderer->texturesToDestroyCount; | ||||||
|  | 	renderer->texturesToDestroyCount = 0; | ||||||
|  | 
 | ||||||
|  | 	SDL_UnlockMutex(renderer->disposeLock); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| /* Swapchain */ | /* Swapchain */ | ||||||
| 
 | 
 | ||||||
| static inline VkExtent2D VULKAN_INTERNAL_ChooseSwapExtent( | static inline VkExtent2D VULKAN_INTERNAL_ChooseSwapExtent( | ||||||
|  | @ -2684,6 +2779,7 @@ static void VULKAN_DestroyDevice( | ||||||
| 
 | 
 | ||||||
| 	SDL_DestroyMutex(renderer->commandLock); | 	SDL_DestroyMutex(renderer->commandLock); | ||||||
| 	SDL_DestroyMutex(renderer->allocatorLock); | 	SDL_DestroyMutex(renderer->allocatorLock); | ||||||
|  | 	SDL_DestroyMutex(renderer->disposeLock); | ||||||
| 
 | 
 | ||||||
| 	SDL_free(renderer->buffersInUse); | 	SDL_free(renderer->buffersInUse); | ||||||
| 
 | 
 | ||||||
|  | @ -5508,7 +5604,25 @@ static void VULKAN_AddDisposeTexture( | ||||||
| 	REFRESH_Renderer *driverData, | 	REFRESH_Renderer *driverData, | ||||||
| 	REFRESH_Texture *texture | 	REFRESH_Texture *texture | ||||||
| ) { | ) { | ||||||
|     SDL_assert(0); | 	VulkanRenderer* renderer = (VulkanRenderer*)driverData; | ||||||
|  | 	VulkanTexture* vulkanTexture = (VulkanTexture*)texture; | ||||||
|  | 
 | ||||||
|  | 	SDL_LockMutex(renderer->disposeLock); | ||||||
|  | 	 | ||||||
|  | 	if (renderer->texturesToDestroyCount + 1 >= renderer->texturesToDestroyCapacity) | ||||||
|  | 	{ | ||||||
|  | 		renderer->texturesToDestroyCapacity *= 2; | ||||||
|  | 
 | ||||||
|  | 		renderer->texturesToDestroy = SDL_realloc( | ||||||
|  | 			renderer->texturesToDestroy, | ||||||
|  | 			sizeof(VulkanTexture*) * renderer->texturesToDestroyCapacity | ||||||
|  | 		); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	renderer->texturesToDestroy[renderer->texturesToDestroyCount] = vulkanTexture; | ||||||
|  | 	renderer->texturesToDestroyCount += 1; | ||||||
|  | 
 | ||||||
|  | 	SDL_UnlockMutex(renderer->disposeLock); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void VULKAN_AddDisposeSampler( | static void VULKAN_AddDisposeSampler( | ||||||
|  | @ -7083,6 +7197,7 @@ static REFRESH_Device* VULKAN_CreateDevice( | ||||||
| 
 | 
 | ||||||
| 	renderer->allocatorLock = SDL_CreateMutex(); | 	renderer->allocatorLock = SDL_CreateMutex(); | ||||||
| 	renderer->commandLock = SDL_CreateMutex(); | 	renderer->commandLock = SDL_CreateMutex(); | ||||||
|  | 	renderer->disposeLock = SDL_CreateMutex(); | ||||||
| 
 | 
 | ||||||
| 	/*
 | 	/*
 | ||||||
| 	 * Create command pool and buffers | 	 * Create command pool and buffers | ||||||
|  | @ -7397,9 +7512,28 @@ static REFRESH_Device* VULKAN_CreateDevice( | ||||||
| 	renderer->descriptorPoolCount = 0; | 	renderer->descriptorPoolCount = 0; | ||||||
| 
 | 
 | ||||||
| 	/* State tracking */ | 	/* State tracking */ | ||||||
|  | 
 | ||||||
| 	renderer->currentGraphicsPipeline = NULL; | 	renderer->currentGraphicsPipeline = NULL; | ||||||
| 	renderer->currentFramebuffer = NULL; | 	renderer->currentFramebuffer = NULL; | ||||||
| 
 | 
 | ||||||
|  | 	/* Deferred destroy storage */ | ||||||
|  | 
 | ||||||
|  | 	renderer->texturesToDestroyCapacity = 16; | ||||||
|  | 	renderer->texturesToDestroyCount = 0; | ||||||
|  | 
 | ||||||
|  | 	renderer->texturesToDestroy = (VulkanTexture**)SDL_malloc( | ||||||
|  | 		sizeof(VulkanTexture*) * | ||||||
|  | 		renderer->texturesToDestroyCapacity | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|  | 	renderer->submittedTexturesToDestroyCapacity = 16; | ||||||
|  | 	renderer->submittedTexturesToDestroyCount = 0; | ||||||
|  | 
 | ||||||
|  | 	renderer->submittedTexturesToDestroy = (VulkanTexture**)SDL_malloc( | ||||||
|  | 		sizeof(VulkanTexture*) * | ||||||
|  | 		renderer->submittedTexturesToDestroyCapacity | ||||||
|  | 	); | ||||||
|  | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue