From f56e70f230b08811612bc42018b46bb430f42dd1 Mon Sep 17 00:00:00 2001 From: Tomoki Imai Date: Thu, 4 Dec 2025 21:02:09 +0900 Subject: [PATCH] lavapipe: Support VkDrmFormatModifierPropertiesList2EXT This change add support VkDrmFormatModifierPropertiesList2EXT to lavapipe driver. Previously VkDrmFormatModifierPropertiesListExt is already supported and returns a list with one element but VkDrmFormatModifierPropertiesList2EXT returns a empty list. A lack of VkDrmFormatModifierPropertiesList2EXT becomes an issue especially when the Vulkan Validation layers is enabled, it internally uses VkDrmFormatModifierPropertiesList2EXT to confirm the drmFormatModifierTilingFeatures is compatible to VkImageUsageFlagBits. Without this patch it detects that the image is not compatible and outputs warnings. Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/14414 Reviewed-by: Dave Airlie Part-of: --- src/gallium/frontends/lavapipe/lvp_formats.c | 41 +++++++++++++++----- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/src/gallium/frontends/lavapipe/lvp_formats.c b/src/gallium/frontends/lavapipe/lvp_formats.c index 822bbcffab3..80230c85896 100644 --- a/src/gallium/frontends/lavapipe/lvp_formats.c +++ b/src/gallium/frontends/lavapipe/lvp_formats.c @@ -247,17 +247,38 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFormatProperties2( perf->optimal = VK_FALSE; #if DETECT_OS_LINUX - VkDrmFormatModifierPropertiesListEXT *modlist = (void*)vk_find_struct_const(pFormatProperties->pNext, DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT); - if (modlist) { - modlist->drmFormatModifierCount = 0; - if (pFormatProperties->formatProperties.optimalTilingFeatures) { - modlist->drmFormatModifierCount = 1; - VkDrmFormatModifierPropertiesEXT *mods = &modlist->pDrmFormatModifierProperties[0]; - if (mods) { - mods->drmFormatModifier = DRM_FORMAT_MOD_LINEAR; - mods->drmFormatModifierPlaneCount = util_format_get_num_planes(lvp_vk_format_to_pipe_format(format)); - mods->drmFormatModifierTilingFeatures = pFormatProperties->formatProperties.optimalTilingFeatures; + vk_foreach_struct(ext, pFormatProperties->pNext) { + switch ((unsigned)ext->sType) { + case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT: { + struct VkDrmFormatModifierPropertiesListEXT *modlist = (void *)ext; + modlist->drmFormatModifierCount = 0; + if (pFormatProperties->formatProperties.optimalTilingFeatures) { + modlist->drmFormatModifierCount = 1; + VkDrmFormatModifierPropertiesEXT *mods = &modlist->pDrmFormatModifierProperties[0]; + if (mods) { + mods->drmFormatModifier = DRM_FORMAT_MOD_LINEAR; + mods->drmFormatModifierPlaneCount = util_format_get_num_planes(lvp_vk_format_to_pipe_format(format)); + mods->drmFormatModifierTilingFeatures = pFormatProperties->formatProperties.optimalTilingFeatures; + } } + break; + } + case VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_2_EXT: { + struct VkDrmFormatModifierPropertiesList2EXT *modlist = (void *)ext; + modlist->drmFormatModifierCount = 0; + if (format_props.optimalTilingFeatures) { + modlist->drmFormatModifierCount = 1; + VkDrmFormatModifierProperties2EXT *mods = &modlist->pDrmFormatModifierProperties[0]; + if (mods) { + mods->drmFormatModifier = DRM_FORMAT_MOD_LINEAR; + mods->drmFormatModifierPlaneCount = util_format_get_num_planes(lvp_vk_format_to_pipe_format(format)); + mods->drmFormatModifierTilingFeatures = format_props.optimalTilingFeatures; + } + } + break; + } + default: + break; } } #endif