From 580381d9e7f5bb63cece6e582adb82e4659e4523 Mon Sep 17 00:00:00 2001 From: Emma Anholt Date: Thu, 22 Jan 2026 12:37:20 -0800 Subject: [PATCH] vulkan/wsi/display: Check with an atomic commit if the swapchain fails. The TEST_ONLY flag lets you run your display configuration past the driver to see if it exceeds any of the many arbitrary hardware limits that can't be expressed through the limited properties that DRM exposes. This maps quite well to VK_ERROR_INITIALIZATION_FAILED. Fixes dEQP-VK.wsi.direct_drm.colorspace.basic failure on my anv CFL system, where we exceeded the primary plane's width restriction for the specific tiling format chosen. Closes: #14314 Part-of: --- src/amd/ci/radv-gfx1201-fails.txt | 12 ----------- src/amd/ci/radv-raven-fails.txt | 3 --- src/amd/ci/radv-renoir-fails.txt | 30 ++++---------------------- src/amd/ci/radv-stoney-fails.txt | 3 --- src/amd/ci/radv-vangogh-fails.txt | 24 --------------------- src/vulkan/wsi/wsi_common_display.c | 33 ++++++++++++++++++++++++++--- 6 files changed, 34 insertions(+), 71 deletions(-) diff --git a/src/amd/ci/radv-gfx1201-fails.txt b/src/amd/ci/radv-gfx1201-fails.txt index a684826774e..f036ab8276c 100644 --- a/src/amd/ci/radv-gfx1201-fails.txt +++ b/src/amd/ci/radv-gfx1201-fails.txt @@ -106,18 +106,6 @@ dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r12x4g12x4_unorm_2pack dEQP-VK.wsi.direct_drm.colorspace.basic,Fail dEQP-VK.wsi.direct_drm.colorspace.hdr,Fail -dEQP-VK.wsi.direct_drm.incremental_present.scale_none.fifo.identity.opaque.incremental_present,Fail -dEQP-VK.wsi.direct_drm.incremental_present.scale_none.fifo.identity.opaque.reference,Fail -dEQP-VK.wsi.direct_drm.maintenance1.deferred_alloc.fifo.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.deferred_alloc.fifo.bind_image,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_fence.fifo.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_fence.fifo.ordering,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_modes.fifo.change_modes,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.release_before_present,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire_release_before_retire,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window,Fail # deqp-vk: ../src/vulkan/wsi/wsi_common.c:2579: wsi_common_create_swapchain_image: Assertion `pCreateInfo->extent.width == swcInfo->extent.width' failed. dEQP-VK.wsi.direct_drm.swapchain.create.image_swapchain_create_info_concurrent,Crash diff --git a/src/amd/ci/radv-raven-fails.txt b/src/amd/ci/radv-raven-fails.txt index db4f046f561..08d56e828c8 100644 --- a/src/amd/ci/radv-raven-fails.txt +++ b/src/amd/ci/radv-raven-fails.txt @@ -105,9 +105,6 @@ dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r12x4g12x4_unorm_2pack dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r12x4g12x4_unorm_2pack16.512_256_1,Crash dEQP-VK.wsi.direct.colorspace.hdr,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.resize_window,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire_release_before_retire,Fail # deqp-vk: ../src/vulkan/wsi/wsi_common.c:2579: wsi_common_create_swapchain_image: Assertion `pCreateInfo->extent.width == swcInfo->extent.width' failed. dEQP-VK.wsi.direct.swapchain.simulate_oom.image_swapchain_create_info_concurrent,Crash diff --git a/src/amd/ci/radv-renoir-fails.txt b/src/amd/ci/radv-renoir-fails.txt index 48be444450d..124a979033e 100644 --- a/src/amd/ci/radv-renoir-fails.txt +++ b/src/amd/ci/radv-renoir-fails.txt @@ -169,21 +169,12 @@ dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r12x4g12x4_unorm_2pack dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r12x4g12x4_unorm_2pack16.503_137_1,Crash dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r12x4g12x4_unorm_2pack16.512_256_1,Crash +# Probably https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/6287 +dEQP-VK.wsi.direct_drm.present_timing.time_domain.present_stage_calibration,Fail +dEQP-VK.wsi.direct.present_timing.time_domain.present_stage_calibration,Fail + dEQP-VK.wsi.direct_drm.colorspace.basic,Fail dEQP-VK.wsi.direct_drm.colorspace.hdr,Fail -dEQP-VK.wsi.direct_drm.incremental_present.scale_none.fifo.identity.opaque.incremental_present,Fail -dEQP-VK.wsi.direct_drm.incremental_present.scale_none.fifo.identity.opaque.reference,Fail -dEQP-VK.wsi.direct_drm.maintenance1.deferred_alloc.fifo.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.deferred_alloc.fifo.bind_image,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_fence.fifo.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_fence.fifo.ordering,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_modes.fifo.change_modes,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.release_before_present,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire_release_before_retire,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window,Fail -dEQP-VK.wsi.direct_drm.present_timing.time_domain.present_stage_calibration,Fail dEQP-VK.wsi.direct_drm.swapchain.create.image_sharing_mode,Crash dEQP-VK.wsi.direct_drm.swapchain.create.image_swapchain_create_info_concurrent,Crash dEQP-VK.wsi.direct_drm.swapchain.create.image_swapchain_create_info,Crash @@ -192,19 +183,6 @@ dEQP-VK.wsi.direct_drm.swapchain.simulate_oom.image_swapchain_create_info_concur dEQP-VK.wsi.direct_drm.swapchain.simulate_oom.image_swapchain_create_info,Crash dEQP-VK.wsi.direct.colorspace.basic,Fail dEQP-VK.wsi.direct.colorspace.hdr,Fail -dEQP-VK.wsi.direct.incremental_present.scale_none.fifo.identity.opaque.incremental_present,Fail -dEQP-VK.wsi.direct.incremental_present.scale_none.fifo.identity.opaque.reference,Fail -dEQP-VK.wsi.direct.maintenance1.deferred_alloc.fifo.basic,Fail -dEQP-VK.wsi.direct.maintenance1.deferred_alloc.fifo.bind_image,Fail -dEQP-VK.wsi.direct.maintenance1.present_fence.fifo.basic,Fail -dEQP-VK.wsi.direct.maintenance1.present_fence.fifo.ordering,Fail -dEQP-VK.wsi.direct.maintenance1.present_modes.fifo.change_modes,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.basic,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.release_before_present,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire_release_before_retire,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.resize_window,Fail -dEQP-VK.wsi.direct.present_timing.time_domain.present_stage_calibration,Fail dEQP-VK.wsi.direct.swapchain.create.image_sharing_mode,Crash dEQP-VK.wsi.direct.swapchain.create.image_swapchain_create_info_concurrent,Crash dEQP-VK.wsi.direct.swapchain.create.image_swapchain_create_info,Crash diff --git a/src/amd/ci/radv-stoney-fails.txt b/src/amd/ci/radv-stoney-fails.txt index 8c5ac91efc0..0ecc844274d 100644 --- a/src/amd/ci/radv-stoney-fails.txt +++ b/src/amd/ci/radv-stoney-fails.txt @@ -1,5 +1,2 @@ # See https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9049 dEQP-VK.pipeline.timestamp.calibrated.calibration_test,Fail - -dEQP-VK.wsi.direct_drm.incremental_present.scale_none.fifo.identity.opaque.reference,Fail -dEQP-VK.wsi.direct_drm.incremental_present.scale_none.fifo.identity.opaque.incremental_present,Fail diff --git a/src/amd/ci/radv-vangogh-fails.txt b/src/amd/ci/radv-vangogh-fails.txt index 2799b6b4f41..8af1130c40b 100644 --- a/src/amd/ci/radv-vangogh-fails.txt +++ b/src/amd/ci/radv-vangogh-fails.txt @@ -107,36 +107,12 @@ dEQP-VK.sparse_resources.shader_intrinsics.2d_sparse_read.r12x4g12x4_unorm_2pack dEQP-VK.wsi.direct_drm.colorspace.basic,Fail dEQP-VK.wsi.direct_drm.colorspace.hdr,Fail -dEQP-VK.wsi.direct_drm.incremental_present.scale_none.fifo.identity.opaque.incremental_present,Fail -dEQP-VK.wsi.direct_drm.incremental_present.scale_none.fifo.identity.opaque.reference,Fail -dEQP-VK.wsi.direct_drm.maintenance1.deferred_alloc.fifo.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.deferred_alloc.fifo.bind_image,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_fence.fifo.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_fence.fifo.ordering,Fail -dEQP-VK.wsi.direct_drm.maintenance1.present_modes.fifo.change_modes,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.basic,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.release_before_present,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire_release_before_retire,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire,Fail -dEQP-VK.wsi.direct_drm.maintenance1.release_images.fifo.no_scaling.resize_window,Fail dEQP-VK.wsi.direct_drm.swapchain.create.image_swapchain_create_info_concurrent,Crash dEQP-VK.wsi.direct_drm.swapchain.create.image_swapchain_create_info,Crash dEQP-VK.wsi.direct_drm.swapchain.simulate_oom.image_swapchain_create_info_concurrent,Crash dEQP-VK.wsi.direct_drm.swapchain.simulate_oom.image_swapchain_create_info,Crash dEQP-VK.wsi.direct.colorspace.basic,Fail dEQP-VK.wsi.direct.colorspace.hdr,Fail -dEQP-VK.wsi.direct.incremental_present.scale_none.fifo.identity.opaque.incremental_present,Fail -dEQP-VK.wsi.direct.incremental_present.scale_none.fifo.identity.opaque.reference,Fail -dEQP-VK.wsi.direct.maintenance1.deferred_alloc.fifo.basic,Fail -dEQP-VK.wsi.direct.maintenance1.deferred_alloc.fifo.bind_image,Fail -dEQP-VK.wsi.direct.maintenance1.present_fence.fifo.basic,Fail -dEQP-VK.wsi.direct.maintenance1.present_fence.fifo.ordering,Fail -dEQP-VK.wsi.direct.maintenance1.present_modes.fifo.change_modes,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.basic,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.release_before_present,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire_release_before_retire,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.resize_window_after_acquire,Fail -dEQP-VK.wsi.direct.maintenance1.release_images.fifo.no_scaling.resize_window,Fail dEQP-VK.wsi.direct.swapchain.create.image_swapchain_create_info_concurrent,Crash dEQP-VK.wsi.direct.swapchain.create.image_swapchain_create_info,Crash dEQP-VK.wsi.direct.swapchain.simulate_oom.image_swapchain_create_info_concurrent,Crash diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index 2b599ed9b9b..8717f2310d1 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -2860,7 +2860,7 @@ _wsi_display_convert_hdr_metadata(VkHdrMetadataEXT *pMetadata, uint8_t hdmi_eotf } static int -drm_atomic_commit(wsi_display_connector *connector, struct wsi_display_image *image) +drm_atomic_commit(wsi_display_connector *connector, struct wsi_display_image *image, bool test_only) { const drmModeModeInfo *mode = &connector->current_drm_mode; int fd = connector->wsi->fd; @@ -2947,6 +2947,11 @@ drm_atomic_commit(wsi_display_connector *connector, struct wsi_display_image *im drmModeAtomicAddProperty(req, plane_id, prop[CRTC_W], mode->hdisplay); drmModeAtomicAddProperty(req, plane_id, prop[CRTC_H], mode->vdisplay); + if (test_only) { + flags |= DRM_MODE_ATOMIC_TEST_ONLY; + flags &= ~DRM_MODE_PAGE_FLIP_EVENT; + } + ret = drmModeAtomicCommit(fd, req, flags, image); if (ret) goto out; @@ -2977,7 +2982,7 @@ _wsi_display_cleanup_state(struct wsi_display_swapchain *chain) if (chain->color_outcome_serial) { chain->color_outcome_serial = 0; chain->base.image_info.color_space = VK_COLOR_SPACE_SRGB_NONLINEAR_KHR; - drm_atomic_commit(connector, &chain->images[0]); + drm_atomic_commit(connector, &chain->images[0], false); } } @@ -3122,7 +3127,7 @@ _wsi_display_queue_next(struct wsi_swapchain *drv_chain) image->state = WSI_IMAGE_QUEUED; - int ret = drm_atomic_commit(connector, image); + int ret = drm_atomic_commit(connector, image, false); if (ret == 0) { image->state = WSI_IMAGE_FLIPPING; connector->active = true; @@ -3410,6 +3415,28 @@ wsi_display_surface_create_swapchain( create_info, drm_format, &chain->images[image]); + + /* Check that we could actually possibly atomic commit to this plane. This + * catches cases where the swapchain exceeds some limits of the hardware + * that we couldn't tell from the probed properties. + * + * There is text explicitly allowing this error code for "exclusive + * full-screen mode" (which is not actually what DRM KHR_display is by + * spec, though we are giving exclusive full-screen access!), but this is + * what the CTS expects to find for unsupported swapchains. + */ + if (result == VK_SUCCESS) { + ret = drm_atomic_commit(display_mode->connector, &chain->images[image], true); + if (ret != 0) { + wsi_display_debug("Atomic commit check for %dx%d %s, failed: %s\n", + create_info->imageExtent.width, + create_info->imageExtent.height, + util_format_short_name(vk_format_to_pipe_format(create_info->imageFormat)), + strerror(-errno)); + result = VK_ERROR_INITIALIZATION_FAILED; + } + } + if (result != VK_SUCCESS) { while (image > 0) { --image;