[Mesa-dev] [PATCH] anv: blorp: support multiple aspect blits
Jason Ekstrand
jason at jlekstrand.net
Tue Aug 28 17:18:51 UTC 2018
Assuming nothing got lost in the indent, looks good to me.
Reviewed-by: Jason Ekstrand <jason at jlekstrand.net>
On Tue, Aug 28, 2018 at 6:27 AM Lionel Landwerlin <
lionel.g.landwerlin at intel.com> wrote:
> 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
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/mesa-dev/attachments/20180828/51188472/attachment-0001.html>
More information about the mesa-dev
mailing list