From e5d61631fe394a2005c769b7e7b6765cff98451a Mon Sep 17 00:00:00 2001 From: Asahi Lina Date: Sun, 10 Nov 2024 00:20:54 +0900 Subject: [PATCH] hk: Fix DRM modifier selection for compressed surfaces We have to reject DRM_FORMAT_MOD_APPLE_TWIDDLED_COMPRESSED for surfaces which are too small. Since the modifier is for all planes, that means that for multiplane images we need to test all planes for compression support. Signed-off-by: Asahi Lina Part-of: --- src/asahi/vulkan/hk_image.c | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/src/asahi/vulkan/hk_image.c b/src/asahi/vulkan/hk_image.c index 4beb9b72ff3..b108a93543d 100644 --- a/src/asahi/vulkan/hk_image.c +++ b/src/asahi/vulkan/hk_image.c @@ -659,6 +659,15 @@ hk_GetPhysicalDeviceSparseImageFormatProperties2( } } +static bool +hk_can_compress_create_info(struct hk_device *dev, unsigned plane, + const VkImageCreateInfo *info) +{ + return hk_can_compress(&dev->dev, info->format, plane, info->extent.width, + info->extent.height, info->samples, info->flags, + info->usage, info->pNext); +} + static enum ail_tiling hk_map_tiling(struct hk_device *dev, const VkImageCreateInfo *info, unsigned plane, uint64_t modifier) @@ -668,9 +677,7 @@ hk_map_tiling(struct hk_device *dev, const VkImageCreateInfo *info, return AIL_TILING_LINEAR; case VK_IMAGE_TILING_OPTIMAL: - if (hk_can_compress(&dev->dev, info->format, plane, info->extent.width, - info->extent.height, info->samples, info->flags, - info->usage, info->pNext)) { + if (hk_can_compress_create_info(dev, plane, info)) { return AIL_TILING_TWIDDLED_COMPRESSED; } else { return AIL_TILING_TWIDDLED; @@ -703,12 +710,24 @@ modifier_get_score(uint64_t mod) } static uint64_t -choose_drm_format_mod(uint32_t modifier_count, const uint64_t *modifiers) +choose_drm_format_mod(struct hk_device *dev, uint8_t plane_count, + const VkImageCreateInfo *info, uint32_t modifier_count, + const uint64_t *modifiers) { uint64_t best_mod = UINT64_MAX; uint32_t best_score = 0; + bool can_compress = true; + + for (uint8_t plane = 0; plane < plane_count; plane++) { + if (!hk_can_compress_create_info(dev, plane, info)) + can_compress = false; + } for (uint32_t i = 0; i < modifier_count; ++i) { + if (!can_compress && + modifiers[i] == DRM_FORMAT_MOD_APPLE_TWIDDLED_COMPRESSED) + continue; + uint32_t score = modifier_get_score(modifiers[i]); if (score > best_score) { best_mod = modifiers[i]; @@ -777,7 +796,8 @@ hk_image_init(struct hk_device *dev, struct hk_image *image, pCreateInfo->pNext, IMAGE_DRM_FORMAT_MODIFIER_LIST_CREATE_INFO_EXT); - modifier = choose_drm_format_mod(mod_list_info->drmFormatModifierCount, + modifier = choose_drm_format_mod(dev, image->plane_count, pCreateInfo, + mod_list_info->drmFormatModifierCount, mod_list_info->pDrmFormatModifiers); }