vulkan/wsi: Really terminate DRM lease in wsi_release_display().

wsi_release_display() implements vkReleaseDisplayEXT() which
is supposed to return control to the lessor of an output
upon call.

We need to terminate the wsi->wait_thread when close()'ing
the wsi->fd, otherwise the wait_thread holds another reference
to the wsi->fd, keeping the lease active, and thereby the
leased output blocked, until vkDestroyInstance() is called.

This gives users their GUI back, instead of extended darkness.

Fixes: 352d320a07 ("vulkan: Add EXT_direct_mode_display [v2]")
Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Cc: <mesa-stable@lists.freedesktop.org>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5396>
This commit is contained in:
Mario Kleiner
2020-06-08 12:51:08 +02:00
committed by Marge Bot
parent 82815bc980
commit 2cc51b0dff

View File

@@ -1228,6 +1228,18 @@ wsi_display_start_wait_thread(struct wsi_display *wsi)
return 0;
}
static void
wsi_display_stop_wait_thread(struct wsi_display *wsi)
{
pthread_mutex_lock(&wsi->wait_mutex);
if (wsi->wait_thread) {
pthread_cancel(wsi->wait_thread);
pthread_join(wsi->wait_thread, NULL);
wsi->wait_thread = 0;
}
pthread_mutex_unlock(&wsi->wait_mutex);
}
/*
* Wait for at least one event from the kernel to be processed.
* Call with wait_mutex held
@@ -1936,12 +1948,7 @@ wsi_display_finish_wsi(struct wsi_device *wsi_device,
vk_free(wsi->alloc, connector);
}
pthread_mutex_lock(&wsi->wait_mutex);
if (wsi->wait_thread) {
pthread_cancel(wsi->wait_thread);
pthread_join(wsi->wait_thread, NULL);
}
pthread_mutex_unlock(&wsi->wait_mutex);
wsi_display_stop_wait_thread(wsi);
pthread_mutex_destroy(&wsi->wait_mutex);
pthread_cond_destroy(&wsi->wait_cond);
@@ -1961,9 +1968,12 @@ wsi_release_display(VkPhysicalDevice physical_device,
(struct wsi_display *) wsi_device->wsi[VK_ICD_WSI_PLATFORM_DISPLAY];
if (wsi->fd >= 0) {
wsi_display_stop_wait_thread(wsi);
close(wsi->fd);
wsi->fd = -1;
}
#ifdef VK_USE_PLATFORM_XLIB_XRANDR_EXT
wsi_display_connector_from_handle(display)->output = None;
#endif