From 696542bd3b4de06411efa88e1dbc453de2df240e Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Thu, 8 Apr 2021 16:10:24 -0400 Subject: [PATCH] zink: populate modifier props onto screen object during init Acked-by: Dave Airlie Reviewed-by: Emil Velikov Part-of: --- src/gallium/drivers/zink/zink_screen.c | 18 ++++++++++++++++++ src/gallium/drivers/zink/zink_screen.h | 6 ++++++ 2 files changed, 24 insertions(+) diff --git a/src/gallium/drivers/zink/zink_screen.c b/src/gallium/drivers/zink/zink_screen.c index 8d45decd194..ecb2b373aa4 100644 --- a/src/gallium/drivers/zink/zink_screen.c +++ b/src/gallium/drivers/zink/zink_screen.c @@ -1463,8 +1463,26 @@ populate_format_props(struct zink_screen *screen) if (screen->vk.GetPhysicalDeviceFormatProperties2) { VkFormatProperties2 props = {0}; props.sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2; + + VkDrmFormatModifierPropertiesListEXT mod_props; + VkDrmFormatModifierPropertiesEXT mods[128]; + if (screen->info.have_EXT_image_drm_format_modifier) { + mod_props.sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT; + mod_props.pNext = NULL; + mod_props.drmFormatModifierCount = ARRAY_SIZE(mods); + mod_props.pDrmFormatModifierProperties = mods; + props.pNext = &mod_props; + } screen->vk.GetPhysicalDeviceFormatProperties2(screen->pdev, format, &props); screen->format_props[i] = props.formatProperties; + if (screen->info.have_EXT_image_drm_format_modifier && mod_props.drmFormatModifierCount) { + screen->modifier_props[i].drmFormatModifierCount = mod_props.drmFormatModifierCount; + screen->modifier_props[i].pDrmFormatModifierProperties = ralloc_array(screen, VkDrmFormatModifierPropertiesEXT, mod_props.drmFormatModifierCount); + if (mod_props.pDrmFormatModifierProperties) { + for (unsigned j = 0; j < mod_props.drmFormatModifierCount; j++) + screen->modifier_props[i].pDrmFormatModifierProperties[j] = mod_props.pDrmFormatModifierProperties[j]; + } + } } else vkGetPhysicalDeviceFormatProperties(screen->pdev, format, &screen->format_props[i]); } diff --git a/src/gallium/drivers/zink/zink_screen.h b/src/gallium/drivers/zink/zink_screen.h index b8af48f726c..da911f958ee 100644 --- a/src/gallium/drivers/zink/zink_screen.h +++ b/src/gallium/drivers/zink/zink_screen.h @@ -61,6 +61,11 @@ enum zink_descriptor_mode { ZINK_DESCRIPTOR_MODE_NOTEMPLATES, }; +struct zink_modifier_prop { + uint32_t drmFormatModifierCount; + VkDrmFormatModifierPropertiesEXT* pDrmFormatModifierProperties; +}; + struct zink_screen { struct pipe_screen base; bool threaded; @@ -144,6 +149,7 @@ struct zink_screen { } driconf; VkFormatProperties format_props[PIPE_FORMAT_COUNT]; + struct zink_modifier_prop modifier_props[PIPE_FORMAT_COUNT]; struct { uint32_t image_view; uint32_t buffer_view;