From fcaab2b921f7355c96cf48ca42c5ed0882e4de7a Mon Sep 17 00:00:00 2001 From: Benjamin Cheng Date: Tue, 14 Apr 2026 09:40:43 -0400 Subject: [PATCH] ac/surface: Filter swizzle modes for VCN This will allow compatible swizzle modes to be picked for RADV (radeonsi filters modifiers when creating video surfaces). This mirrors the logic from ac_modifier_supports_video, and in addition ensures that XOR swizzle modes are disabled for image arrays because VCN does not support slice indices. Reviewed-by: David Rosca Part-of: --- src/amd/common/ac_surface.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c index 84d1c95bf0f..ed9dfec96ee 100644 --- a/src/amd/common/ac_surface.c +++ b/src/amd/common/ac_surface.c @@ -2017,6 +2017,20 @@ static int gfx9_get_preferred_swizzle_mode(struct ac_addrlib *addrlib, const str sin.forbiddenBlock.gfx11.thick256KB = 1; } + if (surf->flags & (RADEON_SURF_DECODE_DST | RADEON_SURF_ENCODE_SRC)) { + assert(info->vcn_ip_version >= VCN_2_0_0); + + /* Only "S" swizzle modes supported */ + if (info->vcn_ip_version < VCN_3_0_0) { + sin.preferredSwSet.value = 0; + sin.preferredSwSet.sw_S = 1; + } + + /* Video cannot support XOR modes for image arrays */ + if (in->numSlices > 1) + sin.noXor = 1; + } + ret = Addr2GetPreferredSurfaceSetting(addrlib->handle, &sin, &sout); if (ret != ADDR_OK) return ret;