transition entire images + rework swapchain image management
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
							parent
							
								
									436b990d45
								
							
						
					
					
						commit
						d22bed8b76
					
				|  | @ -726,6 +726,27 @@ typedef struct QueueFamilyIndices | ||||||
| 	uint32_t transferFamily; | 	uint32_t transferFamily; | ||||||
| } QueueFamilyIndices; | } QueueFamilyIndices; | ||||||
| 
 | 
 | ||||||
|  | typedef struct VulkanTexture | ||||||
|  | { | ||||||
|  | 	VulkanMemoryAllocation *allocation; | ||||||
|  | 	VkDeviceSize offset; | ||||||
|  | 	VkDeviceSize memorySize; | ||||||
|  | 
 | ||||||
|  | 	VkImage image; | ||||||
|  | 	VkImageView view; | ||||||
|  | 	VkExtent2D dimensions; | ||||||
|  | 
 | ||||||
|  | 	uint8_t is3D; | ||||||
|  | 	uint8_t isCube; | ||||||
|  | 
 | ||||||
|  | 	uint32_t depth; | ||||||
|  | 	uint32_t layerCount; | ||||||
|  | 	uint32_t levelCount; | ||||||
|  | 	VkFormat format; | ||||||
|  | 	VulkanResourceAccessType resourceAccessType; | ||||||
|  | 	VkImageUsageFlags usageFlags; | ||||||
|  | } VulkanTexture; | ||||||
|  | 
 | ||||||
| typedef struct VulkanSwapchainData | typedef struct VulkanSwapchainData | ||||||
| { | { | ||||||
| 	/* Window surface */ | 	/* Window surface */ | ||||||
|  | @ -741,9 +762,7 @@ typedef struct VulkanSwapchainData | ||||||
| 
 | 
 | ||||||
| 	/* Swapchain images */ | 	/* Swapchain images */ | ||||||
| 	VkExtent2D extent; | 	VkExtent2D extent; | ||||||
| 	VkImage *images; | 	VulkanTexture *textures; | ||||||
| 	VkImageView *views; |  | ||||||
| 	VulkanResourceAccessType *resourceAccessTypes; |  | ||||||
| 	uint32_t imageCount; | 	uint32_t imageCount; | ||||||
| 
 | 
 | ||||||
| 	/* Synchronization primitives */ | 	/* Synchronization primitives */ | ||||||
|  | @ -793,28 +812,6 @@ typedef struct VulkanComputePipeline | ||||||
| 	VkDeviceSize uniformBlockSize; /* permanently set in Create function */ | 	VkDeviceSize uniformBlockSize; /* permanently set in Create function */ | ||||||
| } VulkanComputePipeline; | } VulkanComputePipeline; | ||||||
| 
 | 
 | ||||||
| typedef struct VulkanTexture |  | ||||||
| { |  | ||||||
| 	VulkanMemoryAllocation *allocation; |  | ||||||
| 	VkDeviceSize offset; |  | ||||||
| 	VkDeviceSize memorySize; |  | ||||||
| 
 |  | ||||||
| 	VkImage image; |  | ||||||
| 	VkImageView view; |  | ||||||
| 	VkExtent2D dimensions; |  | ||||||
| 
 |  | ||||||
| 	uint8_t is3D; |  | ||||||
| 	uint8_t isCube; |  | ||||||
| 
 |  | ||||||
| 	uint32_t depth; |  | ||||||
| 	uint32_t layerCount; |  | ||||||
| 	uint32_t levelCount; |  | ||||||
| 	VkFormat format; |  | ||||||
| 	VulkanResourceAccessType resourceAccessType; |  | ||||||
| 	uint32_t queueFamilyIndex; |  | ||||||
| 	VkImageUsageFlags usageFlags; |  | ||||||
| } VulkanTexture; |  | ||||||
| 
 |  | ||||||
