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 <gye976@gmail.com>
Reviewed-by: Christoph Pillmayer <christoph.pillmayer@arm.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41772>
This commit is contained in:
gyeyoung 2026-05-25 20:28:24 +09:00 committed by Marge Bot
parent ff6e4fc335
commit 65596f7053

View file

@ -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;
}
}
}