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:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user