| typedef struct VulkanRenderTarget | typedef struct VulkanRenderTarget | ||||||
| { | { | ||||||
| 	VulkanTexture *texture; | 	VulkanTexture *texture; | ||||||
|  | @ -2730,14 +2727,12 @@ static void VULKAN_INTERNAL_DestroySwapchain( | ||||||
| 	{ | 	{ | ||||||
| 		renderer->vkDestroyImageView( | 		renderer->vkDestroyImageView( | ||||||
| 			renderer->logicalDevice, | 			renderer->logicalDevice, | ||||||
| 			swapchainData->views[i], | 			swapchainData->textures[i].view, | ||||||
| 			NULL | 			NULL | ||||||
| 		); | 		); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	SDL_free(swapchainData->images); | 	SDL_free(swapchainData->textures); | ||||||
| 	SDL_free(swapchainData->views); |  | ||||||
| 	SDL_free(swapchainData->resourceAccessTypes); |  | ||||||
| 
 | 
 | ||||||
| 	renderer->vkDestroySwapchainKHR( | 	renderer->vkDestroySwapchainKHR( | ||||||
| 		renderer->logicalDevice, | 		renderer->logicalDevice, | ||||||
|  | @ -3745,6 +3740,7 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 	VkResult vulkanResult; | 	VkResult vulkanResult; | ||||||
| 	VulkanSwapchainData *swapchainData; | 	VulkanSwapchainData *swapchainData; | ||||||
| 	VkSwapchainCreateInfoKHR swapchainCreateInfo; | 	VkSwapchainCreateInfoKHR swapchainCreateInfo; | ||||||
|  | 	VkImage *swapchainImages; | ||||||
| 	VkImageViewCreateInfo imageViewCreateInfo; | 	VkImageViewCreateInfo imageViewCreateInfo; | ||||||
| 	VkSemaphoreCreateInfo semaphoreCreateInfo; | 	VkSemaphoreCreateInfo semaphoreCreateInfo; | ||||||
| 	SwapChainSupportDetails swapchainSupportDetails; | 	SwapChainSupportDetails swapchainSupportDetails; | ||||||
|  | @ -3992,10 +3988,11 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 		NULL | 		NULL | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	swapchainData->images = (VkImage*) SDL_malloc( | 	swapchainData->textures = SDL_malloc( | ||||||
| 		sizeof(VkImage) * swapchainData->imageCount | 		sizeof(VulkanTexture) * swapchainData->imageCount | ||||||
| 	); | 	); | ||||||
| 	if (!swapchainData->images) | 
 | ||||||
|  | 	if (!swapchainData->textures) | ||||||
| 	{ | 	{ | ||||||
| 		SDL_OutOfMemory(); | 		SDL_OutOfMemory(); | ||||||
| 		renderer->vkDestroySurfaceKHR( | 		renderer->vkDestroySurfaceKHR( | ||||||
|  | @ -4007,44 +4004,13 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 		return CREATE_SWAPCHAIN_FAIL; | 		return CREATE_SWAPCHAIN_FAIL; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	swapchainData->views = (VkImageView*) SDL_malloc( | 	swapchainImages = SDL_stack_alloc(VkImage, swapchainData->imageCount); | ||||||
| 		sizeof(VkImageView) * swapchainData->imageCount |  | ||||||
| 	); |  | ||||||
| 	if (!swapchainData->views) |  | ||||||
| 	{ |  | ||||||
| 		SDL_OutOfMemory(); |  | ||||||
| 		renderer->vkDestroySurfaceKHR( |  | ||||||
| 			renderer->instance, |  | ||||||
| 			swapchainData->surface, |  | ||||||
| 			NULL |  | ||||||
| 		); |  | ||||||
| 		SDL_free(swapchainData->images); |  | ||||||
| 		SDL_free(swapchainData); |  | ||||||
| 		return CREATE_SWAPCHAIN_FAIL; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	swapchainData->resourceAccessTypes = (VulkanResourceAccessType*) SDL_malloc( |  | ||||||
| 		sizeof(VulkanResourceAccessType) * swapchainData->imageCount |  | ||||||
| 	); |  | ||||||
| 	if (!swapchainData->resourceAccessTypes) |  | ||||||
| 	{ |  | ||||||
| 		SDL_OutOfMemory(); |  | ||||||
| 		renderer->vkDestroySurfaceKHR( |  | ||||||
| 			renderer->instance, |  | ||||||
| 			swapchainData->surface, |  | ||||||
| 			NULL |  | ||||||
| 		); |  | ||||||
| 		SDL_free(swapchainData->images); |  | ||||||
| 		SDL_free(swapchainData->views); |  | ||||||
| 		SDL_free(swapchainData); |  | ||||||
| 		return CREATE_SWAPCHAIN_FAIL; |  | ||||||
| 	} |  | ||||||
| 
 | 
 | ||||||
| 	renderer->vkGetSwapchainImagesKHR( | 	renderer->vkGetSwapchainImagesKHR( | ||||||
| 		renderer->logicalDevice, | 		renderer->logicalDevice, | ||||||
| 		swapchainData->swapchain, | 		swapchainData->swapchain, | ||||||
| 		&swapchainData->imageCount, | 		&swapchainData->imageCount, | ||||||
| 		swapchainData->images | 		swapchainImages | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; | 	imageViewCreateInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO; | ||||||
|  | @ -4061,13 +4027,15 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < swapchainData->imageCount; i += 1) | 	for (i = 0; i < swapchainData->imageCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		imageViewCreateInfo.image = swapchainData->images[i]; | 		swapchainData->textures[i].image = swapchainImages[i]; | ||||||
|  | 
 | ||||||
|  | 		imageViewCreateInfo.image = swapchainImages[i]; | ||||||
| 
 | 
 | ||||||
| 		vulkanResult = renderer->vkCreateImageView( | 		vulkanResult = renderer->vkCreateImageView( | ||||||
| 			renderer->logicalDevice, | 			renderer->logicalDevice, | ||||||
| 			&imageViewCreateInfo, | 			&imageViewCreateInfo, | ||||||
| 			NULL, | 			NULL, | ||||||
| 			&swapchainData->views[i] | 			&swapchainData->textures[i].view | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
| 		if (vulkanResult != VK_SUCCESS) | 		if (vulkanResult != VK_SUCCESS) | ||||||
|  | @ -4077,17 +4045,33 @@ static CreateSwapchainResult VULKAN_INTERNAL_CreateSwapchain( | ||||||
| 				swapchainData->surface, | 				swapchainData->surface, | ||||||
| 				NULL | 				NULL | ||||||
| 			); | 			); | ||||||
| 			SDL_free(swapchainData->images); | 			SDL_stack_free(swapchainImages); | ||||||
| 			SDL_free(swapchainData->views); | 			SDL_free(swapchainData->textures); | ||||||
| 			SDL_free(swapchainData->resourceAccessTypes); |  | ||||||
| 			SDL_free(swapchainData); | 			SDL_free(swapchainData); | ||||||
| 			LogVulkanResultAsError("vkCreateImageView", vulkanResult); | 			LogVulkanResultAsError("vkCreateImageView", vulkanResult); | ||||||
| 			return CREATE_SWAPCHAIN_FAIL; | 			return CREATE_SWAPCHAIN_FAIL; | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		swapchainData->resourceAccessTypes[i] = RESOURCE_ACCESS_NONE; | 		swapchainData->textures[i].resourceAccessType = RESOURCE_ACCESS_NONE; | ||||||
|  | 
 | ||||||
|  | 		/* Swapchain memory is managed by the driver */ | ||||||
|  | 		swapchainData->textures[i].allocation = NULL; | ||||||
|  | 		swapchainData->textures[i].offset = 0; | ||||||
|  | 		swapchainData->textures[i].memorySize = 0; | ||||||
|  | 
 | ||||||
|  | 		swapchainData->textures[i].dimensions = swapchainData->extent; | ||||||
|  | 		swapchainData->textures[i].format = swapchainData->swapchainFormat; | ||||||
|  | 		swapchainData->textures[i].is3D = 0; | ||||||
|  | 		swapchainData->textures[i].isCube = 0; | ||||||
|  | 		swapchainData->textures[i].layerCount = 1; | ||||||
|  | 		swapchainData->textures[i].levelCount = 1; | ||||||
|  | 		swapchainData->textures[i].usageFlags = | ||||||
|  | 			VK_IMAGE_USAGE_TRANSFER_DST_BIT | | ||||||
|  | 			VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	SDL_stack_free(swapchainImages); | ||||||
|  | 
 | ||||||
| 	semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; | 	semaphoreCreateInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO; | ||||||
| 	semaphoreCreateInfo.pNext = NULL; | 	semaphoreCreateInfo.pNext = NULL; | ||||||
| 	semaphoreCreateInfo.flags = 0; | 	semaphoreCreateInfo.flags = 0; | ||||||
|  | @ -5890,7 +5874,6 @@ static VulkanTexture* VULKAN_INTERNAL_CreateTexture( | ||||||
| 	texture->levelCount = levelCount; | 	texture->levelCount = levelCount; | ||||||
| 	texture->layerCount = layerCount; | 	texture->layerCount = layerCount; | ||||||
| 	texture->resourceAccessType = RESOURCE_ACCESS_NONE; | 	texture->resourceAccessType = RESOURCE_ACCESS_NONE; | ||||||
| 	texture->queueFamilyIndex = renderer->queueFamilyIndices.graphicsFamily; |  | ||||||
| 	texture->usageFlags = imageUsageFlags; | 	texture->usageFlags = imageUsageFlags; | ||||||
| 
 | 
 | ||||||
| 	return texture; | 	return texture; | ||||||
|  | @ -6228,15 +6211,16 @@ static void VULKAN_SetTextureData( | ||||||
| 		dataLengthInBytes | 		dataLengthInBytes | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	/* TODO: is it worth it to only transition the specific subresource? */ | ||||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		RESOURCE_ACCESS_TRANSFER_WRITE, | 		RESOURCE_ACCESS_TRANSFER_WRITE, | ||||||
| 		VK_IMAGE_ASPECT_COLOR_BIT, | 		VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
| 		textureSlice->layer, | 		0, | ||||||
| 		1, | 		vulkanTexture->layerCount, | ||||||
| 		textureSlice->level, | 		0, | ||||||
| 		1, | 		vulkanTexture->levelCount, | ||||||
| 		0, | 		0, | ||||||
| 		vulkanTexture->image, | 		vulkanTexture->image, | ||||||
| 		&vulkanTexture->resourceAccessType | 		&vulkanTexture->resourceAccessType | ||||||
|  | @ -6269,15 +6253,16 @@ static void VULKAN_SetTextureData( | ||||||
| 
 | 
 | ||||||
| 	if (vulkanTexture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) | 	if (vulkanTexture->usageFlags & VK_IMAGE_USAGE_SAMPLED_BIT) | ||||||
| 	{ | 	{ | ||||||
|  | 		/* TODO: is it worth it to only transition the specific subresource? */ | ||||||
| 		VULKAN_INTERNAL_ImageMemoryBarrier( | 		VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
| 			renderer, | 			renderer, | ||||||
| 			vulkanCommandBuffer->commandBuffer, | 			vulkanCommandBuffer->commandBuffer, | ||||||
| 			RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE, | 			RESOURCE_ACCESS_ANY_SHADER_READ_SAMPLED_IMAGE, | ||||||
| 			VK_IMAGE_ASPECT_COLOR_BIT, | 			VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
| 			textureSlice->layer, | 			0, | ||||||
| 			1, | 			vulkanTexture->layerCount, | ||||||
| 			textureSlice->level, | 			0, | ||||||
| 			1, | 			vulkanTexture->levelCount, | ||||||
| 			0, | 			0, | ||||||
| 			vulkanTexture->image, | 			vulkanTexture->image, | ||||||
| 			&vulkanTexture->resourceAccessType | 			&vulkanTexture->resourceAccessType | ||||||
|  | @ -6476,36 +6461,30 @@ static void VULKAN_SetTextureDataYUV( | ||||||
| static void VULKAN_INTERNAL_BlitImage( | static void VULKAN_INTERNAL_BlitImage( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
| 	VkCommandBuffer commandBuffer, | 	VkCommandBuffer commandBuffer, | ||||||
| 	Refresh_Rect *sourceRectangle, | 	Refresh_TextureSlice *sourceTextureSlice, | ||||||
| 	uint32_t sourceDepth, | 	Refresh_TextureSlice *destinationTextureSlice, | ||||||
| 	uint32_t sourceLayer, | 	VulkanResourceAccessType newDestinationAccessType, | ||||||
| 	uint32_t sourceLevel, |  | ||||||
| 	VkImage sourceImage, |  | ||||||
| 	VulkanResourceAccessType *currentSourceAccessType, |  | ||||||
| 	VulkanResourceAccessType nextSourceAccessType, |  | ||||||
| 	Refresh_Rect *destinationRectangle, |  | ||||||
| 	uint32_t destinationDepth, |  | ||||||
| 	uint32_t destinationLayer, |  | ||||||
| 	uint32_t destinationLevel, |  | ||||||
| 	VkImage destinationImage, |  | ||||||
| 	VulkanResourceAccessType *currentDestinationAccessType, |  | ||||||
| 	VulkanResourceAccessType nextDestinationAccessType, |  | ||||||
| 	VkFilter filter | 	VkFilter filter | ||||||
| ) { | ) { | ||||||
| 	VkImageBlit blit; | 	VkImageBlit blit; | ||||||
|  | 	VulkanTexture *sourceTexture = (VulkanTexture*) sourceTextureSlice->texture; | ||||||
|  | 	VulkanTexture *destinationTexture = (VulkanTexture*) destinationTextureSlice->texture; | ||||||
| 
 | 
 | ||||||
|  | 	VulkanResourceAccessType originalSourceAccessType = sourceTexture->resourceAccessType; | ||||||
|  | 
 | ||||||
|  | 	/* TODO: is it worth it to only transition the specific subresource? */ | ||||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		commandBuffer, | 		commandBuffer, | ||||||
| 		RESOURCE_ACCESS_TRANSFER_READ, | 		RESOURCE_ACCESS_TRANSFER_READ, | ||||||
| 		VK_IMAGE_ASPECT_COLOR_BIT, | 		VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
| 		sourceLayer, |  | ||||||
| 		1, |  | ||||||
| 		sourceLevel, |  | ||||||
| 		1, |  | ||||||
| 		0, | 		0, | ||||||
| 		sourceImage, | 		sourceTexture->layerCount, | ||||||
| 		currentSourceAccessType | 		0, | ||||||
|  | 		sourceTexture->levelCount, | ||||||
|  | 		0, | ||||||
|  | 		sourceTexture->image, | ||||||
|  | 		&sourceTexture->resourceAccessType | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
|  | @ -6513,76 +6492,77 @@ static void VULKAN_INTERNAL_BlitImage( | ||||||
| 		commandBuffer, | 		commandBuffer, | ||||||
| 		RESOURCE_ACCESS_TRANSFER_WRITE, | 		RESOURCE_ACCESS_TRANSFER_WRITE, | ||||||
| 		VK_IMAGE_ASPECT_COLOR_BIT, | 		VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
| 		destinationLayer, |  | ||||||
| 		1, |  | ||||||
| 		destinationLevel, |  | ||||||
| 		1, |  | ||||||
| 		0, | 		0, | ||||||
| 		destinationImage, | 		destinationTexture->layerCount, | ||||||
| 		currentDestinationAccessType | 		0, | ||||||
|  | 		destinationTexture->levelCount, | ||||||
|  | 		0, | ||||||
|  | 		destinationTexture->image, | ||||||
|  | 		&destinationTexture->resourceAccessType | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	blit.srcOffsets[0].x = sourceRectangle->x; | 	blit.srcOffsets[0].x = sourceTextureSlice->rectangle.x; | ||||||
| 	blit.srcOffsets[0].y = sourceRectangle->y; | 	blit.srcOffsets[0].y = sourceTextureSlice->rectangle.y; | ||||||
| 	blit.srcOffsets[0].z = sourceDepth; | 	blit.srcOffsets[0].z = sourceTextureSlice->depth; | ||||||
| 	blit.srcOffsets[1].x = sourceRectangle->x + sourceRectangle->w; | 	blit.srcOffsets[1].x = sourceTextureSlice->rectangle.x + sourceTextureSlice->rectangle.w; | ||||||
| 	blit.srcOffsets[1].y = sourceRectangle->y + sourceRectangle->h; | 	blit.srcOffsets[1].y = sourceTextureSlice->rectangle.y + sourceTextureSlice->rectangle.h; | ||||||
| 	blit.srcOffsets[1].z = 1; | 	blit.srcOffsets[1].z = 1; | ||||||
| 
 | 
 | ||||||
| 	blit.srcSubresource.mipLevel = sourceLevel; | 	blit.srcSubresource.mipLevel = sourceTextureSlice->level; | ||||||
| 	blit.srcSubresource.baseArrayLayer = sourceLayer; | 	blit.srcSubresource.baseArrayLayer = sourceTextureSlice->layer; | ||||||
| 	blit.srcSubresource.layerCount = 1; | 	blit.srcSubresource.layerCount = 1; | ||||||
| 	blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | 	blit.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | ||||||
| 
 | 
 | ||||||
| 	blit.dstOffsets[0].x = destinationRectangle->x; | 	blit.dstOffsets[0].x = destinationTextureSlice->rectangle.x; | ||||||
| 	blit.dstOffsets[0].y = destinationRectangle->y; | 	blit.dstOffsets[0].y = destinationTextureSlice->rectangle.y; | ||||||
| 	blit.dstOffsets[0].z = destinationDepth; | 	blit.dstOffsets[0].z = destinationTextureSlice->depth; | ||||||
| 	blit.dstOffsets[1].x = destinationRectangle->x + destinationRectangle->w; | 	blit.dstOffsets[1].x = destinationTextureSlice->rectangle.x + destinationTextureSlice->rectangle.w; | ||||||
| 	blit.dstOffsets[1].y = destinationRectangle->y + destinationRectangle->h; | 	blit.dstOffsets[1].y = destinationTextureSlice->rectangle.y + destinationTextureSlice->rectangle.h; | ||||||
| 	blit.dstOffsets[1].z = 1; | 	blit.dstOffsets[1].z = 1; | ||||||
| 
 | 
 | ||||||
| 	blit.dstSubresource.mipLevel = destinationLevel; | 	blit.dstSubresource.mipLevel = sourceTextureSlice->level; | ||||||
| 	blit.dstSubresource.baseArrayLayer = destinationLayer; | 	blit.dstSubresource.baseArrayLayer = sourceTextureSlice->layer; | ||||||
| 	blit.dstSubresource.layerCount = 1; | 	blit.dstSubresource.layerCount = 1; | ||||||
| 	blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | 	blit.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; | ||||||
| 
 | 
 | ||||||
| 	renderer->vkCmdBlitImage( | 	renderer->vkCmdBlitImage( | ||||||
| 		commandBuffer, | 		commandBuffer, | ||||||
| 		sourceImage, | 		sourceTexture->image, | ||||||
| 		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | 		VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, | ||||||
| 		destinationImage, | 		destinationTexture->image, | ||||||
| 		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | 		VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, | ||||||
| 		1, | 		1, | ||||||
| 		&blit, | 		&blit, | ||||||
| 		filter | 		filter | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
|  | 	/* TODO: is it worth it to only transition the specific subresource? */ | ||||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		commandBuffer, | 		commandBuffer, | ||||||
| 		nextSourceAccessType, | 		originalSourceAccessType, | ||||||
| 		VK_IMAGE_ASPECT_COLOR_BIT, | 		VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
| 		sourceLayer, |  | ||||||
| 		1, |  | ||||||
| 		sourceLevel, |  | ||||||
| 		1, |  | ||||||
| 		0, | 		0, | ||||||
| 		sourceImage, | 		sourceTexture->layerCount, | ||||||
| 		currentSourceAccessType | 		0, | ||||||
|  | 		sourceTexture->levelCount, | ||||||
|  | 		0, | ||||||
|  | 		sourceTexture->image, | ||||||
|  | 		&sourceTexture->resourceAccessType | ||||||
| 	); | 	); | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_ImageMemoryBarrier( | 	VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		commandBuffer, | 		commandBuffer, | ||||||
| 		nextDestinationAccessType, | 		newDestinationAccessType, | ||||||
| 		VK_IMAGE_ASPECT_COLOR_BIT, | 		VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
| 		destinationLayer, |  | ||||||
| 		1, |  | ||||||
| 		destinationLevel, |  | ||||||
| 		1, |  | ||||||
| 		0, | 		0, | ||||||
| 		destinationImage, | 		destinationTexture->layerCount, | ||||||
| 		currentDestinationAccessType | 		0, | ||||||
|  | 		destinationTexture->levelCount, | ||||||
|  | 		0, | ||||||
|  | 		destinationTexture->image, | ||||||
|  | 		&destinationTexture->resourceAccessType | ||||||
| 	); | 	); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -6595,25 +6575,13 @@ REFRESHAPI void VULKAN_CopyTextureToTexture( | ||||||
| ) { | ) { | ||||||
| 	VulkanRenderer *renderer = (VulkanRenderer*)driverData; | 	VulkanRenderer *renderer = (VulkanRenderer*)driverData; | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 	VulkanTexture *sourceTexture = (VulkanTexture*) sourceTextureSlice->texture; |  | ||||||
| 	VulkanTexture *destinationTexture = (VulkanTexture*) destinationTextureSlice->texture; | 	VulkanTexture *destinationTexture = (VulkanTexture*) destinationTextureSlice->texture; | ||||||
| 
 | 
 | ||||||
| 	VULKAN_INTERNAL_BlitImage( | 	VULKAN_INTERNAL_BlitImage( | ||||||
| 		renderer, | 		renderer, | ||||||
| 		vulkanCommandBuffer->commandBuffer, | 		vulkanCommandBuffer->commandBuffer, | ||||||
| 		&sourceTextureSlice->rectangle, | 		sourceTextureSlice, | ||||||
| 		sourceTextureSlice->depth, | 		destinationTextureSlice, | ||||||
| 		sourceTextureSlice->layer, |  | ||||||
| 		sourceTextureSlice->level, |  | ||||||
| 		sourceTexture->image, |  | ||||||
| 		&sourceTexture->resourceAccessType, |  | ||||||
| 		sourceTexture->resourceAccessType, |  | ||||||
| 		&destinationTextureSlice->rectangle, |  | ||||||
| 		destinationTextureSlice->depth, |  | ||||||
| 		destinationTextureSlice->layer, |  | ||||||
| 		destinationTextureSlice->level, |  | ||||||
| 		destinationTexture->image, |  | ||||||
| 		&destinationTexture->resourceAccessType, |  | ||||||
| 		destinationTexture->resourceAccessType, | 		destinationTexture->resourceAccessType, | ||||||
| 		RefreshToVK_Filter[filter] | 		RefreshToVK_Filter[filter] | ||||||
| 	); | 	); | ||||||
|  | @ -8275,7 +8243,7 @@ static void VULKAN_QueuePresent( | ||||||
| 
 | 
 | ||||||
| 	VulkanRenderer* renderer = (VulkanRenderer*) driverData; | 	VulkanRenderer* renderer = (VulkanRenderer*) driverData; | ||||||
| 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | 	VulkanCommandBuffer *vulkanCommandBuffer = (VulkanCommandBuffer*) commandBuffer; | ||||||
| 	VulkanTexture* vulkanTexture = (VulkanTexture*) textureSlice->texture; | 	Refresh_TextureSlice destinationTextureSlice; | ||||||
| 	VulkanSwapchainData *swapchainData = NULL; | 	VulkanSwapchainData *swapchainData = NULL; | ||||||
| 	CreateSwapchainResult createSwapchainResult = 0; | 	CreateSwapchainResult createSwapchainResult = 0; | ||||||
| 	uint8_t validSwapchainExists = 1; | 	uint8_t validSwapchainExists = 1; | ||||||
|  | @ -8339,22 +8307,17 @@ static void VULKAN_QueuePresent( | ||||||
| 
 | 
 | ||||||
| 			/* Blit! */ | 			/* Blit! */ | ||||||
| 
 | 
 | ||||||
|  | 			destinationTextureSlice.depth = 0; | ||||||
|  | 			destinationTextureSlice.layer = 0; | ||||||
|  | 			destinationTextureSlice.level = 0; | ||||||
|  | 			destinationTextureSlice.rectangle = dstRect; | ||||||
|  | 			destinationTextureSlice.texture = (Refresh_Texture*) &swapchainData->textures[swapchainImageIndex]; | ||||||
|  | 
 | ||||||
| 			VULKAN_INTERNAL_BlitImage( | 			VULKAN_INTERNAL_BlitImage( | ||||||
| 				renderer, | 				renderer, | ||||||
| 				vulkanCommandBuffer->commandBuffer, | 				vulkanCommandBuffer->commandBuffer, | ||||||
| 				&textureSlice->rectangle, | 				textureSlice, | ||||||
| 				textureSlice->depth, | 				&destinationTextureSlice, | ||||||
| 				textureSlice->layer, |  | ||||||
| 				textureSlice->level, |  | ||||||
| 				vulkanTexture->image, |  | ||||||
| 				&vulkanTexture->resourceAccessType, |  | ||||||
| 				vulkanTexture->resourceAccessType, |  | ||||||
| 				&dstRect, |  | ||||||
| 				0, |  | ||||||
| 				0, |  | ||||||
| 				0, |  | ||||||
| 				swapchainData->images[swapchainImageIndex], |  | ||||||
| 				&swapchainData->resourceAccessTypes[swapchainImageIndex], |  | ||||||
| 				RESOURCE_ACCESS_PRESENT, | 				RESOURCE_ACCESS_PRESENT, | ||||||
| 				RefreshToVK_Filter[filter] | 				RefreshToVK_Filter[filter] | ||||||
| 			); | 			); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue