Mesa (main): tu: Switch clear/blit to fdl6_view and cross-check

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Mon Oct 18 16:38:36 UTC 2021


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

Author: Connor Abbott <cwabbott0 at gmail.com>
Date:   Thu Oct 14 15:10:17 2021 +0200

tu: Switch clear/blit to fdl6_view and cross-check

This will help us create staging resources with a Y8 format and avoids
calling into the Vulkan-level entrypoints which will have to be changed
to use vk_image and vk_image_view.

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13359>

---

 src/freedreno/vulkan/tu_clear_blit.c | 89 +++++++++++++++++++++++-------------
 src/freedreno/vulkan/tu_cmd_buffer.c | 10 ++--
 src/freedreno/vulkan/tu_image.c      | 26 +++++------
 src/freedreno/vulkan/tu_private.h    | 13 ++++--
 4 files changed, 85 insertions(+), 53 deletions(-)

diff --git a/src/freedreno/vulkan/tu_clear_blit.c b/src/freedreno/vulkan/tu_clear_blit.c
index 9dba871a703..db6ecd2cc72 100644
--- a/src/freedreno/vulkan/tu_clear_blit.c
+++ b/src/freedreno/vulkan/tu_clear_blit.c
@@ -144,17 +144,17 @@ r2d_clear_value(struct tu_cs *cs, VkFormat format, const VkClearValue *val)
 static void
 r2d_src(struct tu_cmd_buffer *cmd,
         struct tu_cs *cs,
-        const struct tu_image_view *iview,
+        const struct fdl6_view *iview,
         uint32_t layer,
         VkFilter filter)
 {
-   uint32_t src_info = iview->view.SP_PS_2D_SRC_INFO;
+   uint32_t src_info = iview->SP_PS_2D_SRC_INFO;
    if (filter != VK_FILTER_NEAREST)
       src_info |= A6XX_SP_PS_2D_SRC_INFO_FILTER;
 
    tu_cs_emit_pkt4(cs, REG_A6XX_SP_PS_2D_SRC_INFO, 5);
    tu_cs_emit(cs, src_info);
-   tu_cs_emit(cs, iview->view.SP_PS_2D_SRC_SIZE);
+   tu_cs_emit(cs, iview->SP_PS_2D_SRC_SIZE);
    tu_cs_image_ref_2d(cs, iview, layer, true);
 
    tu_cs_emit_pkt4(cs, REG_A6XX_SP_PS_2D_SRC_FLAGS, 3);
@@ -198,10 +198,10 @@ r2d_src_buffer(struct tu_cmd_buffer *cmd,
 }
 
 static void
-r2d_dst(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer)
+r2d_dst(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer)
 {
    tu_cs_emit_pkt4(cs, REG_A6XX_RB_2D_DST_INFO, 4);
-   tu_cs_emit(cs, iview->view.RB_2D_DST_INFO);
+   tu_cs_emit(cs, iview->RB_2D_DST_INFO);
    tu_cs_image_ref_2d(cs, iview, layer, false);
 
    tu_cs_emit_pkt4(cs, REG_A6XX_RB_2D_DST_FLAGS, 3);
@@ -854,13 +854,13 @@ r3d_src_common(struct tu_cmd_buffer *cmd,
 static void
 r3d_src(struct tu_cmd_buffer *cmd,
         struct tu_cs *cs,
-        const struct tu_image_view *iview,
+        const struct fdl6_view *iview,
         uint32_t layer,
         VkFilter filter)
 {
-   r3d_src_common(cmd, cs, iview->view.descriptor,
-                  iview->view.layer_size * layer,
-                  iview->view.ubwc_layer_size * layer,
+   r3d_src_common(cmd, cs, iview->descriptor,
+                  iview->layer_size * layer,
+                  iview->ubwc_layer_size * layer,
                   filter);
 }
 
@@ -928,17 +928,17 @@ r3d_src_gmem(struct tu_cmd_buffer *cmd,
 }
 
 static void
-r3d_dst(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer)
+r3d_dst(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer)
 {
    tu_cs_emit_pkt4(cs, REG_A6XX_RB_MRT_BUF_INFO(0), 6);
-   tu_cs_emit(cs, iview->view.RB_MRT_BUF_INFO);
+   tu_cs_emit(cs, iview->RB_MRT_BUF_INFO);
    tu_cs_image_ref(cs, iview, layer);
    tu_cs_emit(cs, 0);
 
    tu_cs_emit_pkt4(cs, REG_A6XX_RB_MRT_FLAG_BUFFER(0), 3);
    tu_cs_image_flag_ref(cs, iview, layer);
 
-   tu_cs_emit_regs(cs, A6XX_RB_RENDER_CNTL(.flag_mrts = iview->view.ubwc_enabled));
+   tu_cs_emit_regs(cs, A6XX_RB_RENDER_CNTL(.flag_mrts = iview->ubwc_enabled));
 }
 
 static void
@@ -1088,14 +1088,14 @@ struct blit_ops {
    void (*src)(
         struct tu_cmd_buffer *cmd,
         struct tu_cs *cs,
-        const struct tu_image_view *iview,
+        const struct fdl6_view *iview,
         uint32_t layer,
         VkFilter filter);
    void (*src_buffer)(struct tu_cmd_buffer *cmd, struct tu_cs *cs,
                       VkFormat vk_format,
                       uint64_t va, uint32_t pitch,
                       uint32_t width, uint32_t height);
-   void (*dst)(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer);
+   void (*dst)(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer);
    void (*dst_buffer)(struct tu_cs *cs, VkFormat vk_format, uint64_t va, uint32_t pitch);
    void (*setup)(struct tu_cmd_buffer *cmd,
                  struct tu_cs *cs,
@@ -1246,7 +1246,7 @@ tu6_clear_lrz(struct tu_cmd_buffer *cmd,
 }
 
 static void
-tu_image_view_copy_blit(struct tu_image_view *iview,
+tu_image_view_copy_blit(struct fdl6_view *iview,
                         struct tu_image *image,
                         VkFormat format,
                         const VkImageSubresourceLayers *subres,
@@ -1262,7 +1262,8 @@ tu_image_view_copy_blit(struct tu_image_view *iview,
       aspect_mask = VK_IMAGE_ASPECT_COLOR_BIT;
    }
 
-   tu_image_view_init(iview, &(VkImageViewCreateInfo) {
+   struct tu_image_view iview2;
+   tu_image_view_init(&iview2, &(VkImageViewCreateInfo) {
       .image = tu_image_to_handle(image),
       .viewType = z_scale ? VK_IMAGE_VIEW_TYPE_3D : VK_IMAGE_VIEW_TYPE_2D,
       .format = format,
@@ -1276,10 +1277,34 @@ tu_image_view_copy_blit(struct tu_image_view *iview,
          .layerCount = 1,
       },
    }, false);
+
+   const struct fdl_layout *layout =
+      &image->layout[tu6_plane_index(image->vk_format, aspect_mask)];
+
+   if (aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT)
+      format = tu6_plane_format(format, tu6_plane_index(format, aspect_mask));
+
+   fdl6_view_init(iview, &layout, &(struct fdl_view_args) {
+      .iova = image->bo->iova + image->bo_offset,
+      .base_array_layer = subres->baseArrayLayer + layer,
+      .layer_count = 1,
+      .base_miplevel = subres->mipLevel,
+      .level_count = 1,
+      .format = tu_format_for_aspect(tu_vk_format_to_pipe_format(format),
+                                     aspect_mask),
+      .swiz = {
+         /* image_to_buffer from d24s8 with stencil aspect mask writes out to r8 */
+         stencil_read ? PIPE_SWIZZLE_W : PIPE_SWIZZLE_X,
+         PIPE_SWIZZLE_Y, PIPE_SWIZZLE_Z, PIPE_SWIZZLE_W
+      },
+      .type = z_scale ? FDL_VIEW_TYPE_3D : FDL_VIEW_TYPE_2D,
+   }, false);
+
+   assert(memcmp(iview, &iview2.view, sizeof(iview2.view)) == 0);
 }
 
 static void
-tu_image_view_copy(struct tu_image_view *iview,
+tu_image_view_copy(struct fdl6_view *iview,
                    struct tu_image *image,
                    VkFormat format,
                    const VkImageSubresourceLayers *subres,
@@ -1291,7 +1316,7 @@ tu_image_view_copy(struct tu_image_view *iview,
 }
 
 static void
-tu_image_view_blit(struct tu_image_view *iview,
+tu_image_view_blit(struct fdl6_view *iview,
                    struct tu_image *image,
                    const VkImageSubresourceLayers *subres,
                    uint32_t layer)
@@ -1399,7 +1424,7 @@ tu6_blit_image(struct tu_cmd_buffer *cmd,
          A6XX_GRAS_2D_SRC_BR_Y(MAX2(info->srcOffsets[0].y, info->srcOffsets[1].y) - 1));
    }
 
-   struct tu_image_view dst, src;
+   struct fdl6_view dst, src;
    tu_image_view_blit(&dst, dst_image, &info->dstSubresource,
                       MIN2(info->dstOffsets[0].z, info->dstOffsets[1].z));
 
@@ -1527,7 +1552,7 @@ tu_copy_buffer_to_image(struct tu_cmd_buffer *cmd,
               info->imageSubresource.aspectMask, 0, false, dst_image->layout[0].ubwc,
               dst_image->layout[0].nr_samples);
 
-   struct tu_image_view dst;
+   struct fdl6_view dst;
    tu_image_view_copy(&dst, dst_image, dst_image->vk_format, &info->imageSubresource, offset.z, false);
 
    for (uint32_t i = 0; i < layers; i++) {
@@ -1601,7 +1626,7 @@ tu_copy_image_to_buffer(struct tu_cmd_buffer *cmd,
    ops->setup(cmd, cs, dst_format, VK_IMAGE_ASPECT_COLOR_BIT, 0, false, false,
               VK_SAMPLE_COUNT_1_BIT);
 
-   struct tu_image_view src;
+   struct fdl6_view src;
    tu_image_view_copy(&src, src_image, src_image->vk_format, &info->imageSubresource, offset.z, stencil_read);
 
    for (uint32_t i = 0; i < layers; i++) {
@@ -1748,7 +1773,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd,
       use_staging_blit = true;
    }
 
-   struct tu_image_view dst, src;
+   struct fdl6_view dst, src;
 
    if (use_staging_blit) {
       tu_image_view_copy(&dst, dst_image, dst_format, &info->dstSubresource, dst_offset.z, false);
@@ -1793,7 +1818,7 @@ tu_copy_image_to_image(struct tu_cmd_buffer *cmd,
          return;
       }
 
-      struct tu_image_view staging;
+      struct fdl6_view staging;
       tu_image_view_copy(&staging, &staging_image, src_format,
                          &staging_subresource, 0, false);
 
@@ -2011,7 +2036,7 @@ tu_CmdResolveImage(VkCommandBuffer commandBuffer,
 
       coords(ops, cs, &info->dstOffset, &info->srcOffset, &info->extent);
 
-      struct tu_image_view dst, src;
+      struct fdl6_view dst, src;
       tu_image_view_blit(&dst, dst_image, &info->dstSubresource, info->dstOffset.z);
       tu_image_view_blit(&src, src_image, &info->srcSubresource, info->srcOffset.z);
 
@@ -2055,8 +2080,8 @@ resolve_sysmem(struct tu_cmd_buffer *cmd,
          r2d_src_stencil(cmd, cs, src, i, VK_FILTER_NEAREST);
          r2d_dst_stencil(cs, dst, i);
       } else {
-         ops->src(cmd, cs, src, i, VK_FILTER_NEAREST);
-         ops->dst(cs, dst, i);
+         ops->src(cmd, cs, &src->view, i, VK_FILTER_NEAREST);
+         ops->dst(cs, &dst->view, i);
       }
       ops->run(cmd, cs);
    }
@@ -2125,7 +2150,7 @@ clear_image(struct tu_cmd_buffer *cmd,
                      u_minify(image->layout[0].height0, range->baseMipLevel + j)
                   });
 
-      struct tu_image_view dst;
+      struct fdl6_view dst;
       tu_image_view_copy_blit(&dst, image, format, &(VkImageSubresourceLayers) {
          .aspectMask = aspect_mask,
          .mipLevel = range->baseMipLevel + j,
@@ -2581,7 +2606,7 @@ clear_sysmem_attachment(struct tu_cmd_buffer *cmd,
          else
             r2d_dst_stencil(cs, iview, i);
       } else {
-         ops->dst(cs, iview, i);
+         ops->dst(cs, &iview->view, i);
       }
       ops->run(cmd, cs);
    }
@@ -2685,10 +2710,10 @@ tu_emit_blit(struct tu_cmd_buffer *cmd,
                       A6XX_RB_BLIT_BASE_GMEM(attachment->gmem_offset_stencil));
    } else {
       tu_cs_emit(cs, iview->view.RB_BLIT_DST_INFO);
-      tu_cs_image_ref_2d(cs, iview, 0, false);
+      tu_cs_image_ref_2d(cs, &iview->view, 0, false);
 
       tu_cs_emit_pkt4(cs, REG_A6XX_RB_BLIT_FLAG_DST, 3);
-      tu_cs_image_flag_ref(cs, iview, 0);
+      tu_cs_image_flag_ref(cs, &iview->view, 0);
 
       tu_cs_emit_regs(cs,
                       A6XX_RB_BLIT_BASE_GMEM(attachment->gmem_offset));
@@ -2768,7 +2793,7 @@ store_cp_blit(struct tu_cmd_buffer *cmd,
    if (separate_stencil)
       r2d_dst_stencil(cs, iview, 0);
    else
-      r2d_dst(cs, iview, 0);
+      r2d_dst(cs, &iview->view, 0);
 
    tu_cs_emit_regs(cs,
                    A6XX_SP_PS_2D_SRC_INFO(
@@ -2820,7 +2845,7 @@ store_3d_blit(struct tu_cmd_buffer *cmd,
    if (separate_stencil)
       r3d_dst_stencil(cs, iview, 0);
    else
-      r3d_dst(cs, iview, 0);
+      r3d_dst(cs, &iview->view, 0);
 
    r3d_src_gmem(cmd, cs, iview, format, gmem_offset, cpp);
 
diff --git a/src/freedreno/vulkan/tu_cmd_buffer.c b/src/freedreno/vulkan/tu_cmd_buffer.c
index d12e7dfc603..2084ccd7b8c 100644
--- a/src/freedreno/vulkan/tu_cmd_buffer.c
+++ b/src/freedreno/vulkan/tu_cmd_buffer.c
@@ -216,14 +216,14 @@ tu6_emit_zs(struct tu_cmd_buffer *cmd,
 
    tu_cs_emit_pkt4(cs, REG_A6XX_RB_DEPTH_BUFFER_INFO, 6);
    tu_cs_emit(cs, A6XX_RB_DEPTH_BUFFER_INFO(.depth_format = fmt).value);
-   tu_cs_image_ref(cs, iview, 0);
+   tu_cs_image_ref(cs, &iview->view, 0);
    tu_cs_emit(cs, attachment->gmem_offset);
 
    tu_cs_emit_regs(cs,
                    A6XX_GRAS_SU_DEPTH_BUFFER_INFO(.depth_format = fmt));
 
    tu_cs_emit_pkt4(cs, REG_A6XX_RB_DEPTH_FLAG_BUFFER_BASE, 3);
-   tu_cs_image_flag_ref(cs, iview, 0);
+   tu_cs_image_flag_ref(cs, &iview->view, 0);
 
    tu_cs_emit_regs(cs, A6XX_GRAS_LRZ_BUFFER_BASE(.bo = iview->image->bo,
                                                  .bo_offset = iview->image->bo_offset + iview->image->lrz_offset),
@@ -239,7 +239,7 @@ tu6_emit_zs(struct tu_cmd_buffer *cmd,
          tu_cs_image_stencil_ref(cs, iview, 0);
          tu_cs_emit(cs, attachment->gmem_offset_stencil);
       } else {
-         tu_cs_image_ref(cs, iview, 0);
+         tu_cs_image_ref(cs, &iview->view, 0);
          tu_cs_emit(cs, attachment->gmem_offset);
       }
    } else {
@@ -264,14 +264,14 @@ tu6_emit_mrt(struct tu_cmd_buffer *cmd,
 
       tu_cs_emit_pkt4(cs, REG_A6XX_RB_MRT_BUF_INFO(i), 6);
       tu_cs_emit(cs, iview->view.RB_MRT_BUF_INFO);
-      tu_cs_image_ref(cs, iview, 0);
+      tu_cs_image_ref(cs, &iview->view, 0);
       tu_cs_emit(cs, cmd->state.pass->attachments[a].gmem_offset);
 
       tu_cs_emit_regs(cs,
                       A6XX_SP_FS_MRT_REG(i, .dword = iview->view.SP_FS_MRT_REG));
 
       tu_cs_emit_pkt4(cs, REG_A6XX_RB_MRT_FLAG_BUFFER_ADDR(i), 3);
-      tu_cs_image_flag_ref(cs, iview, 0);
+      tu_cs_image_flag_ref(cs, &iview->view, 0);
    }
 
    tu_cs_emit_regs(cs,
diff --git a/src/freedreno/vulkan/tu_image.c b/src/freedreno/vulkan/tu_image.c
index 66c17585228..ccb7a4f825f 100644
--- a/src/freedreno/vulkan/tu_image.c
+++ b/src/freedreno/vulkan/tu_image.c
@@ -51,7 +51,7 @@ tu6_plane_count(VkFormat format)
    }
 }
 
-static VkFormat
+VkFormat
 tu6_plane_format(VkFormat format, uint32_t plane)
 {
    switch (format) {
@@ -67,7 +67,7 @@ tu6_plane_format(VkFormat format, uint32_t plane)
    }
 }
 
-static uint32_t
+uint32_t
 tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask)
 {
    switch (aspect_mask) {
@@ -82,7 +82,7 @@ tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask)
    }
 }
 
-static enum pipe_format
+enum pipe_format
 tu_format_for_aspect(enum pipe_format format, VkImageAspectFlags aspect_mask)
 {
    switch (format) {
@@ -192,11 +192,11 @@ tu6_texswiz(const VkComponentMapping *comps,
 }
 
 void
-tu_cs_image_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer)
+tu_cs_image_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer)
 {
-   tu_cs_emit(cs, iview->view.PITCH);
-   tu_cs_emit(cs, iview->view.layer_size >> 6);
-   tu_cs_emit_qw(cs, iview->view.base_addr + iview->view.layer_size * layer);
+   tu_cs_emit(cs, iview->PITCH);
+   tu_cs_emit(cs, iview->layer_size >> 6);
+   tu_cs_emit_qw(cs, iview->base_addr + iview->layer_size * layer);
 }
 
 void
@@ -208,18 +208,18 @@ tu_cs_image_stencil_ref(struct tu_cs *cs, const struct tu_image_view *iview, uin
 }
 
 void
-tu_cs_image_ref_2d(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer, bool src)
+tu_cs_image_ref_2d(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer, bool src)
 {
-   tu_cs_emit_qw(cs, iview->view.base_addr + iview->view.layer_size * layer);
+   tu_cs_emit_qw(cs, iview->base_addr + iview->layer_size * layer);
    /* SP_PS_2D_SRC_PITCH has shifted pitch field */
-   tu_cs_emit(cs, iview->view.PITCH << (src ? 9 : 0));
+   tu_cs_emit(cs, iview->PITCH << (src ? 9 : 0));
 }
 
 void
-tu_cs_image_flag_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer)
+tu_cs_image_flag_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer)
 {
-   tu_cs_emit_qw(cs, iview->view.ubwc_addr + iview->view.ubwc_layer_size * layer);
-   tu_cs_emit(cs, iview->view.FLAG_BUFFER_PITCH);
+   tu_cs_emit_qw(cs, iview->ubwc_addr + iview->ubwc_layer_size * layer);
+   tu_cs_emit(cs, iview->FLAG_BUFFER_PITCH);
 }
 
 void
diff --git a/src/freedreno/vulkan/tu_private.h b/src/freedreno/vulkan/tu_private.h
index e251dccde62..f8ea52e03ee 100644
--- a/src/freedreno/vulkan/tu_private.h
+++ b/src/freedreno/vulkan/tu_private.h
@@ -1439,6 +1439,13 @@ tu_get_levelCount(const struct tu_image *image,
              : range->levelCount;
 }
 
+VkFormat tu6_plane_format(VkFormat format, uint32_t plane);
+
+uint32_t tu6_plane_index(VkFormat format, VkImageAspectFlags aspect_mask);
+
+enum pipe_format tu_format_for_aspect(enum pipe_format format,
+                                      VkImageAspectFlags aspect_mask);
+
 struct tu_image_view
 {
    struct vk_object_base base;
@@ -1472,13 +1479,13 @@ struct tu_sampler {
 };
 
 void
-tu_cs_image_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer);
+tu_cs_image_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer);
 
 void
-tu_cs_image_ref_2d(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer, bool src);
+tu_cs_image_ref_2d(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer, bool src);
 
 void
-tu_cs_image_flag_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer);
+tu_cs_image_flag_ref(struct tu_cs *cs, const struct fdl6_view *iview, uint32_t layer);
 
 void
 tu_cs_image_stencil_ref(struct tu_cs *cs, const struct tu_image_view *iview, uint32_t layer);



More information about the mesa-commit mailing list