- Fixed bug where multisample enum values were not being translated into their equivalent Vulkan enums - Fixed bug where MSAA attachments in transient render pass creation were using a sample count of 1 - Fixed bug where the clearValues array in BeginRenderPass was not being populated with clear values for multisample attachments. (Modeled the fix after https://github.com/FNA-XNA/FNA3D/blob/master/src/FNA3D_Driver_Vulkan.c#L8723) - Fixed bug where the multisample texture was not being transitioned when beginning a render pass Reviewed-on: #25 Co-authored-by: TheSpydog <thespydog@noreply.example.org> Co-committed-by: TheSpydog <thespydog@noreply.example.org>pull/26/head
							parent
							
								
									c4b9798fc1
								
							
						
					
					
						commit
						5f05ef02a0
					
				|  | @ -5446,7 +5446,7 @@ static VulkanRenderTarget* VULKAN_INTERNAL_CreateRenderTarget( | ||||||
| 				VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | 				VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | ||||||
| 			); | 			); | ||||||
| 
 | 
 | ||||||
| 		renderTarget->multisampleCount = multisampleCount; | 		renderTarget->multisampleCount = RefreshToVK_SampleCount[multisampleCount]; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* create framebuffer compatible views for RenderTarget */ | 	/* create framebuffer compatible views for RenderTarget */ | ||||||
|  | @ -5540,6 +5540,7 @@ static VulkanRenderTarget* VULKAN_INTERNAL_FetchRenderTarget( | ||||||
| 
 | 
 | ||||||
| static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
|  | 	VulkanCommandBuffer *commandBuffer, | ||||||
| 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | ||||||
| 	uint32_t colorAttachmentCount, | 	uint32_t colorAttachmentCount, | ||||||
| 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | ||||||
|  | @ -5575,6 +5576,23 @@ static VkRenderPass VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 			colorAttachmentInfos[i].sampleCount | 			colorAttachmentInfos[i].sampleCount | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
|  | 		if (renderTarget->multisampleTexture != NULL) | ||||||
|  | 		{ | ||||||
|  | 			VULKAN_INTERNAL_ImageMemoryBarrier( | ||||||
|  | 				renderer, | ||||||
|  | 				commandBuffer->commandBuffer, | ||||||
|  | 				RESOURCE_ACCESS_COLOR_ATTACHMENT_WRITE, | ||||||
|  | 				VK_IMAGE_ASPECT_COLOR_BIT, | ||||||
|  | 				0, | ||||||
|  | 				renderTarget->multisampleTexture->layerCount, | ||||||
|  | 				0, | ||||||
|  | 				renderTarget->multisampleTexture->levelCount, | ||||||
|  | 				0, | ||||||
|  | 				renderTarget->multisampleTexture->image, | ||||||
|  | 				&renderTarget->multisampleTexture->resourceAccessType | ||||||
|  | 			); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		if (renderTarget->multisampleCount > VK_SAMPLE_COUNT_1_BIT) | 		if (renderTarget->multisampleCount > VK_SAMPLE_COUNT_1_BIT) | ||||||
| 		{ | 		{ | ||||||
| 			multisampling = 1; | 			multisampling = 1; | ||||||
|  | @ -5810,7 +5828,9 @@ static VkRenderPass VULKAN_INTERNAL_CreateTransientRenderPass( | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].format = RefreshToVK_SurfaceFormat[ | 			attachmentDescriptions[attachmentDescriptionCount].format = RefreshToVK_SurfaceFormat[ | ||||||
| 				attachmentDescription.format | 				attachmentDescription.format | ||||||
| 			]; | 			]; | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].samples = VK_SAMPLE_COUNT_1_BIT; | 			attachmentDescriptions[attachmentDescriptionCount].samples = RefreshToVK_SampleCount[ | ||||||
|  | 				attachmentDescription.sampleCount | ||||||
|  | 			]; | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; | 			attachmentDescriptions[attachmentDescriptionCount].loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; | 			attachmentDescriptions[attachmentDescriptionCount].storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; | ||||||
| 			attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; | 			attachmentDescriptions[attachmentDescriptionCount].stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; | ||||||
|  | @ -7980,6 +8000,7 @@ static void VULKAN_QueueDestroyGraphicsPipeline( | ||||||
| 
 | 
 | ||||||
| static VkRenderPass VULKAN_INTERNAL_FetchRenderPass( | static VkRenderPass VULKAN_INTERNAL_FetchRenderPass( | ||||||
| 	VulkanRenderer *renderer, | 	VulkanRenderer *renderer, | ||||||
|  | 	VulkanCommandBuffer *commandBuffer, | ||||||
| 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | 	Refresh_ColorAttachmentInfo *colorAttachmentInfos, | ||||||
| 	uint32_t colorAttachmentCount, | 	uint32_t colorAttachmentCount, | ||||||
| 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | 	Refresh_DepthStencilAttachmentInfo *depthStencilAttachmentInfo | ||||||
|  | @ -8030,6 +8051,7 @@ static VkRenderPass VULKAN_INTERNAL_FetchRenderPass( | ||||||
| 
 | 
 | ||||||
| 	renderPass = VULKAN_INTERNAL_CreateRenderPass( | 	renderPass = VULKAN_INTERNAL_CreateRenderPass( | ||||||
| 		renderer, | 		renderer, | ||||||
|  | 		commandBuffer, | ||||||
| 		colorAttachmentInfos, | 		colorAttachmentInfos, | ||||||
| 		colorAttachmentCount, | 		colorAttachmentCount, | ||||||
| 		depthStencilAttachmentInfo | 		depthStencilAttachmentInfo | ||||||
|  | @ -8307,6 +8329,7 @@ static void VULKAN_BeginRenderPass( | ||||||
| 	VulkanTexture *texture; | 	VulkanTexture *texture; | ||||||
| 	VkClearValue *clearValues; | 	VkClearValue *clearValues; | ||||||
| 	uint32_t clearCount = colorAttachmentCount; | 	uint32_t clearCount = colorAttachmentCount; | ||||||
|  | 	uint32_t multisampleAttachmentCount = 0; | ||||||
| 	uint32_t i; | 	uint32_t i; | ||||||
| 	VkImageAspectFlags depthAspectFlags; | 	VkImageAspectFlags depthAspectFlags; | ||||||
| 	Refresh_Viewport defaultViewport; | 	Refresh_Viewport defaultViewport; | ||||||
|  | @ -8356,6 +8379,7 @@ static void VULKAN_BeginRenderPass( | ||||||
| 
 | 
 | ||||||
| 	renderPass = VULKAN_INTERNAL_FetchRenderPass( | 	renderPass = VULKAN_INTERNAL_FetchRenderPass( | ||||||
| 		renderer, | 		renderer, | ||||||
|  | 		vulkanCommandBuffer, | ||||||
| 		colorAttachmentInfos, | 		colorAttachmentInfos, | ||||||
| 		colorAttachmentCount, | 		colorAttachmentCount, | ||||||
| 		depthStencilAttachmentInfo | 		depthStencilAttachmentInfo | ||||||
|  | @ -8393,6 +8417,12 @@ static void VULKAN_BeginRenderPass( | ||||||
| 			&texture->resourceAccessType | 			&texture->resourceAccessType | ||||||
| 		); | 		); | ||||||
| 
 | 
 | ||||||
|  | 		if (colorAttachmentInfos[i].sampleCount > 1) | ||||||
|  | 		{ | ||||||
|  | 			clearCount += 1; | ||||||
|  | 			multisampleAttachmentCount += 1; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, texture); | 		VULKAN_INTERNAL_TrackTexture(renderer, vulkanCommandBuffer, texture); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -8430,12 +8460,21 @@ static void VULKAN_BeginRenderPass( | ||||||
| 
 | 
 | ||||||
| 	clearValues = SDL_stack_alloc(VkClearValue, clearCount); | 	clearValues = SDL_stack_alloc(VkClearValue, clearCount); | ||||||
| 
 | 
 | ||||||
| 	for (i = 0; i < colorAttachmentCount; i += 1) | 	for (i = 0; i < colorAttachmentCount + multisampleAttachmentCount; i += 1) | ||||||
| 	{ | 	{ | ||||||
| 		clearValues[i].color.float32[0] = colorAttachmentInfos[i].clearColor.x; | 		clearValues[i].color.float32[0] = colorAttachmentInfos[i].clearColor.x; | ||||||
| 		clearValues[i].color.float32[1] = colorAttachmentInfos[i].clearColor.y; | 		clearValues[i].color.float32[1] = colorAttachmentInfos[i].clearColor.y; | ||||||
| 		clearValues[i].color.float32[2] = colorAttachmentInfos[i].clearColor.z; | 		clearValues[i].color.float32[2] = colorAttachmentInfos[i].clearColor.z; | ||||||
| 		clearValues[i].color.float32[3] = colorAttachmentInfos[i].clearColor.w; | 		clearValues[i].color.float32[3] = colorAttachmentInfos[i].clearColor.w; | ||||||
|  | 
 | ||||||
|  | 		if (colorAttachmentInfos[i].sampleCount > 0) | ||||||
|  | 		{ | ||||||
|  | 			i += 1; | ||||||
|  | 			clearValues[i].color.float32[0] = colorAttachmentInfos[i].clearColor.x; | ||||||
|  | 			clearValues[i].color.float32[1] = colorAttachmentInfos[i].clearColor.y; | ||||||
|  | 			clearValues[i].color.float32[2] = colorAttachmentInfos[i].clearColor.z; | ||||||
|  | 			clearValues[i].color.float32[3] = colorAttachmentInfos[i].clearColor.w; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if (depthStencilAttachmentInfo != NULL) | 	if (depthStencilAttachmentInfo != NULL) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue