[Mesa-dev] [PATCH 11/12] anv/image: Use RENDER_SURFACE_STATE::X/Y Offset on SKL+
Lionel Landwerlin
lionel.g.landwerlin at intel.com
Wed Sep 20 15:39:28 UTC 2017
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin at intel.com>
On 15/09/17 17:01, Jason Ekstrand wrote:
> The Broadawell method of handling uncompressed views of compressed
s/Broadawell/Broadwell/
> textures was to make the texture linear and have a tiled shadow copy.
> This isn't needed on Sky Lake because the HALIGN and VALIGN parameters
> are specified in surface elements and required to be a multiple of 4.
> This means that we can just use the X/Y Offset fields and we can avoid
> the shadow copy song and dance. This also makes ASTC work because ASTC
> can't be linear and so the shadow copy method doesn't work there.
> ---
> 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 e6e3250..3647822 100644
> --- a/src/intel/vulkan/anv_image.c
> +++ b/src/intel/vulkan/anv_image.c
> @@ -236,11 +236,14 @@ make_surface(const struct anv_device *dev,
> assert(format != ISL_FORMAT_UNSUPPORTED);
>
> /* If an image is created as BLOCK_TEXEL_VIEW_COMPATIBLE, then we need to
> - * fall back to linear because we aren't guaranteed that we can handle
> - * offsets correctly.
> + * fall back to linear on Broadwell and earlier because we aren't
> + * guaranteed that we can handle offsets correctly. On Sky Lake, the
> + * horizontal and vertical alignments are sufficiently high that we can
> + * just use RENDER_SURFACE_STATE::X/Y Offset.
> */
> bool needs_shadow = false;
> - if ((vk_info->flags & VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR) &&
> + if (dev->info.gen <= 8 &&
> + (vk_info->flags & VK_IMAGE_CREATE_BLOCK_TEXEL_VIEW_COMPATIBLE_BIT_KHR) &&
> vk_info->tiling == VK_IMAGE_TILING_OPTIMAL) {
> assert(isl_format_is_compressed(format));
> tiling_flags = ISL_TILING_LINEAR_BIT;
> @@ -815,12 +818,16 @@ anv_image_fill_surface_state(struct anv_device *device,
> DIV_ROUND_UP(tmp_surf.logical_level0_px.height, fmtl->bh);
> tmp_surf.phys_level0_sa.width /= fmtl->bw;
> tmp_surf.phys_level0_sa.height /= fmtl->bh;
> + tile_x_sa /= fmtl->bw;
> + tile_y_sa /= fmtl->bh;
>
> isl_surf = &tmp_surf;
>
> - assert(surface->isl.tiling == ISL_TILING_LINEAR);
> - assert(tile_x_sa == 0);
> - assert(tile_y_sa == 0);
> + if (device->info.gen <= 8) {
> + assert(surface->isl.tiling == ISL_TILING_LINEAR);
> + assert(tile_x_sa == 0);
> + assert(tile_y_sa == 0);
> + }
> }
>
> isl_surf_fill_state(&device->isl_dev, state_inout->state.map,
> @@ -831,7 +838,9 @@ anv_image_fill_surface_state(struct anv_device *device,
> .aux_surf = &image->aux_surface.isl,
> .aux_usage = aux_usage,
> .aux_address = aux_address,
> - .mocs = device->default_mocs);
> + .mocs = device->default_mocs,
> + .x_offset_sa = tile_x_sa,
> + .y_offset_sa = tile_y_sa);
> state_inout->address = address + offset_B;
> if (device->info.gen >= 8) {
> state_inout->aux_address = aux_address;
More information about the mesa-dev
mailing list