From 006178165c72d08424952c6e7364d2a0bebddc5c Mon Sep 17 00:00:00 2001 From: Iago Toral Quiroga Date: Tue, 28 Jul 2020 10:33:17 +0200 Subject: [PATCH] v3dv: handle multisampled image copies in the TLB path vkCmdCopyImage can be used to copy multisampled images. We can easily support that on the TLB path, which copies full images. For partial copies we will need to amend our blit shader path to support multisampling resolve. Fixes: dEQP-VK.api.copy_and_blit.core.resolve_image.whole_copy_before_resolving.4_bit Part-of: --- src/broadcom/vulkan/v3dv_meta_copy.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c index ac93cbc9a05..2e6dafa42a1 100644 --- a/src/broadcom/vulkan/v3dv_meta_copy.c +++ b/src/broadcom/vulkan/v3dv_meta_copy.c @@ -1051,6 +1051,8 @@ v3dv_CmdCopyImageToBuffer(VkCommandBuffer commandBuffer, V3DV_FROM_HANDLE(v3dv_image, image, srcImage); V3DV_FROM_HANDLE(v3dv_buffer, buffer, destBuffer); + assert(image->samples == VK_SAMPLE_COUNT_1_BIT); + for (uint32_t i = 0; i < regionCount; i++) { if (copy_image_to_buffer_tlb(cmd_buffer, buffer, image, &pRegions[i])) continue; @@ -1188,7 +1190,8 @@ copy_image_tlb(struct v3dv_cmd_buffer *cmd_buffer, const uint32_t width = DIV_ROUND_UP(region->extent.width, block_w); const uint32_t height = DIV_ROUND_UP(region->extent.height, block_h); - v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp, false); + v3dv_job_start_frame(job, width, height, num_layers, 1, internal_bpp, + src->samples > VK_SAMPLE_COUNT_1_BIT); struct framebuffer_data framebuffer; setup_framebuffer_data(&framebuffer, fb_format, internal_type, @@ -1332,6 +1335,8 @@ v3dv_CmdCopyImage(VkCommandBuffer commandBuffer, V3DV_FROM_HANDLE(v3dv_image, src, srcImage); V3DV_FROM_HANDLE(v3dv_image, dst, dstImage); + assert(src->samples == dst->samples); + for (uint32_t i = 0; i < regionCount; i++) { if (copy_image_tlb(cmd_buffer, dst, src, &pRegions[i])) continue; @@ -2636,6 +2641,8 @@ v3dv_CmdCopyBufferToImage(VkCommandBuffer commandBuffer, V3DV_FROM_HANDLE(v3dv_buffer, buffer, srcBuffer); V3DV_FROM_HANDLE(v3dv_image, image, dstImage); + assert(image->samples == VK_SAMPLE_COUNT_1_BIT); + for (uint32_t i = 0; i < regionCount; i++) { if (copy_buffer_to_image_tfu(cmd_buffer, image, buffer, &pRegions[i])) continue;