From 38cf1b38291f936469fb7f54e34b9dfcae727990 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 Part-of: --- src/vulkan/wsi/wsi_common_headless.c | 29 +++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/vulkan/wsi/wsi_common_headless.c b/src/vulkan/wsi/wsi_common_headless.c index 41143268cfa..347b7c224c0 100644 --- a/src/vulkan/wsi/wsi_common_headless.c +++ b/src/vulkan/wsi/wsi_common_headless.c @@ -447,7 +447,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); @@ -466,16 +466,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);