From 18606773fe01298bfe6b8ba0578025dd5d7cb731 Mon Sep 17 00:00:00 2001 From: Icenowy Zheng Date: Thu, 12 Mar 2026 12:56:11 +0800 Subject: [PATCH] vulkan/wsi/headless: properly use CPU images for CPU devices Currently the headless WSI unconditionally uses DRM images as WSI images, which isn't proper behavior for working with lavapipe driver, and leads to either error or crash (depending on whether udmabuf is available). Properly setup CPU images instead of DRM images for software-rendering WSI devices. This fixes (at least) `dEQP-VK.wsi.headless.swapchain.render.*` on lavapipe. Fixes: 90caf9bdbd24 ("vulkan/wsi/headless: drop the wsi_create_null_image_mem override") Signed-off-by: Icenowy Zheng Reviewed-by: Yiwei Zhang (cherry picked from commit 38cf1b38291f936469fb7f54e34b9dfcae727990) Part-of: --- .pick_status.json | 2 +- src/vulkan/wsi/wsi_common_headless.c | 29 +++++++++++++++++++--------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/.pick_status.json b/.pick_status.json index 10c450c89da..b1ec55a9c80 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -6414,7 +6414,7 @@ "description": "vulkan/wsi/headless: properly use CPU images for CPU devices", "nominated": true, "nomination_type": 2, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "90caf9bdbd2425f61b0b28483c9d940854d67541", "notes": null diff --git a/src/vulkan/wsi/wsi_common_headless.c b/src/vulkan/wsi/wsi_common_headless.c index c94439899d2..4bcaf13f326 100644 --- a/src/vulkan/wsi/wsi_common_headless.c +++ b/src/vulkan/wsi/wsi_common_headless.c @@ -405,7 +405,7 @@ wsi_headless_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, .sType = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_2, .pNext = &mod_list, }; - if (wsi_device->supports_modifiers) { + if (!wsi_device->sw && wsi_device->supports_modifiers) { wsi_device->GetPhysicalDeviceFormatProperties2( wsi_device->pdevice, pCreateInfo->imageFormat, &props); assert(mod_list.drmFormatModifierCount > 0); @@ -424,16 +424,27 @@ wsi_headless_surface_create_swapchain(VkIcdSurfaceBase *icd_surface, 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, - }; + struct wsi_base_image_params *image_params = NULL; + struct wsi_cpu_image_params cpu_params; + struct wsi_drm_image_params drm_params; + if (wsi_device->sw) { + cpu_params = (struct wsi_cpu_image_params) { + .base.image_type = WSI_IMAGE_TYPE_CPU, + }; + image_params = &cpu_params.base; + } else { + drm_params = (struct wsi_drm_image_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, + }; + image_params = &drm_params.base; + } result = wsi_swapchain_init(wsi_device, &chain->base, device, - pCreateInfo, &drm_params.base, pAllocator); + pCreateInfo, image_params, pAllocator); STACK_ARRAY_FINISH(mods); STACK_ARRAY_FINISH(mod_props);