render target discards and block allocation
	
		
			
	
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
				
					
				
			
				
	
				continuous-integration/drone/push Build is passing
				
					Details
				
			
		
	
							parent
							
								
									d568810fa0
								
							
						
					
					
						commit
						8e04b0d1c9
					
				|  | @ -587,6 +587,7 @@ typedef struct Refresh_ColorAttachmentInfo | |||
| 	Refresh_Vec4 clearColor; /* Can be ignored by RenderPass */ | ||||
| 	Refresh_LoadOp loadOp; | ||||
| 	Refresh_StoreOp storeOp; | ||||
| 	uint8_t safeDiscard; /* ignored if loadOp is LOAD */ | ||||
| } Refresh_ColorAttachmentInfo; | ||||
| 
 | ||||
| typedef struct Refresh_DepthStencilAttachmentInfo | ||||
|  | @ -600,6 +601,7 @@ typedef struct Refresh_DepthStencilAttachmentInfo | |||
| 	Refresh_StoreOp storeOp; | ||||
| 	Refresh_LoadOp stencilLoadOp; | ||||
| 	Refresh_StoreOp stencilStoreOp; | ||||
| 	uint8_t safeDiscard; /* ignored if either loadOp or stencilLoadOp is LOAD*/ | ||||
| } Refresh_DepthStencilAttachmentInfo; | ||||
| 
 | ||||
