From 65596f7053c8e5d840708153468047005dc22db0 Mon Sep 17 00:00:00 2001 From: gyeyoung Date: Mon, 25 May 2026 20:28:24 +0900 Subject: [PATCH] panvk: report DRM format modifiers through List2EXT panvk previously reported DRM format modifiers only through VkDrmFormatModifierPropertiesListEXT. Report them through VkDrmFormatModifierPropertiesList2EXT as well. Cc: mesa-stable Signed-off-by: Gyeyoung Baek Reviewed-by: Christoph Pillmayer Part-of: --- src/panfrost/vulkan/panvk_physical_device.c | 81 ++++++++++++++++----- 1 file changed, 61 insertions(+), 20 deletions(-) diff --git a/src/panfrost/vulkan/panvk_physical_device.c b/src/panfrost/vulkan/panvk_physical_device.c index fcf11025b71..9bdf02d88c6 100644 --- a/src/panfrost/vulkan/panvk_physical_device.c +++ b/src/panfrost/vulkan/panvk_physical_device.c @@ -971,39 +971,80 @@ panvk_GetPhysicalDeviceFormatProperties2(VkPhysicalDevice physicalDevice, formatProperties3->bufferFeatures = buffer; } + PAN_SUPPORTED_MODIFIERS(supported); + uint64_t afbc_modifiers[ARRAY_SIZE(supported)]; + uint32_t afbc_modifier_count = 0; + if (PANVK_DEBUG(WSI_AFBC) && + pan_afbc_supports_format(arch, vk_format_to_pipe_format(format))) { + for (uint32_t mi = 0; mi < ARRAY_SIZE(supported); mi++) { + if (drm_is_afbc(supported[mi])) + afbc_modifiers[afbc_modifier_count++] = supported[mi]; + } + } VkDrmFormatModifierPropertiesListEXT *list = vk_find_struct( pFormatProperties->pNext, DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT); if (list) { + VkFormatFeatureFlags optimal_features = + pFormatProperties->formatProperties.optimalTilingFeatures; + VkFormatFeatureFlags linear_features = + pFormatProperties->formatProperties.linearTilingFeatures; + VK_OUTARRAY_MAKE_TYPED(VkDrmFormatModifierPropertiesEXT, out, - list->pDrmFormatModifierProperties, - &list->drmFormatModifierCount); - if (pFormatProperties->formatProperties.optimalTilingFeatures && - PANVK_DEBUG(WSI_AFBC)) - { - PAN_SUPPORTED_MODIFIERS(supported); - for (int mi = 0; mi < ARRAY_SIZE(supported); mi++) { - if (drm_is_afbc(supported[mi]) && - pan_afbc_supports_format(arch, vk_format_to_pipe_format(format))) + list->pDrmFormatModifierProperties, + &list->drmFormatModifierCount); + + if (optimal_features) { + for (uint32_t i = 0; i < afbc_modifier_count; i++) { + vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, + mod_props) { - vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, mod_props) - { - mod_props->drmFormatModifier = supported[mi]; - mod_props->drmFormatModifierPlaneCount = 1; - mod_props->drmFormatModifierTilingFeatures = - pFormatProperties->formatProperties.optimalTilingFeatures; - } + mod_props->drmFormatModifier = afbc_modifiers[i]; + mod_props->drmFormatModifierPlaneCount = 1; + mod_props->drmFormatModifierTilingFeatures = optimal_features; } } } - if (pFormatProperties->formatProperties.linearTilingFeatures) { + if (linear_features) { vk_outarray_append_typed(VkDrmFormatModifierPropertiesEXT, &out, - mod_props) + mod_props) { mod_props->drmFormatModifier = DRM_FORMAT_MOD_LINEAR; mod_props->drmFormatModifierPlaneCount = 1; - mod_props->drmFormatModifierTilingFeatures = - pFormatProperties->formatProperties.linearTilingFeatures; + mod_props->drmFormatModifierTilingFeatures = linear_features; + } + } + } + VkDrmFormatModifierPropertiesList2EXT *list2 = vk_find_struct( + pFormatProperties->pNext, DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT); + if (list2) { + VkFormatFeatureFlags2 optimal_features2 = tex; + VkFormatFeatureFlags2 linear_features2 = tex; + + VK_OUTARRAY_MAKE_TYPED(VkDrmFormatModifierProperties2EXT, out, + list2->pDrmFormatModifierProperties, + &list2->drmFormatModifierCount); + + if (optimal_features2) { + for (uint32_t i = 0; i < afbc_modifier_count; i++) { + vk_outarray_append_typed(VkDrmFormatModifierProperties2EXT, &out, + mod_props) + { + mod_props->drmFormatModifier = afbc_modifiers[i]; + mod_props->drmFormatModifierPlaneCount = 1; + mod_props->drmFormatModifierTilingFeatures = + optimal_features2; + } + } + } + + if (linear_features2) { + vk_outarray_append_typed(VkDrmFormatModifierProperties2EXT, &out, + mod_props) + { + mod_props->drmFormatModifier = DRM_FORMAT_MOD_LINEAR; + mod_props->drmFormatModifierPlaneCount = 1; + mod_props->drmFormatModifierTilingFeatures = linear_features2; } } }