From e435ea78e85188e768d3b17b618d92802406a8ed Mon Sep 17 00:00:00 2001 From: David Rosca Date: Wed, 16 Jul 2025 11:34:14 +0200 Subject: [PATCH] ac/surface: Add ac_modifier_supports_video Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/common/ac_surface.c | 25 +++++++++++++++++++++++++ src/amd/common/ac_surface.h | 1 + 2 files changed, 26 insertions(+) diff --git a/src/amd/common/ac_surface.c b/src/amd/common/ac_surface.c index 165b4f1c18a..eaf05cdb7fc 100644 --- a/src/amd/common/ac_surface.c +++ b/src/amd/common/ac_surface.c @@ -148,6 +148,31 @@ bool ac_modifier_supports_dcc_image_stores(enum amd_gfx_level gfx_level, uint64_ } +bool ac_modifier_supports_video(const struct radeon_info *info, uint64_t modifier) +{ + if (ac_modifier_has_dcc(modifier)) { + /* DCC not supported */ + if (info->gfx_level < GFX12) + return false; + + if (info->drm_minor < 63 && + AMD_FMT_MOD_GET(DCC_MAX_COMPRESSED_BLOCK, modifier) == AMD_FMT_MOD_DCC_BLOCK_256B) + return false; + } + + if (modifier != DRM_FORMAT_MOD_LINEAR) { + /* Linear only for UVD/VCE and VCN 1.0 */ + if (info->vcn_ip_version < VCN_2_0_0) + return false; + + /* Only "S" swizzle modes supported */ + if (info->vcn_ip_version < VCN_2_2_0 && + AMD_FMT_MOD_GET(TILE, modifier) != AMD_FMT_MOD_TILE_GFX9_64K_S) + return false; + } + + return true; +} bool ac_surface_supports_dcc_image_stores(enum amd_gfx_level gfx_level, const struct radeon_surf *surf) diff --git a/src/amd/common/ac_surface.h b/src/amd/common/ac_surface.h index c16bd27a9df..33537507daf 100644 --- a/src/amd/common/ac_surface.h +++ b/src/amd/common/ac_surface.h @@ -481,6 +481,7 @@ bool ac_get_supported_modifiers(const struct radeon_info *info, bool ac_modifier_has_dcc(uint64_t modifier); bool ac_modifier_has_dcc_retile(uint64_t modifier); bool ac_modifier_supports_dcc_image_stores(enum amd_gfx_level gfx_level, uint64_t modifier); +bool ac_modifier_supports_video(const struct radeon_info *info, uint64_t modifier); void ac_modifier_max_extent(const struct radeon_info *info, uint64_t modifier, uint32_t *width, uint32_t *height);