From 8a0f75c2ca02b3d4b69d91e0833311edbe65d260 Mon Sep 17 00:00:00 2001 From: Yiwei Zhang Date: Thu, 7 Aug 2025 22:11:27 -0700 Subject: [PATCH] vulkan/wsi/headless: allow explicit modifiers When wsi device has modifier support, simply allow all driver supported modifiers for the requested format. Cc: mesa-stable Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/12534 Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/13636 Reviewed-by: Janne Grunau Reviewed-by: Lionel Landwerlin Part-of: (cherry picked from commit 24cb071d47240787d54ca5501ad0042f7fe6e74e) --- .pick_status.json | 2 +- src/vulkan/wsi/wsi_common_headless.c | 33 ++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/.pick_status.json b/.pick_status.json index b7e5a46773b..ceac784ba2e 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -5334,7 +5334,7 @@ "description": "vulkan/wsi/headless: allow explicit modifiers", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": null, "notes": null diff --git a/src/vulkan/wsi/wsi_common_headless.c b/src/vulkan/wsi/wsi_common_headless.c index 7fff55b21ed..9e8c2cdad17 100644 --- a/src/vulkan/wsi/wsi_common_headless.c +++ b/src/vulkan/wsi/wsi_common_headless.c @@ -451,13 +451,46 @@ wsi_headless_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, if (chain == NULL) return VK_ERROR_OUT_OF_HOST_MEMORY; + VkDrmFormatModifierPropertiesListEXT mod_list = { + .sType = VK_STRUCTURE_TYPE_DRM_FORMAT_MODIFIER_PROPERTIES_LIST_EXT, + }; + VkFormatProperties2 props = { + .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, + .pNext = &mod_list, + }; + if (wsi_device->supports_modifiers) { + wsi_device->GetPhysicalDeviceFormatProperties2( + wsi_device->pdevice, pCreateInfo->imageFormat, &props); + assert(mod_list.drmFormatModifierCount > 0); + } + + STACK_ARRAY(VkDrmFormatModifierPropertiesEXT, mod_props, + mod_list.drmFormatModifierCount); + STACK_ARRAY(uint64_t, mods, mod_list.drmFormatModifierCount); + + if (mod_list.drmFormatModifierCount > 0) { + mod_list.pDrmFormatModifierProperties = mod_props; + wsi_device->GetPhysicalDeviceFormatProperties2( + wsi_device->pdevice, pCreateInfo->imageFormat, &props); + + for (uint32_t i = 0; i < mod_list.drmFormatModifierCount; i++) + mods[i] = mod_props[i].drmFormatModifier; + } + struct wsi_drm_image_params drm_params = { .base.image_type = WSI_IMAGE_TYPE_DRM, .same_gpu = true, + .num_modifier_lists = mod_list.drmFormatModifierCount > 0 ? 1 : 0, + .num_modifiers = &mod_list.drmFormatModifierCount, + .modifiers = (const uint64_t **)&mods, }; result = wsi_swapchain_init(wsi_device, &chain->base, device, pCreateInfo, &drm_params.base, pAllocator); + + STACK_ARRAY_FINISH(mods); + STACK_ARRAY_FINISH(mod_props); + if (result != VK_SUCCESS) { vk_free(pAllocator, chain); return result;