ac/surface: fix is_linear for stencil-only surfaces
authorMarek Olšák <marek.olsak@amd.com>
Thu, 18 May 2023 20:41:36 +0000 (16:41 -0400)
committerMarge Bot <emma+marge@anholt.net>
Thu, 1 Jun 2023 18:46:20 +0000 (18:46 +0000)
Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/23015>

src/amd/common/ac_surface.c

index d5f3d7f..ac7b95a 100644 (file)
@@ -1434,7 +1434,9 @@ static int gfx6_compute_surface(ADDR_HANDLE addrlib, const struct radeon_info *i
       surf->flags &= ~RADEON_SURF_TC_COMPATIBLE_HTILE;
    }
 
-   surf->is_linear = surf->u.legacy.level[0].mode == RADEON_SURF_MODE_LINEAR_ALIGNED;
+   surf->is_linear = (only_stencil ? surf->u.legacy.zs.stencil_level[0].mode :
+                                     surf->u.legacy.level[0].mode) == RADEON_SURF_MODE_LINEAR_ALIGNED;
+
    surf->is_displayable = surf->is_linear || surf->micro_tile_mode == RADEON_MICRO_MODE_DISPLAY ||
                           surf->micro_tile_mode == RADEON_MICRO_MODE_RENDER;
 
@@ -2385,7 +2387,8 @@ static int gfx9_compute_surface(struct ac_addrlib *addrlib, const struct radeon_
          return r;
    }
 
-   surf->is_linear = surf->u.gfx9.swizzle_mode == ADDR_SW_LINEAR;
+   surf->is_linear = (only_stencil ? surf->u.gfx9.zs.stencil_swizzle_mode :
+                                     surf->u.gfx9.swizzle_mode) == ADDR_SW_LINEAR;
 
    /* Query whether the surface is displayable. */
    /* This is only useful for surfaces that are allocated without SCANOUT. */