| /* Functions */ | ||||
|  |  | |||
|  | @ -2846,7 +2846,6 @@ static uint8_t VULKAN_INTERNAL_BindResourceMemory( | |||
| static uint8_t VULKAN_INTERNAL_BindMemoryForImage( | ||||
| 	VulkanRenderer* renderer, | ||||
| 	VkImage image, | ||||
| 	uint8_t isRenderTarget, | ||||
| 	VulkanMemoryUsedRegion** usedRegion | ||||
| ) { | ||||
| 	uint8_t bindResult = 0; | ||||
|  | @ -2872,7 +2871,7 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForImage( | |||
| 			renderer, | ||||
| 			memoryTypeIndex, | ||||
| 			&memoryRequirements, | ||||
| 			isRenderTarget, | ||||
| 			0, | ||||
| 			memoryRequirements.memoryRequirements.size, | ||||
| 			VK_NULL_HANDLE, | ||||
| 			image, | ||||
|  | @ -2895,11 +2894,6 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForImage( | |||
| 		memoryTypeIndex = 0; | ||||
| 		requiredMemoryPropertyFlags = 0; | ||||
| 
 | ||||
| 		if (isRenderTarget) | ||||
| 		{ | ||||
| 			Refresh_LogWarn("RenderTarget is allocated in host memory, pre-allocate your targets!"); | ||||
| 		} | ||||
| 
 | ||||
| 		Refresh_LogWarn("Out of device-local memory, allocating textures on host-local memory!"); | ||||
| 
 | ||||
| 		while (VULKAN_INTERNAL_FindImageMemoryRequirements( | ||||
|  | @ -2913,7 +2907,7 @@ static uint8_t VULKAN_INTERNAL_BindMemoryForImage( | |||
| 				renderer, | ||||
| 				memoryTypeIndex, | ||||
| 				&memoryRequirements, | ||||
| 				isRenderTarget, | ||||
| 				0, | ||||
| 				memoryRequirements.memoryRequirements.size, | ||||
| 				VK_NULL_HANDLE, | ||||
| 				image, | ||||
|  | @ -5448,7 +5442,6 @@ static VulkanTexture* VULKAN_INTERNAL_CreateTexture( | |||
| 	bindResult = VULKAN_INTERNAL_BindMemoryForImage( | ||||
| 		renderer, | ||||
| 		texture->image, | ||||
| 		isRenderTarget, | ||||
| 		&texture->usedRegion | ||||
| 	); | ||||
| 
 | ||||
|  | @ -5601,6 +5594,53 @@ static VulkanTextureHandle* VULKAN_INTERNAL_CreateTextureHandle( | |||
| 	return textureHandle; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_INTERNAL_DiscardActiveTexture( | ||||
| 	VulkanRenderer *renderer, | ||||
| 	VulkanTextureContainer *textureContainer | ||||
| ) { | ||||
| 	VulkanTextureHandle *textureHandle; | ||||
| 	uint32_t i; | ||||
| 
 | ||||
| 	/* If a previously-discarded buffer is available, we can use that. */ | ||||
| 	for (i = 0; i < textureContainer->textureCount; i += 1) | ||||
| 	{ | ||||
| 		textureHandle = textureContainer->textureHandles[i]; | ||||
| 		if (SDL_AtomicGet(&textureHandle->vulkanTexture->referenceCount) == 0) | ||||
| 		{ | ||||
| 			textureContainer->activeTextureHandle = textureHandle; | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* No texture handle is available, generate a new one. */ | ||||
| 	textureContainer->activeTextureHandle = VULKAN_INTERNAL_CreateTextureHandle( | ||||
| 		renderer, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->dimensions.width, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->dimensions.height, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->depth, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->isCube, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->levelCount, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->sampleCount, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->format, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->aspectFlags, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->usageFlags, | ||||
| 		0 | ||||
| 	); | ||||
| 
 | ||||
| 	EXPAND_ARRAY_IF_NEEDED( | ||||
| 		textureContainer->textureHandles, | ||||
| 		VulkanTextureHandle*, | ||||
| 		textureContainer->textureCount + 1, | ||||
| 		textureContainer->textureCapacity, | ||||
| 		textureContainer->textureCapacity * 2 | ||||
| 	); | ||||
| 
 | ||||
| 	textureContainer->textureHandles[ | ||||
| 		textureContainer->textureCount | ||||
| 	] = textureContainer->activeTextureHandle; | ||||
| 	textureContainer->textureCount += 1; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_INTERNAL_CreateRenderTarget( | ||||
| 	VulkanRenderer *renderer, | ||||
| 	VulkanTexture *texture, | ||||
|  | @ -7773,6 +7813,7 @@ static void VULKAN_BeginRenderPass( | |||
| 	VkRenderPass renderPass; | ||||
| 	VulkanFramebuffer *framebuffer; | ||||
| 
 | ||||
| 	VulkanTextureContainer *textureContainer; | ||||
| 	VulkanTexture *texture; | ||||
| 	VulkanTexture *msaaTexture = NULL; | ||||
| 	uint32_t w, h; | ||||
|  | @ -7787,14 +7828,29 @@ static void VULKAN_BeginRenderPass( | |||
| 	uint32_t framebufferWidth = UINT32_MAX; | ||||
| 	uint32_t framebufferHeight = UINT32_MAX; | ||||
| 
 | ||||
| 	/* The framebuffer cannot be larger than the smallest attachment. */ | ||||
| 
 | ||||
| 	for (i = 0; i < colorAttachmentCount; i += 1) | ||||
| 	{ | ||||
| 		texture = ((VulkanTextureContainer*) colorAttachmentInfos[i].texture)->activeTextureHandle->vulkanTexture; | ||||
| 		textureContainer = (VulkanTextureContainer*) colorAttachmentInfos[i].texture; | ||||
| 
 | ||||
| 		if ( | ||||
| 			colorAttachmentInfos[i].safeDiscard && | ||||
| 			colorAttachmentInfos[i].loadOp != REFRESH_LOADOP_LOAD && | ||||
| 			textureContainer->canBeDiscarded && | ||||
| 			SDL_AtomicGet(&textureContainer->activeTextureHandle->vulkanTexture->referenceCount) > 0 | ||||
| 		) { | ||||
| 			VULKAN_INTERNAL_DiscardActiveTexture( | ||||
| 				renderer, | ||||
| 				textureContainer | ||||
| 			); | ||||
| 		} | ||||
| 
 | ||||
| 		texture = textureContainer->activeTextureHandle->vulkanTexture; | ||||
| 
 | ||||
| 		w = texture->dimensions.width >> colorAttachmentInfos[i].level; | ||||
| 		h = texture->dimensions.height >> colorAttachmentInfos[i].level; | ||||
| 
 | ||||
| 		/* The framebuffer cannot be larger than the smallest attachment. */ | ||||
| 
 | ||||
| 		if (w < framebufferWidth) | ||||
| 		{ | ||||
| 			framebufferWidth = w; | ||||
|  | @ -7814,10 +7870,28 @@ static void VULKAN_BeginRenderPass( | |||
| 
 | ||||
| 	if (depthStencilAttachmentInfo != NULL) | ||||
| 	{ | ||||
| 		texture = ((VulkanTextureContainer*) depthStencilAttachmentInfo->texture)->activeTextureHandle->vulkanTexture; | ||||
| 		textureContainer = (VulkanTextureContainer*) depthStencilAttachmentInfo->texture; | ||||
| 
 | ||||
| 		if ( | ||||
| 			depthStencilAttachmentInfo->safeDiscard && | ||||
| 			depthStencilAttachmentInfo->loadOp != REFRESH_LOADOP_LOAD && | ||||
| 			depthStencilAttachmentInfo->stencilLoadOp != REFRESH_LOADOP_LOAD && | ||||
| 			textureContainer->canBeDiscarded && | ||||
| 			SDL_AtomicGet(&textureContainer->activeTextureHandle->vulkanTexture->referenceCount) > 0 | ||||
| 		) { | ||||
| 			VULKAN_INTERNAL_DiscardActiveTexture( | ||||
| 				renderer, | ||||
| 				textureContainer | ||||
| 			); | ||||
| 		} | ||||
| 
 | ||||
| 		texture = textureContainer->activeTextureHandle->vulkanTexture; | ||||
| 
 | ||||
| 		w = texture->dimensions.width >> depthStencilAttachmentInfo->level; | ||||
| 		h = texture->dimensions.height >> depthStencilAttachmentInfo->level; | ||||
| 
 | ||||
| 		/* The framebuffer cannot be larger than the smallest attachment. */ | ||||
| 
 | ||||
| 		if (w < framebufferWidth) | ||||
| 		{ | ||||
| 			framebufferWidth = w; | ||||
|  | @ -8493,53 +8567,6 @@ static void VULKAN_INTERNAL_DiscardActiveBuffer( | |||
| 	bufferContainer->bufferCount += 1; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_INTERNAL_DiscardActiveTexture( | ||||
| 	VulkanRenderer *renderer, | ||||
| 	VulkanTextureContainer *textureContainer | ||||
| ) { | ||||
| 	VulkanTextureHandle *textureHandle; | ||||
| 	uint32_t i; | ||||
| 
 | ||||
| 	/* If a previously-discarded buffer is available, we can use that. */ | ||||
| 	for (i = 0; i < textureContainer->textureCount; i += 1) | ||||
| 	{ | ||||
| 		textureHandle = textureContainer->textureHandles[i]; | ||||
| 		if (SDL_AtomicGet(&textureHandle->vulkanTexture->referenceCount) == 0) | ||||
| 		{ | ||||
| 			textureContainer->activeTextureHandle = textureHandle; | ||||
| 			return; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	/* No texture handle is available, generate a new one. */ | ||||
| 	textureContainer->activeTextureHandle = VULKAN_INTERNAL_CreateTextureHandle( | ||||
| 		renderer, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->dimensions.width, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->dimensions.height, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->depth, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->isCube, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->levelCount, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->sampleCount, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->format, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->aspectFlags, | ||||
| 		textureContainer->activeTextureHandle->vulkanTexture->usageFlags, | ||||
| 		0 | ||||
| 	); | ||||
| 
 | ||||
| 	EXPAND_ARRAY_IF_NEEDED( | ||||
| 		textureContainer->textureHandles, | ||||
| 		VulkanTextureHandle*, | ||||
| 		textureContainer->textureCount + 1, | ||||
| 		textureContainer->textureCapacity, | ||||
| 		textureContainer->textureCapacity * 2 | ||||
| 	); | ||||
| 
 | ||||
| 	textureContainer->textureHandles[ | ||||
| 		textureContainer->textureCount | ||||
| 	] = textureContainer->activeTextureHandle; | ||||
| 	textureContainer->textureCount += 1; | ||||
| } | ||||
| 
 | ||||
| static void VULKAN_SetTransferData( | ||||
| 	Refresh_Renderer *driverData, | ||||
| 	void* data, | ||||
|  | @ -8550,8 +8577,10 @@ static void VULKAN_SetTransferData( | |||
| 	VulkanRenderer *renderer = (VulkanRenderer*) driverData; | ||||
| 	VulkanBufferContainer *transferBufferContainer = (VulkanBufferContainer*) transferBuffer; | ||||
| 
 | ||||
| 	if (option == REFRESH_TRANSFEROPTIONS_SAFEDISCARD && SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_TRANSFEROPTIONS_SAFEDISCARD && | ||||
| 		SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveBuffer( | ||||
| 			renderer, | ||||
| 			transferBufferContainer | ||||
|  | @ -8617,8 +8646,11 @@ static void VULKAN_UploadToTexture( | |||
| 	VulkanTextureContainer *vulkanTextureContainer = (VulkanTextureContainer*) textureSlice->texture; | ||||
| 	VkBufferImageCopy imageCopy; | ||||
| 
 | ||||
| 	if (option == REFRESH_COPYOPTIONS_SAFEDISCARD && vulkanTextureContainer->canBeDiscarded && SDL_AtomicGet(&vulkanTextureContainer->activeTextureHandle->vulkanTexture->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_COPYOPTIONS_SAFEDISCARD && | ||||
| 		vulkanTextureContainer->canBeDiscarded && | ||||
| 		SDL_AtomicGet(&vulkanTextureContainer->activeTextureHandle->vulkanTexture->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveTexture( | ||||
| 			renderer, | ||||
| 			vulkanTextureContainer | ||||
|  | @ -8688,8 +8720,10 @@ static void VULKAN_UploadToBuffer( | |||
| 	VulkanBufferContainer *gpuBufferContainer = (VulkanBufferContainer*) gpuBuffer; | ||||
| 	VkBufferCopy bufferCopy; | ||||
| 
 | ||||
| 	if (option == REFRESH_COPYOPTIONS_SAFEDISCARD && SDL_AtomicGet(&gpuBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_COPYOPTIONS_SAFEDISCARD && | ||||
| 		SDL_AtomicGet(&gpuBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveBuffer( | ||||
| 			renderer, | ||||
| 			gpuBufferContainer | ||||
|  | @ -8741,8 +8775,10 @@ static void VULKAN_DownloadFromTexture( | |||
| 	VulkanBufferContainer *transferBufferContainer = (VulkanBufferContainer*) transferBuffer; | ||||
| 	VkBufferImageCopy imageCopy; | ||||
| 
 | ||||
| 	if (option == REFRESH_TRANSFEROPTIONS_SAFEDISCARD && SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_TRANSFEROPTIONS_SAFEDISCARD && | ||||
| 		SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveBuffer( | ||||
| 			renderer, | ||||
| 			transferBufferContainer | ||||
|  | @ -8812,8 +8848,10 @@ static void VULKAN_DownloadFromBuffer( | |||
| 	VulkanBufferContainer *transferBufferContainer = (VulkanBufferContainer*) transferBuffer; | ||||
| 	VkBufferCopy bufferCopy; | ||||
| 
 | ||||
| 	if (option == REFRESH_TRANSFEROPTIONS_SAFEDISCARD && SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_TRANSFEROPTIONS_SAFEDISCARD && | ||||
| 		SDL_AtomicGet(&transferBufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveBuffer( | ||||
| 			renderer, | ||||
| 			transferBufferContainer | ||||
|  | @ -8864,8 +8902,11 @@ static void VULKAN_CopyTextureToTexture( | |||
| 	VulkanTextureContainer *dstContainer = (VulkanTextureContainer*) destination->texture; | ||||
| 	VkImageCopy imageCopy; | ||||
| 
 | ||||
| 	if (option == REFRESH_COPYOPTIONS_SAFEDISCARD && dstContainer->canBeDiscarded && SDL_AtomicGet(&dstContainer->activeTextureHandle->vulkanTexture->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_COPYOPTIONS_SAFEDISCARD && | ||||
| 		dstContainer->canBeDiscarded && | ||||
| 		SDL_AtomicGet(&dstContainer->activeTextureHandle->vulkanTexture->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveTexture( | ||||
| 			renderer, | ||||
| 			dstContainer | ||||
|  | @ -8948,8 +8989,10 @@ static void VULKAN_CopyTextureToBuffer( | |||
| 	VulkanBufferContainer *bufferContainer = (VulkanBufferContainer*) gpuBuffer; | ||||
| 	VkBufferImageCopy imageCopy; | ||||
| 
 | ||||
| 	if (option == REFRESH_COPYOPTIONS_SAFEDISCARD && SDL_AtomicGet(&bufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_COPYOPTIONS_SAFEDISCARD && | ||||
| 		SDL_AtomicGet(&bufferContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveBuffer( | ||||
| 			renderer, | ||||
| 			bufferContainer | ||||
|  | @ -9020,8 +9063,10 @@ static void VULKAN_CopyBufferToTexture( | |||
| 	VulkanTextureContainer *textureContainer = (VulkanTextureContainer*) textureSlice->texture; | ||||
| 	VkBufferImageCopy imageCopy; | ||||
| 
 | ||||
| 	if (option == REFRESH_COPYOPTIONS_SAFEDISCARD && textureContainer->canBeDiscarded && SDL_AtomicGet(&textureContainer->activeTextureHandle->vulkanTexture->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_COPYOPTIONS_SAFEDISCARD && | ||||
| 		textureContainer->canBeDiscarded && SDL_AtomicGet(&textureContainer->activeTextureHandle->vulkanTexture->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveTexture( | ||||
| 			renderer, | ||||
| 			textureContainer | ||||
|  | @ -9092,8 +9137,10 @@ static void VULKAN_CopyBufferToBuffer( | |||
| 	VulkanBufferContainer *dstContainer = (VulkanBufferContainer*) destination; | ||||
| 	VkBufferCopy bufferCopy; | ||||
| 
 | ||||
| 	if (option == REFRESH_COPYOPTIONS_SAFEDISCARD && SDL_AtomicGet(&dstContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0) | ||||
| 	{ | ||||
| 	if ( | ||||
| 		option == REFRESH_COPYOPTIONS_SAFEDISCARD && | ||||
| 		SDL_AtomicGet(&dstContainer->activeBufferHandle->vulkanBuffer->referenceCount) > 0 | ||||
| 	) { | ||||
| 		VULKAN_INTERNAL_DiscardActiveBuffer( | ||||
| 			renderer, | ||||
| 			dstContainer | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue