v3dv: fix 3D image blits
authorIago Toral Quiroga <itoral@igalia.com>
Tue, 25 Aug 2020 08:17:29 +0000 (10:17 +0200)
committerMarge Bot <eric+marge@anholt.net>
Tue, 13 Oct 2020 21:21:33 +0000 (21:21 +0000)
Specifically, we should select the slice to blit from on the source
image to be in the middle of the depth step.

This issue was only raised recently after the CTS improved the 3D
blitting tests.

Fixes:
dEQP-VK.api.copy_and_blit.core.blit_image.all_formats.*.3d.*

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

src/broadcom/vulkan/v3dv_meta_copy.c

index e1e6307..7c95787 100644 (file)
@@ -4033,8 +4033,15 @@ blit_shader(struct v3dv_cmd_buffer *cmd_buffer,
       if (!job)
          goto fail;
 
-      if (src->type == VK_IMAGE_TYPE_3D)
-         tex_coords[4] = (min_src_layer + i * src_z_step) / (float)src_level_d;
+      /* For 3D blits we need to compute the source slice to blit from (the Z
+       * coordinate of the source sample operation). We want to choose this
+       * based on the ratio of the depth of the source and the destination
+       * images, picking the coordinate in the middle of each step.
+       */
+      if (src->type == VK_IMAGE_TYPE_3D) {
+         tex_coords[4] =
+            (min_src_layer + (i + 0.5f) * src_z_step) / (float)src_level_d;
+      }
 
       v3dv_CmdPushConstants(_cmd_buffer,
                             device->meta.blit.playout,