[Mesa-dev] [PATCH] anv: blorp: support multiple aspect blits

Dylan Baker dylan at pnwbakers.com
Wed Aug 29 15:39:38 UTC 2018


Quoting Lionel Landwerlin (2018-08-28 04:27:13)
> Newer blit tests are enabling depth&stencils blits. We currently don't
> support it but can do by iterating over the aspects masks (copy some
> logic from the CopyImage function).
> 
> Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
> Fixes: 9f44745eca0e41 ("anv: Use blorp to implement VkBlitImage")
> ---
>  src/intel/vulkan/anv_blorp.c | 145 ++++++++++++++++++-----------------
>  1 file changed, 75 insertions(+), 70 deletions(-)
> 
> diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> index cd67cc636b2..35b304f92b3 100644
> --- a/src/intel/vulkan/anv_blorp.c
> +++ b/src/intel/vulkan/anv_blorp.c
> @@ -532,81 +532,86 @@ void anv_CmdBlitImage(
>        const VkImageSubresourceLayers *src_res = &pRegions[r].srcSubresource;
>        const VkImageSubresourceLayers *dst_res = &pRegions[r].dstSubresource;
>  
> -      get_blorp_surf_for_anv_image(cmd_buffer->device,
> -                                   src_image, src_res->aspectMask,
> -                                   srcImageLayout, ISL_AUX_USAGE_NONE, &src);
> -      get_blorp_surf_for_anv_image(cmd_buffer->device,
> -                                   dst_image, dst_res->aspectMask,
> -                                   dstImageLayout, ISL_AUX_USAGE_NONE, &dst);
> -
> -      struct anv_format_plane src_format =
> -         anv_get_format_plane(&cmd_buffer->device->info, src_image->vk_format,
> -                              src_res->aspectMask, src_image->tiling);
> -      struct anv_format_plane dst_format =
> -         anv_get_format_plane(&cmd_buffer->device->info, dst_image->vk_format,
> -                              dst_res->aspectMask, dst_image->tiling);
> -
> -      unsigned dst_start, dst_end;
> -      if (dst_image->type == VK_IMAGE_TYPE_3D) {
> -         assert(dst_res->baseArrayLayer == 0);
> -         dst_start = pRegions[r].dstOffsets[0].z;
> -         dst_end = pRegions[r].dstOffsets[1].z;
> -      } else {
> -         dst_start = dst_res->baseArrayLayer;
> -         dst_end = dst_start + anv_get_layerCount(dst_image, dst_res);
> -      }
> -
> -      unsigned src_start, src_end;
> -      if (src_image->type == VK_IMAGE_TYPE_3D) {
> -         assert(src_res->baseArrayLayer == 0);
> -         src_start = pRegions[r].srcOffsets[0].z;
> -         src_end = pRegions[r].srcOffsets[1].z;
> -      } else {
> -         src_start = src_res->baseArrayLayer;
> -         src_end = src_start + anv_get_layerCount(src_image, src_res);
> -      }
> -
> -      bool flip_z = flip_coords(&src_start, &src_end, &dst_start, &dst_end);
> -      float src_z_step = (float)(src_end + 1 - src_start) /
> -                         (float)(dst_end + 1 - dst_start);
> +      assert(anv_image_aspects_compatible(src_res->aspectMask,
> +                                          dst_res->aspectMask));
> +
> +      uint32_t aspect_bit;
> +      anv_foreach_image_aspect_bit(aspect_bit, src_image, src_res->aspectMask) {
> +         get_blorp_surf_for_anv_image(cmd_buffer->device,
> +                                      src_image, 1U << aspect_bit,
> +                                      srcImageLayout, ISL_AUX_USAGE_NONE, &src);
> +         get_blorp_surf_for_anv_image(cmd_buffer->device,
> +                                      dst_image, 1U << aspect_bit,
> +                                      dstImageLayout, ISL_AUX_USAGE_NONE, &dst);
> +
> +         struct anv_format_plane src_format =
> +            anv_get_format_plane(&cmd_buffer->device->info, src_image->vk_format,
> +                                 1U << aspect_bit, src_image->tiling);
> +         struct anv_format_plane dst_format =
> +            anv_get_format_plane(&cmd_buffer->device->info, dst_image->vk_format,
> +                                 1U << aspect_bit, dst_image->tiling);
> +
> +         unsigned dst_start, dst_end;
> +         if (dst_image->type == VK_IMAGE_TYPE_3D) {
> +            assert(dst_res->baseArrayLayer == 0);
> +            dst_start = pRegions[r].dstOffsets[0].z;
> +            dst_end = pRegions[r].dstOffsets[1].z;
> +         } else {
> +            dst_start = dst_res->baseArrayLayer;
> +            dst_end = dst_start + anv_get_layerCount(dst_image, dst_res);
> +         }
>  
> -      if (flip_z) {
> -         src_start = src_end;
> -         src_z_step *= -1;
> -      }
> +         unsigned src_start, src_end;
> +         if (src_image->type == VK_IMAGE_TYPE_3D) {
> +            assert(src_res->baseArrayLayer == 0);
> +            src_start = pRegions[r].srcOffsets[0].z;
> +            src_end = pRegions[r].srcOffsets[1].z;
> +         } else {
> +            src_start = src_res->baseArrayLayer;
> +            src_end = src_start + anv_get_layerCount(src_image, src_res);
> +         }
>  
> -      unsigned src_x0 = pRegions[r].srcOffsets[0].x;
> -      unsigned src_x1 = pRegions[r].srcOffsets[1].x;
> -      unsigned dst_x0 = pRegions[r].dstOffsets[0].x;
> -      unsigned dst_x1 = pRegions[r].dstOffsets[1].x;
> -      bool flip_x = flip_coords(&src_x0, &src_x1, &dst_x0, &dst_x1);
> +         bool flip_z = flip_coords(&src_start, &src_end, &dst_start, &dst_end);
> +         float src_z_step = (float)(src_end + 1 - src_start) /
> +            (float)(dst_end + 1 - dst_start);
>  
> -      unsigned src_y0 = pRegions[r].srcOffsets[0].y;
> -      unsigned src_y1 = pRegions[r].srcOffsets[1].y;
> -      unsigned dst_y0 = pRegions[r].dstOffsets[0].y;
> -      unsigned dst_y1 = pRegions[r].dstOffsets[1].y;
> -      bool flip_y = flip_coords(&src_y0, &src_y1, &dst_y0, &dst_y1);
> +         if (flip_z) {
> +            src_start = src_end;
> +            src_z_step *= -1;
> +         }
>  
> -      const unsigned num_layers = dst_end - dst_start;
> -      anv_cmd_buffer_mark_image_written(cmd_buffer, dst_image,
> -                                        dst_res->aspectMask,
> -                                        dst.aux_usage,
> -                                        dst_res->mipLevel,
> -                                        dst_start, num_layers);
> -
> -      for (unsigned i = 0; i < num_layers; i++) {
> -         unsigned dst_z = dst_start + i;
> -         unsigned src_z = src_start + i * src_z_step;
> -
> -         blorp_blit(&batch, &src, src_res->mipLevel, src_z,
> -                    src_format.isl_format, src_format.swizzle,
> -                    &dst, dst_res->mipLevel, dst_z,
> -                    dst_format.isl_format, dst_format.swizzle,
> -                    src_x0, src_y0, src_x1, src_y1,
> -                    dst_x0, dst_y0, dst_x1, dst_y1,
> -                    blorp_filter, flip_x, flip_y);
> +         unsigned src_x0 = pRegions[r].srcOffsets[0].x;
> +         unsigned src_x1 = pRegions[r].srcOffsets[1].x;
> +         unsigned dst_x0 = pRegions[r].dstOffsets[0].x;
> +         unsigned dst_x1 = pRegions[r].dstOffsets[1].x;
> +         bool flip_x = flip_coords(&src_x0, &src_x1, &dst_x0, &dst_x1);
> +
> +         unsigned src_y0 = pRegions[r].srcOffsets[0].y;
> +         unsigned src_y1 = pRegions[r].srcOffsets[1].y;
> +         unsigned dst_y0 = pRegions[r].dstOffsets[0].y;
> +         unsigned dst_y1 = pRegions[r].dstOffsets[1].y;
> +         bool flip_y = flip_coords(&src_y0, &src_y1, &dst_y0, &dst_y1);
> +
> +         const unsigned num_layers = dst_end - dst_start;
> +         anv_cmd_buffer_mark_image_written(cmd_buffer, dst_image,
> +                                           1U << aspect_bit,
> +                                           dst.aux_usage,
> +                                           dst_res->mipLevel,
> +                                           dst_start, num_layers);
> +
> +         for (unsigned i = 0; i < num_layers; i++) {
> +            unsigned dst_z = dst_start + i;
> +            unsigned src_z = src_start + i * src_z_step;
> +
> +            blorp_blit(&batch, &src, src_res->mipLevel, src_z,
> +                       src_format.isl_format, src_format.swizzle,
> +                       &dst, dst_res->mipLevel, dst_z,
> +                       dst_format.isl_format, dst_format.swizzle,
> +                       src_x0, src_y0, src_x1, src_y1,
> +                       dst_x0, dst_y0, dst_x1, dst_y1,
> +                       blorp_filter, flip_x, flip_y);
> +         }
>        }
> -
>     }
>  
>     blorp_batch_finish(&batch);
> -- 
> 2.18.0

Hi Lionel,

This doesn't apply cleanly to 18.1, it would at the very least need "anv: Allow
blitting to/from any supported format" to apply cleanly, but I suspect that
would in turn require a bunch of blorp patches. If you'd like this pulled into
18.1 please provide a backport or a list of patches you'd like applied,
otherwise I'll just ignore this.

Dylan
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: signature
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180829/8f305b27/attachment-0001.sig>


More information about the mesa-dev mailing list