It makes sense to use the image view formats when resolving
inside subpasses, while we have to use the image formats for
normal resolves.

Original patch by Philip Rebohle.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=110348
Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
 src/amd/vulkan/radv_meta.h            | 2 ++
 src/amd/vulkan/radv_meta_resolve.c    | 9 ++++++---
 src/amd/vulkan/radv_meta_resolve_cs.c | 8 ++++++--
 3 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/src/amd/vulkan/radv_meta.h b/src/amd/vulkan/radv_meta.h
index 0bd75d6c207..4a7c37be9b3 100644
--- a/src/amd/vulkan/radv_meta.h
+++ b/src/amd/vulkan/radv_meta.h
@@ -183,8 +183,10 @@ void radv_expand_fmask_image_inplace(struct 
radv_cmd_buffer *cmd_buffer,
 
 void radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer,
                                     struct radv_image *src_image,
+                                    VkFormat src_format,
                                     VkImageLayout src_image_layout,
                                     struct radv_image *dest_image,
+                                    VkFormat dest_format,
                                     VkImageLayout dest_image_layout,
                                     uint32_t region_count,
                                     const VkImageResolve *regions);
diff --git a/src/amd/vulkan/radv_meta_resolve.c 
b/src/amd/vulkan/radv_meta_resolve.c
index 1544513a9bc..b4551a98637 100644
--- a/src/amd/vulkan/radv_meta_resolve.c
+++ b/src/amd/vulkan/radv_meta_resolve.c
@@ -439,8 +439,10 @@ void radv_CmdResolveImage(
        if (resolve_method == RESOLVE_COMPUTE) {
                radv_meta_resolve_compute_image(cmd_buffer,
                                                src_image,
+                                               src_image->vk_format,
                                                src_image_layout,
                                                dest_image,
+                                               dest_image->vk_format,
                                                dest_image_layout,
                                                region_count, regions);
                return;
@@ -658,7 +660,8 @@ radv_cmd_buffer_resolve_subpass(struct radv_cmd_buffer 
*cmd_buffer)
                if (dest_att.attachment == VK_ATTACHMENT_UNUSED)
                        continue;
 
-               struct radv_image *dst_img = 
cmd_buffer->state.framebuffer->attachments[dest_att.attachment].attachment->image;
+               struct radv_image_view *dest_iview = 
cmd_buffer->state.framebuffer->attachments[dest_att.attachment].attachment;
+               struct radv_image *dst_img = dest_iview->image;
 
                if (radv_image_has_dcc(dst_img)) {
                        radv_initialize_dcc(cmd_buffer, dst_img, 0xffffffff);
@@ -673,14 +676,14 @@ radv_cmd_buffer_resolve_subpass(struct radv_cmd_buffer 
*cmd_buffer)
 
                radv_cmd_buffer_set_subpass(cmd_buffer, &resolve_subpass);
 
-               VkResult ret = build_resolve_pipeline(cmd_buffer->device, 
radv_format_meta_fs_key(dst_img->vk_format));
+               VkResult ret = build_resolve_pipeline(cmd_buffer->device, 
radv_format_meta_fs_key(dest_iview->vk_format));
                if (ret != VK_SUCCESS) {
                        cmd_buffer->record_result = ret;
                        continue;
                }
 
                emit_resolve(cmd_buffer,
-                            dst_img->vk_format,
+                            dest_iview->vk_format,
                             &(VkOffset2D) { 0, 0 },
                             &(VkExtent2D) { fb->width, fb->height });
        }
diff --git a/src/amd/vulkan/radv_meta_resolve_cs.c 
b/src/amd/vulkan/radv_meta_resolve_cs.c
index 67df4800023..506e4139e93 100644
--- a/src/amd/vulkan/radv_meta_resolve_cs.c
+++ b/src/amd/vulkan/radv_meta_resolve_cs.c
@@ -413,8 +413,10 @@ emit_resolve(struct radv_cmd_buffer *cmd_buffer,
 
 void radv_meta_resolve_compute_image(struct radv_cmd_buffer *cmd_buffer,
                                     struct radv_image *src_image,
+                                    VkFormat src_format,
                                     VkImageLayout src_image_layout,
                                     struct radv_image *dest_image,
+                                    VkFormat dest_format,
                                     VkImageLayout dest_image_layout,
                                     uint32_t region_count,
                                     const VkImageResolve *regions)
@@ -460,7 +462,7 @@ void radv_meta_resolve_compute_image(struct radv_cmd_buffer 
*cmd_buffer,
                                                     .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,
+                                                            .format = 
src_format,
                                                             .subresourceRange 
= {
                                                             .aspectMask = 
VK_IMAGE_ASPECT_COLOR_BIT,
                                                             .baseMipLevel = 
region->srcSubresource.mipLevel,
@@ -476,7 +478,7 @@ void radv_meta_resolve_compute_image(struct radv_cmd_buffer 
*cmd_buffer,
                                                     .sType = 
VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
                                                             .image = 
radv_image_to_handle(dest_image),
                                                             .viewType = 
radv_meta_get_view_type(dest_image),
-                                                            .format = 
vk_to_non_srgb_format(dest_image->vk_format),
+                                                            .format = 
vk_to_non_srgb_format(dest_format),
                                                             .subresourceRange 
= {
                                                             .aspectMask = 
VK_IMAGE_ASPECT_COLOR_BIT,
                                                             .baseMipLevel = 
region->dstSubresource.mipLevel,
@@ -544,8 +546,10 @@ radv_cmd_buffer_resolve_subpass_cs(struct radv_cmd_buffer 
*cmd_buffer)
 
                radv_meta_resolve_compute_image(cmd_buffer,
                                                src_iview->image,
+                                               src_iview->vk_format,
                                                src_att.layout,
                                                dst_iview->image,
+                                               dst_iview->vk_format,
                                                dst_att.layout,
                                                1, &region);
        }
-- 
2.21.0

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to