radv: cleanup the compute resolve path for subpass
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 27 May 2019 15:42:35 +0000 (17:42 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Tue, 28 May 2019 06:17:23 +0000 (08:17 +0200)
This makes use of radv_meta_resolve_compute_image() by filling
a VkImageResolve region instead of duplicating code.

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

index 1b786526cf25972318ee7a0090b11aad98171d79..76612672b1c688473b985329f818ababf10d2b98 100644 (file)
@@ -489,7 +489,6 @@ radv_cmd_buffer_resolve_subpass_cs(struct radv_cmd_buffer *cmd_buffer)
 {
        struct radv_framebuffer *fb = cmd_buffer->state.framebuffer;
        const struct radv_subpass *subpass = cmd_buffer->state.subpass;
-       struct radv_meta_saved_state saved_state;
        struct radv_subpass_barrier barrier;
 
        /* Resolves happen before the end-of-subpass barriers get executed, so
@@ -500,67 +499,41 @@ radv_cmd_buffer_resolve_subpass_cs(struct radv_cmd_buffer *cmd_buffer)
        barrier.dst_access_mask = VK_ACCESS_INPUT_ATTACHMENT_READ_BIT;
        radv_subpass_barrier(cmd_buffer, &barrier);
 
-       radv_decompress_resolve_subpass_src(cmd_buffer);
-
-       radv_meta_save(&saved_state, cmd_buffer,
-                      RADV_META_SAVE_COMPUTE_PIPELINE |
-                      RADV_META_SAVE_CONSTANTS |
-                      RADV_META_SAVE_DESCRIPTORS);
-
        for (uint32_t i = 0; i < subpass->color_count; ++i) {
                struct radv_subpass_attachment src_att = subpass->color_attachments[i];
-               struct radv_subpass_attachment dest_att = subpass->resolve_attachments[i];
-               struct radv_image_view *src_iview = cmd_buffer->state.framebuffer->attachments[src_att.attachment].attachment;
-               struct radv_image_view *dst_iview = cmd_buffer->state.framebuffer->attachments[dest_att.attachment].attachment;
-               if (dest_att.attachment == VK_ATTACHMENT_UNUSED)
-                       continue;
-
-               struct radv_image *src_image = src_iview->image;
-               struct radv_image *dst_image = dst_iview->image;
-               for (uint32_t layer = 0; layer < src_image->info.array_size; layer++) {
+               struct radv_subpass_attachment dst_att = subpass->resolve_attachments[i];
+               struct radv_image_view *src_iview = fb->attachments[src_att.attachment].attachment;
+               struct radv_image_view *dst_iview = fb->attachments[dst_att.attachment].attachment;
 
-                       struct radv_image_view tsrc_iview;
-                       radv_image_view_init(&tsrc_iview, cmd_buffer->device,
-                                            &(VkImageViewCreateInfo) {
-                                                    .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
-                                                            .image = radv_image_to_handle(src_image),
-                                                            .viewType = radv_meta_get_view_type(src_image),
-                                                            .format = src_image->vk_format,
-                                                            .subresourceRange = {
-                                                            .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
-                                                            .baseMipLevel = src_iview->base_mip,
-                                                            .levelCount = 1,
-                                                            .baseArrayLayer = layer,
-                                                            .layerCount = 1,
-                                                    },
-                                            });
+               if (dst_att.attachment == VK_ATTACHMENT_UNUSED)
+                       continue;
 
-                       struct radv_image_view tdst_iview;
-                       radv_image_view_init(&tdst_iview, cmd_buffer->device,
-                                            &(VkImageViewCreateInfo) {
-                                                    .sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
-                                                            .image = radv_image_to_handle(dst_image),
-                                                            .viewType = radv_meta_get_view_type(dst_image),
-                                                            .format = vk_to_non_srgb_format(dst_image->vk_format),
-                                                            .subresourceRange = {
-                                                            .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
-                                                            .baseMipLevel = dst_iview->base_mip,
-                                                            .levelCount = 1,
-                                                            .baseArrayLayer = layer,
-                                                            .layerCount = 1,
-                                                    },
-                                            });
-                       emit_resolve(cmd_buffer,
-                                    &tsrc_iview,
-                                    &tdst_iview,
-                                    &(VkOffset2D) { 0, 0 },
-                                    &(VkOffset2D) { 0, 0 },
-                                    &(VkExtent2D) { fb->width, fb->height });
-               }
+               VkImageResolve region = {
+                       .extent = (VkExtent3D){ fb->width, fb->height, 0 },
+                       .srcSubresource = (VkImageSubresourceLayers) {
+                               .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                               .mipLevel = src_iview->base_mip,
+                               .baseArrayLayer = 0,
+                               .layerCount = src_iview->image->info.array_size
+                       },
+                       .dstSubresource = (VkImageSubresourceLayers) {
+                               .aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
+                               .mipLevel = dst_iview->base_mip,
+                               .baseArrayLayer = 0,
+                               .layerCount = dst_iview->image->info.array_size
+                       },
+                       .srcOffset = (VkOffset3D){ 0, 0, 0 },
+                       .dstOffset = (VkOffset3D){ 0, 0, 0 },
+               };
+
+               radv_meta_resolve_compute_image(cmd_buffer,
+                                               src_iview->image,
+                                               src_att.layout,
+                                               dst_iview->image,
+                                               dst_att.layout,
+                                               1, &region);
        }
 
        cmd_buffer->state.flush_bits |= RADV_CMD_FLAG_CS_PARTIAL_FLUSH |
                                        RADV_CMD_FLAG_INV_VMEM_L1;
-
-       radv_meta_restore(&saved_state, cmd_buffer);
 }