Mesa (main): v3dv: implement vkCmdResolveImage2KHR

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Jun 21 06:14:51 UTC 2021


Module: Mesa
Branch: main
Commit: aa61a653a5dcbebd8b5a0f32ea4dbba3cba77dd6
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=aa61a653a5dcbebd8b5a0f32ea4dbba3cba77dd6

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Thu Jun 17 10:18:14 2021 +0200

v3dv: implement vkCmdResolveImage2KHR

The common Vulkan code will call this to implement vkCmdResolveImage.

Reviewed-by: Alejandro Piñeiro <apinheiro at igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11443>

---

 src/broadcom/vulkan/v3dv_cmd_buffer.c | 23 ++++++++++++-----------
 src/broadcom/vulkan/v3dv_meta_copy.c  | 30 +++++++++++++-----------------
 2 files changed, 25 insertions(+), 28 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_cmd_buffer.c b/src/broadcom/vulkan/v3dv_cmd_buffer.c
index fa250ca2224..f39ab45c35d 100644
--- a/src/broadcom/vulkan/v3dv_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dv_cmd_buffer.c
@@ -1039,7 +1039,8 @@ cmd_buffer_subpass_handle_pending_resolves(struct v3dv_cmd_buffer *cmd_buffer)
       struct v3dv_image_view *src_iview = fb->attachments[src_attachment_idx];
       struct v3dv_image_view *dst_iview = fb->attachments[dst_attachment_idx];
 
-      VkImageResolve region = {
+      VkImageResolve2KHR region = {
+         .sType = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
          .srcSubresource = {
             VK_IMAGE_ASPECT_COLOR_BIT,
             src_iview->base_level,
@@ -1057,16 +1058,16 @@ cmd_buffer_subpass_handle_pending_resolves(struct v3dv_cmd_buffer *cmd_buffer)
          .extent = src_iview->image->extent,
       };
 
-      VkImage src_image_handle =
-         v3dv_image_to_handle((struct v3dv_image *) src_iview->image);
-      VkImage dst_image_handle =
-         v3dv_image_to_handle((struct v3dv_image *) dst_iview->image);
-      v3dv_CmdResolveImage(cmd_buffer_handle,
-                           src_image_handle,
-                           VK_IMAGE_LAYOUT_GENERAL,
-                           dst_image_handle,
-                           VK_IMAGE_LAYOUT_GENERAL,
-                           1, &region);
+      VkResolveImageInfo2KHR resolve_info = {
+         .sType = VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
+         .srcImage = v3dv_image_to_handle((struct v3dv_image *) src_iview->image),
+         .srcImageLayout = VK_IMAGE_LAYOUT_GENERAL,
+         .dstImage = v3dv_image_to_handle((struct v3dv_image *) dst_iview->image),
+         .dstImageLayout = VK_IMAGE_LAYOUT_GENERAL,
+         .regionCount = 1,
+         .pRegions = &region,
+      };
+      v3dv_CmdResolveImage2KHR(cmd_buffer_handle, &resolve_info);
    }
 
    cmd_buffer->state.framebuffer = restore_fb;
diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c
index 38af7738fd8..f0575f97b9a 100644
--- a/src/broadcom/vulkan/v3dv_meta_copy.c
+++ b/src/broadcom/vulkan/v3dv_meta_copy.c
@@ -5565,7 +5565,7 @@ emit_resolve_image_layer_per_tile_list(struct v3dv_job *job,
                                        struct v3dv_image *dst,
                                        struct v3dv_image *src,
                                        uint32_t layer_offset,
-                                       const VkImageResolve *region)
+                                       const VkImageResolve2KHR *region)
 {
    struct v3dv_cl *cl = &job->indirect;
    v3dv_cl_ensure_space(cl, 200, 1);
@@ -5623,7 +5623,7 @@ emit_resolve_image_layer(struct v3dv_job *job,
                          struct v3dv_image *src,
                          struct framebuffer_data *framebuffer,
                          uint32_t layer,
-                         const VkImageResolve *region)
+                         const VkImageResolve2KHR *region)
 {
    emit_frame_setup(job, layer, NULL);
    emit_resolve_image_layer_per_tile_list(job, framebuffer,
@@ -5636,7 +5636,7 @@ emit_resolve_image_rcl(struct v3dv_job *job,
                        struct v3dv_image *dst,
                        struct v3dv_image *src,
                        struct framebuffer_data *framebuffer,
-                       const VkImageResolve *region)
+                       const VkImageResolve2KHR *region)
 {
    struct v3dv_cl *rcl = emit_rcl_prologue(job, framebuffer, NULL);
    v3dv_return_if_oom(NULL, job);
@@ -5650,7 +5650,7 @@ static bool
 resolve_image_tlb(struct v3dv_cmd_buffer *cmd_buffer,
                   struct v3dv_image *dst,
                   struct v3dv_image *src,
-                  const VkImageResolve *region)
+                  const VkImageResolve2KHR *region)
 {
    if (!can_use_tlb(src, &region->srcOffset, NULL) ||
        !can_use_tlb(dst, &region->dstOffset, NULL)) {
@@ -5701,7 +5701,7 @@ static bool
 resolve_image_blit(struct v3dv_cmd_buffer *cmd_buffer,
                    struct v3dv_image *dst,
                    struct v3dv_image *src,
-                   const VkImageResolve *region)
+                   const VkImageResolve2KHR *region)
 {
    const VkImageBlit2KHR blit_region = {
       .sType = VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR,
@@ -5730,17 +5730,13 @@ resolve_image_blit(struct v3dv_cmd_buffer *cmd_buffer,
 }
 
 VKAPI_ATTR void VKAPI_CALL
-v3dv_CmdResolveImage(VkCommandBuffer commandBuffer,
-                     VkImage srcImage,
-                     VkImageLayout srcImageLayout,
-                     VkImage dstImage,
-                     VkImageLayout dstImageLayout,
-                     uint32_t regionCount,
-                     const VkImageResolve *pRegions)
+v3dv_CmdResolveImage2KHR(VkCommandBuffer commandBuffer,
+                         const VkResolveImageInfo2KHR *info)
+
 {
    V3DV_FROM_HANDLE(v3dv_cmd_buffer, cmd_buffer, commandBuffer);
-   V3DV_FROM_HANDLE(v3dv_image, src, srcImage);
-   V3DV_FROM_HANDLE(v3dv_image, dst, dstImage);
+   V3DV_FROM_HANDLE(v3dv_image, src, info->srcImage);
+   V3DV_FROM_HANDLE(v3dv_image, dst, info->dstImage);
 
     /* This command can only happen outside a render pass */
    assert(cmd_buffer->state.pass == NULL);
@@ -5749,10 +5745,10 @@ v3dv_CmdResolveImage(VkCommandBuffer commandBuffer,
    assert(src->samples == VK_SAMPLE_COUNT_4_BIT);
    assert(dst->samples == VK_SAMPLE_COUNT_1_BIT);
 
-   for (uint32_t i = 0; i < regionCount; i++) {
-      if (resolve_image_tlb(cmd_buffer, dst, src, &pRegions[i]))
+   for (uint32_t i = 0; i < info->regionCount; i++) {
+      if (resolve_image_tlb(cmd_buffer, dst, src, &info->pRegions[i]))
          continue;
-      if (resolve_image_blit(cmd_buffer, dst, src, &pRegions[i]))
+      if (resolve_image_blit(cmd_buffer, dst, src, &info->pRegions[i]))
          continue;
       unreachable("Unsupported multismaple resolve operation");
    }



More information about the mesa-commit mailing list