mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-11 15:40:31 +01:00
Merge branch 'display-fixes' into 'main'
vulkan/wsi/display: Check with an atomic commit if the swapchain fails. Closes #14314 See merge request mesa/mesa!39466
This commit is contained in:
commit
d352eb3ecb
6 changed files with 44 additions and 72 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -224,6 +224,9 @@ struct wsi_display {
|
|||
pthread_t hotplug_thread;
|
||||
|
||||
struct list_head connectors; /* list of all discovered connectors */
|
||||
/* Flag that we've called wsi_get_connectors() with the current fd.
|
||||
*/
|
||||
bool get_connectors_current;
|
||||
|
||||
/* A unique monotonically increasing value to associate with an individual
|
||||
* colorimetry outcome on the output. This is used to avoid propagating
|
||||
|
|
@ -864,7 +867,7 @@ wsi_get_connectors(VkPhysicalDevice physicalDevice)
|
|||
struct wsi_display *wsi =
|
||||
(struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
|
||||
|
||||
if (wsi->fd < 0)
|
||||
if (wsi->fd < 0 || wsi->get_connectors_current)
|
||||
return VK_SUCCESS;
|
||||
|
||||
drmModeResPtr mode_res = drmModeGetResources(wsi->fd);
|
||||
|
|
@ -883,6 +886,8 @@ wsi_get_connectors(VkPhysicalDevice physicalDevice)
|
|||
}
|
||||
}
|
||||
|
||||
wsi->get_connectors_current = true;
|
||||
|
||||
drmModeFreeResources(mode_res);
|
||||
return VK_SUCCESS;
|
||||
}
|
||||
|
|
@ -2818,7 +2823,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;
|
||||
|
|
@ -2905,6 +2910,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;
|
||||
|
|
@ -2935,7 +2945,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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -3080,7 +3090,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;
|
||||
|
|
@ -3368,6 +3378,30 @@ 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. This is allowed by
|
||||
* the spec:
|
||||
*
|
||||
* "In some cases, swapchain creation may fail if exclusive full-screen
|
||||
* mode is requested for application control, but for some
|
||||
* implementation-specific reason exclusive full-screen access is
|
||||
* unavailable for the particular combination of parameters provided. If
|
||||
* this occurs, VK_ERROR_INITIALIZATION_FAILED will be returned."
|
||||
*/
|
||||
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;
|
||||
|
|
@ -3480,6 +3514,7 @@ udev_event_listener_thread(void *data)
|
|||
* and wsi_display_wait_for_event.
|
||||
*/
|
||||
mtx_lock(&wsi->wait_mutex);
|
||||
wsi->get_connectors_current = false;
|
||||
u_cnd_monotonic_broadcast(&wsi->hotplug_cond);
|
||||
list_for_each_entry(struct wsi_display_fence, fence,
|
||||
&wsi_device->hotplug_fences, link) {
|
||||
|
|
@ -3641,6 +3676,7 @@ wsi_ReleaseDisplayEXT(VkPhysicalDevice physicalDevice,
|
|||
if (wsi->fd != wsi->device_fd)
|
||||
close(wsi->fd);
|
||||
wsi->fd = wsi->device_fd;
|
||||
wsi->get_connectors_current = false;
|
||||
}
|
||||
|
||||
struct wsi_display_connector *connector =
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue