diff options
author | Mario Kleiner <mario.kleiner.de@gmail.com> | 2020-06-08 12:51:08 +0200 |
---|---|---|
committer | Marge Bot <eric+marge@anholt.net> | 2020-06-21 11:20:54 +0000 |
commit | 2cc51b0dfffb80e91bf839ed57708fd9f90735d9 (patch) | |
tree | ebdb23d76bbb9b8e04ec349fcde458483d3044e1 /src/vulkan | |
parent | 82815bc98036ec533788e3a62c0709541eeef0b8 (diff) |
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: 352d320a0745 ("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>
Diffstat (limited to 'src/vulkan')
-rw-r--r-- | src/vulkan/wsi/wsi_common_display.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/vulkan/wsi/wsi_common_display.c b/src/vulkan/wsi/wsi_common_display.c index 0f9a1ffe8d3..b05d7cc479d 100644 --- a/src/vulkan/wsi/wsi_common_display.c +++ b/src/vulkan/wsi/wsi_common_display.c @@ -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 |