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 <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/38822>
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user