summaryrefslogtreecommitdiff
path: root/src/vulkan
diff options
context:
space:
mode:
authorMario Kleiner <mario.kleiner.de@gmail.com>2020-06-08 12:51:08 +0200
committerMarge Bot <eric+marge@anholt.net>2020-06-21 11:20:54 +0000
commit2cc51b0dfffb80e91bf839ed57708fd9f90735d9 (patch)
treeebdb23d76bbb9b8e04ec349fcde458483d3044e1 /src/vulkan
parent82815bc98036ec533788e3a62c0709541eeef0b8 (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.c22
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