radv: do not decompress all image layers before resolving inside a subpass
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 10 Jun 2019 15:45:32 +0000 (17:45 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 11 Jun 2019 06:06:39 +0000 (08:06 +0200)
When decompressing resolve source images, we should rely on the
framebuffer layer count instead of resolving all images layers.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-By: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/vulkan/radv_meta_resolve.c

index 0a7affb..f1fa05c 100644 (file)
@@ -707,6 +707,10 @@ radv_decompress_resolve_subpass_src(struct radv_cmd_buffer *cmd_buffer)
 {
        const struct radv_subpass *subpass = cmd_buffer->state.subpass;
        struct radv_framebuffer *fb = cmd_buffer->state.framebuffer;
+       uint32_t layer_count = fb->layers;
+
+       if (subpass->view_mask)
+               layer_count = util_last_bit(subpass->view_mask);
 
        for (uint32_t i = 0; i < subpass->color_count; ++i) {
                struct radv_subpass_attachment src_att = subpass->color_attachments[i];
@@ -715,14 +719,16 @@ radv_decompress_resolve_subpass_src(struct radv_cmd_buffer *cmd_buffer)
                if (dest_att.attachment == VK_ATTACHMENT_UNUSED)
                        continue;
 
-               struct radv_image *src_image =
-                       fb->attachments[src_att.attachment].attachment->image;
+               struct radv_image_view *src_iview =
+                       fb->attachments[src_att.attachment].attachment;
+               struct radv_image *src_image = src_iview->image;
 
                VkImageResolve region = {};
                region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
                region.srcSubresource.baseArrayLayer = 0;
                region.srcSubresource.mipLevel = 0;
-               region.srcSubresource.layerCount = src_image->info.array_size;
+               region.srcSubresource.baseArrayLayer = src_iview->base_layer;
+               region.srcSubresource.layerCount = layer_count;
 
                radv_decompress_resolve_src(cmd_buffer, src_image,
                                            src_att.layout, 1, &region);