vulkan/wsi/display: Check with an atomic commit if the swapchain fails.
Some checks are pending
macOS-CI / macOS-CI (dri) (push) Waiting to run
macOS-CI / macOS-CI (xlib) (push) Waiting to run

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: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39466>
This commit is contained in:
Emma Anholt 2026-01-22 12:37:20 -08:00 committed by Marge Bot
parent 08f0fd8bd6
commit 580381d9e7
6 changed files with 34 additions and 71 deletions

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -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;