From e74c3dbb70706f1a2bcf863b5058295fcd456ae4 Mon Sep 17 00:00:00 2001 From: Chia-I Wu Date: Thu, 17 Aug 2023 21:36:23 -0700 Subject: [PATCH] ac/surface: limit RADEON_SURF_NO_TEXTURE to color surfaces For z surfaces, flags.texture should be based on RADEON_SURF_TC_COMPATIBLE_HTILE alone. Otherwise, addrlib could pick a _X/_T swizzle mode for a MSAA depth texture, which is said to be broken: When _X/_T swizzle mode was used for MSAA depth texture, TC will get zplane equation from wrong address within memory range a tile covered and use the garbage data for compressed Z reading which finally leads to corruption. Fixes: de0885cdb89 ("amd/surface: add RADEON_SURF_NO_TEXTURE flag") Part-of: --- src/amd/common/ac_surface.c | 5 ++--- src/amd/common/ac_surface.h | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c index fcccd80..cc47d6e 100644 --- a/src/amd/common/ac_surface.c +++ b/src/amd/common/ac_surface.c @@ -2208,9 +2208,8 @@ static int gfx9_compute_surface(struct ac_addrlib *addrlib, const struct radeon_ AddrSurfInfoIn.flags.depth = (surf->flags & RADEON_SURF_ZBUFFER) != 0; AddrSurfInfoIn.flags.display = get_display_flag(config, surf); /* flags.texture currently refers to TC-compatible HTILE */ - AddrSurfInfoIn.flags.texture = !(surf->flags & RADEON_SURF_NO_TEXTURE) && - (is_color_surface || - surf->flags & RADEON_SURF_TC_COMPATIBLE_HTILE); + AddrSurfInfoIn.flags.texture = (is_color_surface && !(surf->flags & RADEON_SURF_NO_TEXTURE)) || + (surf->flags & RADEON_SURF_TC_COMPATIBLE_HTILE); AddrSurfInfoIn.flags.opt4space = 1; AddrSurfInfoIn.flags.prt = (surf->flags & RADEON_SURF_PRT) != 0; diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h index 6aa5cdd..382eb5d 100644 --- a/src/amd/common/ac_surface.h +++ b/src/amd/common/ac_surface.h @@ -71,8 +71,8 @@ enum radeon_micro_mode #define RADEON_SURF_PRT (1ull << 32) #define RADEON_SURF_VRS_RATE (1ull << 33) /* Block compressed + linear format is not supported in addrlib. These surface can be - * used as transfer resource. This flag indicates not to set flags.texture flag in - * gfx9_compute_surface(). */ + * used as transfer resource. This flag indicates not to set flags.texture flag for + * color surface in gfx9_compute_surface(). */ #define RADEON_SURF_NO_TEXTURE (1ull << 34) #define RADEON_SURF_NO_STENCIL_ADJUST (1ull << 35) -- 2.7.4