Mesa (master): v3dv: handle Z mirroring in the TFU blit path

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Dec 1 11:33:22 UTC 2020


Module: Mesa
Branch: master
Commit: 329afedd8b44e85e9932da209951d235d60af7a3
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=329afedd8b44e85e9932da209951d235d60af7a3

Author: Iago Toral Quiroga <itoral at igalia.com>
Date:   Tue Dec  1 10:13:42 2020 +0100

v3dv: handle Z mirroring in the TFU blit path

The TFU path only activates for blits that are really copies
(no linear filtering, no scaling, same pixel format, etc.), and
we do it slice by slice, so we can easily handle mirroring of the
Z coordinate for 3D images by reversing the order of the layers
as we copy them.

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

---

 src/broadcom/vulkan/v3dv_meta_copy.c | 42 +++++++++++++++---------------------
 1 file changed, 17 insertions(+), 25 deletions(-)

diff --git a/src/broadcom/vulkan/v3dv_meta_copy.c b/src/broadcom/vulkan/v3dv_meta_copy.c
index 4eefaa8ce82..09a106dc273 100644
--- a/src/broadcom/vulkan/v3dv_meta_copy.c
+++ b/src/broadcom/vulkan/v3dv_meta_copy.c
@@ -4058,17 +4058,12 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
       return false;
    }
 
-   /* No scaling */
+   /* No XY scaling */
    if (region->srcOffsets[1].x != region->dstOffsets[1].x ||
        region->srcOffsets[1].y != region->dstOffsets[1].y) {
       return false;
    }
 
-   if (dst->type == VK_IMAGE_TYPE_3D &&
-       region->srcOffsets[1].z != region->dstOffsets[1].z) {
-      return false;
-   }
-
    /* If the format is D24S8 both aspects need to be copied, since the TFU
     * can't be programmed to copy only one aspect of the image.
     */
@@ -4108,16 +4103,9 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
       compute_blit_3d_layers(region->dstOffsets,
                              &min_dst_layer, &max_dst_layer,
                              &dst_mirror_z);
-
-      /* TFU can only do exact copies, so we can't handle mirroring. This checks
-       * mirroring in Z for 3D images, XY mirroring is already handled by earlier
-       * checks
-       */
-      if (dst_mirror_z)
-         return false;
    } else {
       min_dst_layer = region->dstSubresource.baseArrayLayer;
-      max_dst_layer = min_dst_layer + region->dstSubresource.layerCount - 1;
+      max_dst_layer = min_dst_layer + region->dstSubresource.layerCount;
    }
 
    uint32_t min_src_layer;
@@ -4127,27 +4115,31 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
       compute_blit_3d_layers(region->srcOffsets,
                              &min_src_layer, &max_src_layer,
                              &src_mirror_z);
-
-      if (src_mirror_z)
-         return false;
    } else {
       min_src_layer = region->srcSubresource.baseArrayLayer;
-      max_src_layer = min_src_layer + region->srcSubresource.layerCount - 1;
+      max_src_layer = min_src_layer + region->srcSubresource.layerCount;
    }
 
+   /* No Z scaling for 3D images (for non-3D images both src and dst must
+    * have the same layerCount).
+    */
    if (max_dst_layer - min_dst_layer != max_src_layer - min_src_layer)
       return false;
 
-   const uint32_t layer_count = dst->type != VK_IMAGE_TYPE_3D ?
-      region->dstSubresource.layerCount :
-      max_dst_layer - min_dst_layer;
+   const uint32_t layer_count = max_dst_layer - min_dst_layer;
    const uint32_t src_mip_level = region->srcSubresource.mipLevel;
-
    for (uint32_t i = 0; i < layer_count; i++) {
+      /* Since the TFU path doesn't handle scaling, Z mirroring for 3D images
+       * only involves reversing the order of the slices.
+       */
+      const uint32_t dst_layer =
+         dst_mirror_z ? max_dst_layer - i - 1: min_dst_layer + i;
+      const uint32_t src_layer =
+         src_mirror_z ? max_src_layer - i - 1: min_src_layer + i;
       emit_tfu_job(cmd_buffer,
-                   dst, dst_mip_level, min_dst_layer + i,
-                   src, src_mip_level, min_src_layer + i,
-                   dst_width, dst_height, dst->format);
+                   dst, dst_mip_level, dst_layer,
+                   src, src_mip_level, src_layer,
+                   dst_width, dst_height, format);
    }
 
    return true;



More information about the mesa-commit mailing list