lavapipe: Support VkDrmFormatModifierPropertiesList2EXT
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

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 <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38822>
This commit is contained in:
Tomoki Imai 2025-12-04 21:02:09 +09:00 committed by Tomoki Imai
parent 0574bfd5f4
commit f56e70f230

View file

@ -247,8 +247,10 @@ 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) {
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;
@ -259,6 +261,25 @@ VKAPI_ATTR void VKAPI_CALL lvp_GetPhysicalDeviceFormatProperties2(
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
}