defrag fixes
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
							parent
							
								
									2ef3c04e8e
								
							
						
					
					
						commit
						c3d2b17c4d
					
				|  | @ -703,7 +703,6 @@ struct VulkanBuffer | ||||||
| 	VkBufferUsageFlags usage; | 	VkBufferUsageFlags usage; | ||||||
| 
 | 
 | ||||||
| 	uint8_t preferDeviceLocal; | 	uint8_t preferDeviceLocal; | ||||||
| 	uint8_t isTransferBuffer; |  | ||||||
| 
 | 
 | ||||||
| 	SDL_atomic_t referenceCount; /* Tracks command buffer usage */ | 	SDL_atomic_t referenceCount; /* Tracks command buffer usage */ | ||||||
| 
 | 
 | ||||||
|  | @ -3115,7 +3114,7 @@ static uint8_t VULKAN_INTERNAL_FindAllocationToDefragment( | ||||||
| 
 | 
 | ||||||
| 		for (j = 0; j < allocator->allocationCount; j += 1) | 		for (j = 0; j < allocator->allocationCount; j += 1) | ||||||
| 		{ | 		{ | ||||||
| 			if (allocator->allocations[j]->freeRegionCount > 1) | 			if (allocator->allocations[j]->availableForAllocation == 1 && allocator->allocations[j]->freeRegionCount > 1) | ||||||
| 			{ | 			{ | ||||||
| 				*allocationIndexToDefrag = j; | 				*allocationIndexToDefrag = j; | ||||||
| 				return 1; | 				return 1; | ||||||
|  | @ -4118,7 +4117,6 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( | ||||||
| 	buffer->resourceAccessType = resourceAccessType; | 	buffer->resourceAccessType = resourceAccessType; | ||||||
| 	buffer->usage = usage; | 	buffer->usage = usage; | ||||||
| 	buffer->preferDeviceLocal = preferDeviceLocal; | 	buffer->preferDeviceLocal = preferDeviceLocal; | ||||||
| 	buffer->isTransferBuffer = isTransferBuffer; |  | ||||||
| 
 | 
 | ||||||
| 	bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; | 	bufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO; | ||||||
| 	bufferCreateInfo.pNext = NULL; | 	bufferCreateInfo.pNext = NULL; | ||||||
|  | @ -4142,7 +4140,7 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( | ||||||
| 		buffer->buffer, | 		buffer->buffer, | ||||||
| 		buffer->size, | 		buffer->size, | ||||||
| 		buffer->preferDeviceLocal, | 		buffer->preferDeviceLocal, | ||||||
| 		buffer->isTransferBuffer, | 		isTransferBuffer, | ||||||
| 		&buffer->usedRegion | 		&buffer->usedRegion | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | @ -4157,6 +4155,7 @@ static VulkanBuffer* VULKAN_INTERNAL_CreateBuffer( | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	buffer->usedRegion->vulkanBuffer = buffer; /* lol */ | 	buffer->usedRegion->vulkanBuffer = buffer; /* lol */ | ||||||
|  | 	buffer->container = NULL; | ||||||
| 
 | 
 | ||||||
| 	buffer->resourceAccessType = resourceAccessType; | 	buffer->resourceAccessType = resourceAccessType; | ||||||
| 
 | 
 | ||||||
|  | @ -5319,27 +5318,29 @@ static void VULKAN_DestroyDevice( | ||||||
| 	{ | 	{ | ||||||
| 		allocator = &renderer->memoryAllocator->subAllocators[i]; | 		allocator = &renderer->memoryAllocator->subAllocators[i]; | ||||||
| 
 | 
 | ||||||
| 		for (j = 0; j < allocator->allocationCount; j += 1) | 		for (j = allocator->allocationCount - 1; j >= 0; j -= 1) | ||||||
| 		{ | 		{ | ||||||
| 			for (k = 0; k < allocator->allocations[j]->freeRegionCount; k += 1) | 			for (k = allocator->allocations[j]->usedRegionCount - 1; k >= 0; k -= 1) | ||||||
| 			{ | 			{ | ||||||
| 				SDL_free(allocator->allocations[j]->freeRegions[k]); | 				VULKAN_INTERNAL_RemoveMemoryUsedRegion( | ||||||
|  | 					renderer, | ||||||
|  | 					allocator->allocations[j]->usedRegions[k] | ||||||
|  | 				); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			SDL_free(allocator->allocations[j]->freeRegions); | 			VULKAN_INTERNAL_DeallocateMemory( | ||||||
| 
 | 				renderer, | ||||||
| 			renderer->vkFreeMemory( | 				allocator, | ||||||
| 				renderer->logicalDevice, | 				j | ||||||
| 				allocator->allocations[j]->memory, |  | ||||||
| 				NULL |  | ||||||
| 			); | 			); | ||||||
| 
 |  | ||||||
| 			SDL_DestroyMutex(allocator->allocations[j]->memoryLock); |  | ||||||
| 			SDL_free(allocator->allocations[j]); |  | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		SDL_free(allocator->allocations); | 		if (renderer->memoryAllocator->subAllocators[i].allocations != NULL) | ||||||
| 		SDL_free(allocator->sortedFreeRegions); | 		{ | ||||||
|  | 			SDL_free(renderer->memoryAllocator->subAllocators[i].allocations); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		SDL_free(renderer->memoryAllocator->subAllocators[i].sortedFreeRegions); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	SDL_free(renderer->memoryAllocator); | 	SDL_free(renderer->memoryAllocator); | ||||||
|  | @ -7118,7 +7119,7 @@ static VulkanTransferBuffer* VULKAN_INTERNAL_AcquireTransferBuffer( | ||||||
| 		1 | 		1 | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	if (transferBuffer == NULL) | 	if (transferBuffer->buffer == NULL) | ||||||
| 	{ | 	{ | ||||||
| 		Refresh_LogError("Failed to allocate transfer buffer!"); | 		Refresh_LogError("Failed to allocate transfer buffer!"); | ||||||
| 		return NULL; | 		return NULL; | ||||||
|  | @ -10047,7 +10048,7 @@ static void VULKAN_INTERNAL_CleanCommandBuffer( | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < commandBuffer->transferBufferCount; i += 1) | 	for (i = 0; i < commandBuffer->transferBufferCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		VULKAN_INTERNAL_DestroyBuffer(renderer, commandBuffer->transferBuffers[i]->buffer); | 		VULKAN_INTERNAL_QueueDestroyBuffer(renderer, commandBuffer->transferBuffers[i]->buffer); | ||||||
| 		SDL_free(commandBuffer->transferBuffers[i]); | 		SDL_free(commandBuffer->transferBuffers[i]); | ||||||
| 		commandBuffer->transferBuffers[i] = NULL; | 		commandBuffer->transferBuffers[i] = NULL; | ||||||
| 	} | 	} | ||||||
|  | @ -10202,6 +10203,8 @@ static void VULKAN_Submit( | ||||||
| 	VulkanCommandBuffer *currentCommandBuffer; | 	VulkanCommandBuffer *currentCommandBuffer; | ||||||
| 	VkPipelineStageFlags waitStages[MAX_PRESENT_COUNT]; | 	VkPipelineStageFlags waitStages[MAX_PRESENT_COUNT]; | ||||||
| 	uint32_t swapchainImageIndex; | 	uint32_t swapchainImageIndex; | ||||||
|  | 	uint8_t commandBufferCleaned = 0; | ||||||
|  | 	VulkanMemorySubAllocator *allocator; | ||||||
| 	int32_t i, j; | 	int32_t i, j; | ||||||
| 
 | 
 | ||||||
| 	SDL_LockMutex(renderer->submitLock); | 	SDL_LockMutex(renderer->submitLock); | ||||||
|  | @ -10322,13 +10325,50 @@ static void VULKAN_Submit( | ||||||
| 				renderer, | 				renderer, | ||||||
| 				renderer->submittedCommandBuffers[i] | 				renderer->submittedCommandBuffers[i] | ||||||
| 			); | 			); | ||||||
|  | 
 | ||||||
|  | 			commandBufferCleaned = 1; | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	if (commandBufferCleaned) | ||||||
|  | 	{ | ||||||
|  | 		SDL_LockMutex(renderer->allocatorLock); | ||||||
|  | 
 | ||||||
|  | 		for (i = 0; i < VK_MAX_MEMORY_TYPES; i += 1) | ||||||
|  | 		{ | ||||||
|  | 			allocator = &renderer->memoryAllocator->subAllocators[i]; | ||||||
|  | 
 | ||||||
|  | 			for (j = allocator->allocationCount - 1; j >= 0; j -= 1) | ||||||
|  | 			{ | ||||||
|  | 				if (allocator->allocations[j]->usedRegionCount == 0) | ||||||
|  | 				{ | ||||||
|  | 					VULKAN_INTERNAL_DeallocateMemory( | ||||||
|  | 						renderer, | ||||||
|  | 						allocator, | ||||||
|  | 						j | ||||||
|  | 					); | ||||||
|  | 				} | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		SDL_UnlockMutex(renderer->allocatorLock); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	/* Check pending destroys */ | 	/* Check pending destroys */ | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_PerformPendingDestroys(renderer); | 	VULKAN_INTERNAL_PerformPendingDestroys(renderer); | ||||||
| 
 | 
 | ||||||
|  | 	/* Defrag! */ | ||||||
|  | 	if (renderer->needDefrag) | ||||||
|  | 	{ | ||||||
|  | 		renderer->defragTimer += 1; | ||||||
|  | 
 | ||||||
|  | 		if (renderer->defragTimer == 1) | ||||||
|  | 		{ | ||||||
|  | 			VULKAN_INTERNAL_DefragmentMemory(renderer); | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	SDL_UnlockMutex(renderer->submitLock); | 	SDL_UnlockMutex(renderer->submitLock); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -10343,7 +10383,6 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 	VulkanTexture* newTexture; | 	VulkanTexture* newTexture; | ||||||
| 	VkBufferCopy bufferCopy; | 	VkBufferCopy bufferCopy; | ||||||
| 	VkImageCopy *imageCopyRegions; | 	VkImageCopy *imageCopyRegions; | ||||||
| 	VkImageAspectFlags aspectFlags; |  | ||||||
| 	VulkanCommandBuffer *commandBuffer; | 	VulkanCommandBuffer *commandBuffer; | ||||||
| 	VkCommandBufferBeginInfo beginInfo; | 	VkCommandBufferBeginInfo beginInfo; | ||||||
| 	VkPipelineStageFlags waitFlags = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; | 	VkPipelineStageFlags waitFlags = VK_PIPELINE_STAGE_ALL_COMMANDS_BIT; | ||||||
|  | @ -10393,7 +10432,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 					RESOURCE_ACCESS_NONE, | 					RESOURCE_ACCESS_NONE, | ||||||
| 					currentRegion->vulkanBuffer->usage, | 					currentRegion->vulkanBuffer->usage, | ||||||
| 					currentRegion->vulkanBuffer->preferDeviceLocal, | 					currentRegion->vulkanBuffer->preferDeviceLocal, | ||||||
| 					currentRegion->vulkanBuffer->isTransferBuffer | 					0 | ||||||
| 				); | 				); | ||||||
| 
 | 
 | ||||||
| 				if (newBuffer == NULL) | 				if (newBuffer == NULL) | ||||||
|  | @ -10441,9 +10480,12 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 				VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, newBuffer); | 				VULKAN_INTERNAL_TrackBuffer(renderer, commandBuffer, newBuffer); | ||||||
| 
 | 
 | ||||||
| 				/* re-point original container to new buffer */ | 				/* re-point original container to new buffer */ | ||||||
| 				newBuffer->container = currentRegion->vulkanBuffer->container; | 				if (currentRegion->vulkanBuffer->container != NULL) | ||||||
| 				newBuffer->container->vulkanBuffer = newBuffer; | 				{ | ||||||
| 				currentRegion->vulkanBuffer->container = NULL; | 					newBuffer->container = currentRegion->vulkanBuffer->container; | ||||||
|  | 					newBuffer->container->vulkanBuffer = newBuffer; | ||||||
|  | 					currentRegion->vulkanBuffer->container = NULL; | ||||||
|  | 				} | ||||||
| 
 | 
 | ||||||
| 				VULKAN_INTERNAL_QueueDestroyBuffer(renderer, currentRegion->vulkanBuffer); | 				VULKAN_INTERNAL_QueueDestroyBuffer(renderer, currentRegion->vulkanBuffer); | ||||||
| 
 | 
 | ||||||
|  | @ -10476,7 +10518,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 					renderer, | 					renderer, | ||||||
| 					commandBuffer->commandBuffer, | 					commandBuffer->commandBuffer, | ||||||
| 					RESOURCE_ACCESS_TRANSFER_READ, | 					RESOURCE_ACCESS_TRANSFER_READ, | ||||||
| 					aspectFlags, | 					currentRegion->vulkanTexture->aspectFlags, | ||||||
| 					0, | 					0, | ||||||
| 					currentRegion->vulkanTexture->layerCount, | 					currentRegion->vulkanTexture->layerCount, | ||||||
| 					0, | 					0, | ||||||
|  | @ -10490,7 +10532,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 					renderer, | 					renderer, | ||||||
| 					commandBuffer->commandBuffer, | 					commandBuffer->commandBuffer, | ||||||
| 					RESOURCE_ACCESS_TRANSFER_WRITE, | 					RESOURCE_ACCESS_TRANSFER_WRITE, | ||||||
| 					aspectFlags, | 					currentRegion->vulkanTexture->aspectFlags, | ||||||
| 					0, | 					0, | ||||||
| 					currentRegion->vulkanTexture->layerCount, | 					currentRegion->vulkanTexture->layerCount, | ||||||
| 					0, | 					0, | ||||||
|  | @ -10507,7 +10549,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 					imageCopyRegions[level].srcOffset.x = 0; | 					imageCopyRegions[level].srcOffset.x = 0; | ||||||
| 					imageCopyRegions[level].srcOffset.y = 0; | 					imageCopyRegions[level].srcOffset.y = 0; | ||||||
| 					imageCopyRegions[level].srcOffset.z = 0; | 					imageCopyRegions[level].srcOffset.z = 0; | ||||||
| 					imageCopyRegions[level].srcSubresource.aspectMask = aspectFlags; | 					imageCopyRegions[level].srcSubresource.aspectMask = currentRegion->vulkanTexture->aspectFlags; | ||||||
| 					imageCopyRegions[level].srcSubresource.baseArrayLayer = 0; | 					imageCopyRegions[level].srcSubresource.baseArrayLayer = 0; | ||||||
| 					imageCopyRegions[level].srcSubresource.layerCount = currentRegion->vulkanTexture->layerCount; | 					imageCopyRegions[level].srcSubresource.layerCount = currentRegion->vulkanTexture->layerCount; | ||||||
| 					imageCopyRegions[level].srcSubresource.mipLevel = level; | 					imageCopyRegions[level].srcSubresource.mipLevel = level; | ||||||
|  | @ -10517,7 +10559,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 					imageCopyRegions[level].dstOffset.x = 0; | 					imageCopyRegions[level].dstOffset.x = 0; | ||||||
| 					imageCopyRegions[level].dstOffset.y = 0; | 					imageCopyRegions[level].dstOffset.y = 0; | ||||||
| 					imageCopyRegions[level].dstOffset.z = 0; | 					imageCopyRegions[level].dstOffset.z = 0; | ||||||
| 					imageCopyRegions[level].dstSubresource.aspectMask = aspectFlags; | 					imageCopyRegions[level].dstSubresource.aspectMask = currentRegion->vulkanTexture->aspectFlags; | ||||||
| 					imageCopyRegions[level].dstSubresource.baseArrayLayer = 0; | 					imageCopyRegions[level].dstSubresource.baseArrayLayer = 0; | ||||||
| 					imageCopyRegions[level].dstSubresource.layerCount = currentRegion->vulkanTexture->layerCount; | 					imageCopyRegions[level].dstSubresource.layerCount = currentRegion->vulkanTexture->layerCount; | ||||||
| 					imageCopyRegions[level].dstSubresource.mipLevel = level; | 					imageCopyRegions[level].dstSubresource.mipLevel = level; | ||||||
|  | @ -10537,7 +10579,7 @@ static uint8_t VULKAN_INTERNAL_DefragmentMemory( | ||||||
| 					renderer, | 					renderer, | ||||||
| 					commandBuffer->commandBuffer, | 					commandBuffer->commandBuffer, | ||||||
| 					originalResourceAccessType, | 					originalResourceAccessType, | ||||||
| 					aspectFlags, | 					currentRegion->vulkanTexture->aspectFlags, | ||||||
| 					0, | 					0, | ||||||
| 					currentRegion->vulkanTexture->layerCount, | 					currentRegion->vulkanTexture->layerCount, | ||||||
| 					0, | 					0, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue