v3dv: fix base layer for 3D blits in the TFU path
authorIago Toral Quiroga <itoral@igalia.com>
Fri, 27 Nov 2020 10:13:26 +0000 (11:13 +0100)
committerIago Toral Quiroga <itoral@igalia.com>
Mon, 30 Nov 2020 12:21:15 +0000 (13:21 +0100)
We were always using baseArrayLayer from the image subresource, but
for 3D images we should use the Z offset of the region.

Reviewed-by: Alejandro PiƱeiro <apinheiro@igalia.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/7809>

src/broadcom/vulkan/v3dv_meta_copy.c

index 63badcd873c5000a236f10a34c441d6bfc329308..c9324bbd53c1b3a7a61696df9969af147a60d0e9 100644 (file)
@@ -4077,6 +4077,9 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
        */
       if (dst_mirror_z)
          return false;
+   } else {
+      min_dst_layer = region->dstSubresource.baseArrayLayer;
+      max_dst_layer = min_dst_layer + region->dstSubresource.layerCount - 1;
    }
 
    uint32_t min_src_layer;
@@ -4089,11 +4092,14 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
 
       if (src_mirror_z)
          return false;
-
-      if (max_dst_layer - min_dst_layer != max_src_layer - min_src_layer)
-         return false;
+   } else {
+      min_src_layer = region->srcSubresource.baseArrayLayer;
+      max_src_layer = min_src_layer + region->srcSubresource.layerCount - 1;
    }
 
+   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;
@@ -4101,8 +4107,8 @@ blit_tfu(struct v3dv_cmd_buffer *cmd_buffer,
 
    for (uint32_t i = 0; i < layer_count; i++) {
       emit_tfu_job(cmd_buffer,
-                   dst, dst_mip_level, region->dstSubresource.baseArrayLayer + i,
-                   src, src_mip_level, region->srcSubresource.baseArrayLayer + i,
+                   dst, dst_mip_level, min_dst_layer + i,
+                   src, src_mip_level, min_src_layer + i,
                    dst_width, dst_height, dst->format);
    }