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

2018-08-30 Thread Dylan Baker
Quoting Lionel Landwerlin (2018-08-30 06:42:06)
> Newer blit tests are enabling depth 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 
> Fixes: 9f44745eca0e41 ("anv: Use blorp to implement VkBlitImage")
> Reviewed-by: Jason Ekstrand 
> (cherry picked from commit 5a1c23d1502d275c4d554c586bf029e66131f4ac)
> ---
>  src/intel/vulkan/anv_blorp.c | 146 ++-
>  1 file changed, 75 insertions(+), 71 deletions(-)
> 
> diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
> index 68e2ed65c29..37f68790889 100644
> --- a/src/intel/vulkan/anv_blorp.c
> +++ b/src/intel/vulkan/anv_blorp.c
> @@ -533,82 +533,86 @@ void anv_CmdBlitImage(
>const VkImageSubresourceLayers *src_res = [r].srcSubresource;
>const VkImageSubresourceLayers *dst_res = [r].dstSubresource;
>  
> -  get_blorp_surf_for_anv_image(cmd_buffer->device,
> -   src_image, src_res->aspectMask,
> -   srcImageLayout, ISL_AUX_USAGE_NONE, );
> -  get_blorp_surf_for_anv_image(cmd_buffer->device,
> -   dst_image, dst_res->aspectMask,
> -   dstImageLayout, ISL_AUX_USAGE_NONE, );
> -
> -  struct anv_format_plane src_format =
> - anv_get_format_plane(_buffer->device->info, 
> src_image->vk_format,
> -  src_res->aspectMask, src_image->tiling);
> -  struct anv_format_plane dst_format =
> - anv_get_format_plane(_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(_start, _end, _start, _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, 
> );
> + get_blorp_surf_for_anv_image(cmd_buffer->device,
> +  dst_image, 1U << aspect_bit,
> +  dstImageLayout, ISL_AUX_USAGE_NONE, 
> );
> +
> + struct anv_format_plane src_format =
> +anv_get_format_plane(_buffer->device->info, 
> src_image->vk_format,
> + 1U << aspect_bit, src_image->tiling);
> + struct anv_format_plane dst_format =
> +anv_get_format_plane(_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 

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

2018-08-30 Thread Lionel Landwerlin
Newer blit tests are enabling depth 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 
Fixes: 9f44745eca0e41 ("anv: Use blorp to implement VkBlitImage")
Reviewed-by: Jason Ekstrand 
(cherry picked from commit 5a1c23d1502d275c4d554c586bf029e66131f4ac)
---
 src/intel/vulkan/anv_blorp.c | 146 ++-
 1 file changed, 75 insertions(+), 71 deletions(-)

diff --git a/src/intel/vulkan/anv_blorp.c b/src/intel/vulkan/anv_blorp.c
index 68e2ed65c29..37f68790889 100644
--- a/src/intel/vulkan/anv_blorp.c
+++ b/src/intel/vulkan/anv_blorp.c
@@ -533,82 +533,86 @@ void anv_CmdBlitImage(
   const VkImageSubresourceLayers *src_res = [r].srcSubresource;
   const VkImageSubresourceLayers *dst_res = [r].dstSubresource;
 
-  get_blorp_surf_for_anv_image(cmd_buffer->device,
-   src_image, src_res->aspectMask,
-   srcImageLayout, ISL_AUX_USAGE_NONE, );
-  get_blorp_surf_for_anv_image(cmd_buffer->device,
-   dst_image, dst_res->aspectMask,
-   dstImageLayout, ISL_AUX_USAGE_NONE, );
-
-  struct anv_format_plane src_format =
- anv_get_format_plane(_buffer->device->info, src_image->vk_format,
-  src_res->aspectMask, src_image->tiling);
-  struct anv_format_plane dst_format =
- anv_get_format_plane(_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(_start, _end, _start, _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, 
);
+ get_blorp_surf_for_anv_image(cmd_buffer->device,
+  dst_image, 1U << aspect_bit,
+  dstImageLayout, ISL_AUX_USAGE_NONE, 
);
+
+ struct anv_format_plane src_format =
+anv_get_format_plane(_buffer->device->info, 
src_image->vk_format,
+ 1U << aspect_bit, src_image->tiling);
+ struct anv_format_plane dst_format =
+anv_get_format_plane(_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(_x0, _x1, _x0, _x1);
+ bool flip_z = flip_coords(_start, _end, _start, _end);
+ float src_z_step = (float)(src_end + 1 - src_start) /
+(float)(dst_end + 1 - dst_start);
 
- 

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

2018-08-29 Thread Dylan Baker
Quoting Lionel Landwerlin (2018-08-28 04:27:13)
> Newer blit tests are enabling depth 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 
> 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 = [r].srcSubresource;
>const VkImageSubresourceLayers *dst_res = [r].dstSubresource;
>  
> -  get_blorp_surf_for_anv_image(cmd_buffer->device,
> -   src_image, src_res->aspectMask,
> -   srcImageLayout, ISL_AUX_USAGE_NONE, );
> -  get_blorp_surf_for_anv_image(cmd_buffer->device,
> -   dst_image, dst_res->aspectMask,
> -   dstImageLayout, ISL_AUX_USAGE_NONE, );
> -
> -  struct anv_format_plane src_format =
> - anv_get_format_plane(_buffer->device->info, 
> src_image->vk_format,
> -  src_res->aspectMask, src_image->tiling);
> -  struct anv_format_plane dst_format =
> - anv_get_format_plane(_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(_start, _end, _start, _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, 
> );
> + get_blorp_surf_for_anv_image(cmd_buffer->device,
> +  dst_image, 1U << aspect_bit,
> +  dstImageLayout, ISL_AUX_USAGE_NONE, 
> );
> +
> + struct anv_format_plane src_format =
> +anv_get_format_plane(_buffer->device->info, 
> src_image->vk_format,
> + 1U << aspect_bit, src_image->tiling);
> + struct anv_format_plane dst_format =
> +anv_get_format_plane(_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(_x0, _x1, _x0, _x1);
> + 

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

2018-08-28 Thread Lionel Landwerlin

Thanks a lot!

Looks like reviewing patches on gitlab could really help ;)

-
Lionel

On 28/08/2018 18:18, Jason Ekstrand wrote:

Assuming nothing got lost in the indent, looks good to me.

Reviewed-by: Jason Ekstrand >


On Tue, Aug 28, 2018 at 6:27 AM Lionel Landwerlin 
mailto:lionel.g.landwer...@intel.com>> 
wrote:


Newer blit tests are enabling depth 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 mailto:lionel.g.landwer...@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 =
[r].srcSubresource;
       const VkImageSubresourceLayers *dst_res =
[r].dstSubresource;

-      get_blorp_surf_for_anv_image(cmd_buffer->device,
-                                   src_image, src_res->aspectMask,
-                                   srcImageLayout,
ISL_AUX_USAGE_NONE, );
-      get_blorp_surf_for_anv_image(cmd_buffer->device,
-                                   dst_image, dst_res->aspectMask,
-                                   dstImageLayout,
ISL_AUX_USAGE_NONE, );
-
-      struct anv_format_plane src_format =
-  anv_get_format_plane(_buffer->device->info,
src_image->vk_format,
-                              src_res->aspectMask,
src_image->tiling);
-      struct anv_format_plane dst_format =
-  anv_get_format_plane(_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(_start, _end, _start,
_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, );
+         get_blorp_surf_for_anv_image(cmd_buffer->device,
+                                      dst_image, 1U << aspect_bit,
+                                      dstImageLayout,
ISL_AUX_USAGE_NONE, );
+
+         struct anv_format_plane src_format =
+ anv_get_format_plane(_buffer->device->info,
src_image->vk_format,
+                                 1U << aspect_bit,
src_image->tiling);
+         struct anv_format_plane dst_format =
+ anv_get_format_plane(_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;
+            

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

2018-08-28 Thread Jason Ekstrand
Assuming nothing got lost in the indent, looks good to me.

Reviewed-by: Jason Ekstrand 

On Tue, Aug 28, 2018 at 6:27 AM Lionel Landwerlin <
lionel.g.landwer...@intel.com> wrote:

> Newer blit tests are enabling depth 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 
> 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 =
> [r].srcSubresource;
>const VkImageSubresourceLayers *dst_res =
> [r].dstSubresource;
>
> -  get_blorp_surf_for_anv_image(cmd_buffer->device,
> -   src_image, src_res->aspectMask,
> -   srcImageLayout, ISL_AUX_USAGE_NONE,
> );
> -  get_blorp_surf_for_anv_image(cmd_buffer->device,
> -   dst_image, dst_res->aspectMask,
> -   dstImageLayout, ISL_AUX_USAGE_NONE,
> );
> -
> -  struct anv_format_plane src_format =
> - anv_get_format_plane(_buffer->device->info,
> src_image->vk_format,
> -  src_res->aspectMask, src_image->tiling);
> -  struct anv_format_plane dst_format =
> - anv_get_format_plane(_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(_start, _end, _start,
> _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,
> );
> + get_blorp_surf_for_anv_image(cmd_buffer->device,
> +  dst_image, 1U << aspect_bit,
> +  dstImageLayout, ISL_AUX_USAGE_NONE,
> );
> +
> + struct anv_format_plane src_format =
> +anv_get_format_plane(_buffer->device->info,
> src_image->vk_format,
> + 1U << aspect_bit, src_image->tiling);
> + struct anv_format_plane dst_format =
> +anv_get_format_plane(_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 = 

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

2018-08-28 Thread Lionel Landwerlin
Newer blit tests are enabling depth 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 
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 = [r].srcSubresource;
   const VkImageSubresourceLayers *dst_res = [r].dstSubresource;
 
-  get_blorp_surf_for_anv_image(cmd_buffer->device,
-   src_image, src_res->aspectMask,
-   srcImageLayout, ISL_AUX_USAGE_NONE, );
-  get_blorp_surf_for_anv_image(cmd_buffer->device,
-   dst_image, dst_res->aspectMask,
-   dstImageLayout, ISL_AUX_USAGE_NONE, );
-
-  struct anv_format_plane src_format =
- anv_get_format_plane(_buffer->device->info, src_image->vk_format,
-  src_res->aspectMask, src_image->tiling);
-  struct anv_format_plane dst_format =
- anv_get_format_plane(_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(_start, _end, _start, _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, 
);
+ get_blorp_surf_for_anv_image(cmd_buffer->device,
+  dst_image, 1U << aspect_bit,
+  dstImageLayout, ISL_AUX_USAGE_NONE, 
);
+
+ struct anv_format_plane src_format =
+anv_get_format_plane(_buffer->device->info, 
src_image->vk_format,
+ 1U << aspect_bit, src_image->tiling);
+ struct anv_format_plane dst_format =
+anv_get_format_plane(_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(_x0, _x1, _x0, _x1);
+ bool flip_z = flip_coords(_start, _end, _start, _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 =