[Mesa-dev] [PATCH] anv: Properly handle GetImageSubresourceLayout on complex images

Lionel Landwerlin lionel.g.landwerlin at intel.com
Sun Jul 22 20:38:31 UTC 2018


Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>

On 20/07/18 22:51, Jason Ekstrand wrote:
> We support mipmapped and arrayed linear images so we need to support
> vkGetImageSubresourceLayout on them.  Fortunately, it's just a trivial
> call into ISL.
> ---
>   src/intel/vulkan/anv_image.c | 23 ++++++++++++++++-------
>   1 file changed, 16 insertions(+), 7 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c
> index b6a1ac8a4d4..e039e4b7a76 100644
> --- a/src/intel/vulkan/anv_image.c
> +++ b/src/intel/vulkan/anv_image.c
> @@ -763,17 +763,26 @@ void anv_GetImageSubresourceLayout(
>   
>      assert(__builtin_popcount(subresource->aspectMask) == 1);
>   
> -   /* If we are on a non-zero mip level or array slice, we need to
> -    * calculate a real offset.
> -    */
> -   anv_assert(subresource->mipLevel == 0);
> -   anv_assert(subresource->arrayLayer == 0);
> -
>      layout->offset = surface->offset;
>      layout->rowPitch = surface->isl.row_pitch;
>      layout->depthPitch = isl_surf_get_array_pitch(&surface->isl);
>      layout->arrayPitch = isl_surf_get_array_pitch(&surface->isl);
> -   layout->size = surface->isl.size;
> +
> +   if (subresource->mipLevel > 0 || subresource->arrayLayer > 0) {
> +      assert(surface->isl.tiling == ISL_TILING_LINEAR);
> +
> +      uint32_t offset_B;
> +      isl_surf_get_image_offset_B_tile_sa(&surface->isl,
> +                                          subresource->mipLevel,
> +                                          subresource->arrayLayer,
> +                                          0 /* logical_z_offset_px */,
> +                                          &offset_B, NULL, NULL);
> +      layout->offset += offset_B;
> +      layout->size = layout->rowPitch * anv_minify(image->extent.height,
> +                                                   subresource->mipLevel);
> +   } else {
> +      layout->size = surface->isl.size;
> +   }
>   }
>   
>   /**




More information about the mesa-dev mailing list