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 <lina@asahilina.net>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/32081>
This commit is contained in:
Asahi Lina
2024-11-10 00:20:54 +09:00
committed by Marge Bot
parent da1601a4ec
commit e5d61631fe
+25 -5
View File
@@ -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);
}