This fixes segfaults and explorer.exe being stuck when this driver fails to load.
-- v2: winewayland: Delay setting user driver functions.
From: Aida Jonikienė aidas957@gmail.com
This fixes segfaults and explorer.exe being stuck when this driver fails to load. --- dlls/winewayland.drv/wayland.c | 28 ++++++++++++++++++++++--- dlls/winewayland.drv/waylanddrv_main.c | 29 +------------------------- 2 files changed, 26 insertions(+), 31 deletions(-)
diff --git a/dlls/winewayland.drv/wayland.c b/dlls/winewayland.drv/wayland.c index 35dbcb5f0ef..e2f02e38ca5 100644 --- a/dlls/winewayland.drv/wayland.c +++ b/dlls/winewayland.drv/wayland.c @@ -32,6 +32,25 @@
WINE_DEFAULT_DEBUG_CHANNEL(waylanddrv);
+static const struct user_driver_funcs waylanddrv_funcs = +{ + .pClipCursor = WAYLAND_ClipCursor, + .pDesktopWindowProc = WAYLAND_DesktopWindowProc, + .pDestroyWindow = WAYLAND_DestroyWindow, + .pKbdLayerDescriptor = WAYLAND_KbdLayerDescriptor, + .pReleaseKbdTables = WAYLAND_ReleaseKbdTables, + .pSetCursor = WAYLAND_SetCursor, + .pSetWindowText = WAYLAND_SetWindowText, + .pSysCommand = WAYLAND_SysCommand, + .pUpdateDisplayDevices = WAYLAND_UpdateDisplayDevices, + .pWindowMessage = WAYLAND_WindowMessage, + .pWindowPosChanged = WAYLAND_WindowPosChanged, + .pWindowPosChanging = WAYLAND_WindowPosChanging, + .pCreateWindowSurface = WAYLAND_CreateWindowSurface, + .pVulkanInit = WAYLAND_VulkanInit, + .pwine_get_wgl_driver = WAYLAND_wine_get_wgl_driver, +}; + struct wayland process_wayland = { .seat.mutex = PTHREAD_MUTEX_INITIALIZER, @@ -244,8 +263,7 @@ BOOL wayland_process_init(void) wl_registry_add_listener(process_wayland.wl_registry, ®istry_listener, NULL);
/* We need two roundtrips. One to get and bind globals, one to handle all - * initial events produced from registering the globals. */ - wl_display_roundtrip_queue(process_wayland.wl_display, process_wayland.wl_event_queue); + * initial events produced from registering the globals (which is ran later). */ wl_display_roundtrip_queue(process_wayland.wl_display, process_wayland.wl_event_queue);
/* Check for required protocol globals. */ @@ -285,7 +303,11 @@ BOOL wayland_process_init(void) return FALSE; }
- process_wayland.initialized = TRUE; + __wine_set_user_driver(&waylanddrv_funcs, WINE_GDI_DRIVER_VERSION); + + /* The second roundtrip is delayed to avoid display device initialization. */ + wl_display_roundtrip_queue(process_wayland.wl_display, process_wayland.wl_event_queue);
+ process_wayland.initialized = TRUE; return TRUE; } diff --git a/dlls/winewayland.drv/waylanddrv_main.c b/dlls/winewayland.drv/waylanddrv_main.c index 47c1299dd01..369086fda2c 100644 --- a/dlls/winewayland.drv/waylanddrv_main.c +++ b/dlls/winewayland.drv/waylanddrv_main.c @@ -33,25 +33,6 @@
char *process_name = NULL;
-static const struct user_driver_funcs waylanddrv_funcs = -{ - .pClipCursor = WAYLAND_ClipCursor, - .pDesktopWindowProc = WAYLAND_DesktopWindowProc, - .pDestroyWindow = WAYLAND_DestroyWindow, - .pKbdLayerDescriptor = WAYLAND_KbdLayerDescriptor, - .pReleaseKbdTables = WAYLAND_ReleaseKbdTables, - .pSetCursor = WAYLAND_SetCursor, - .pSetWindowText = WAYLAND_SetWindowText, - .pSysCommand = WAYLAND_SysCommand, - .pUpdateDisplayDevices = WAYLAND_UpdateDisplayDevices, - .pWindowMessage = WAYLAND_WindowMessage, - .pWindowPosChanged = WAYLAND_WindowPosChanged, - .pWindowPosChanging = WAYLAND_WindowPosChanging, - .pCreateWindowSurface = WAYLAND_CreateWindowSurface, - .pVulkanInit = WAYLAND_VulkanInit, - .pwine_get_wgl_driver = WAYLAND_wine_get_wgl_driver, -}; - static void wayland_init_process_name(void) { WCHAR *p, *appname; @@ -82,19 +63,11 @@ static void wayland_init_process_name(void)
static NTSTATUS waylanddrv_unix_init(void *arg) { - /* Set the user driver functions now so that they are available during - * our initialization. We clear them on error. */ - __wine_set_user_driver(&waylanddrv_funcs, WINE_GDI_DRIVER_VERSION); - wayland_init_process_name();
- if (!wayland_process_init()) goto err; + if (!wayland_process_init()) return STATUS_UNSUCCESSFUL;
return 0; - -err: - __wine_set_user_driver(NULL, WINE_GDI_DRIVER_VERSION); - return STATUS_UNSUCCESSFUL; }
static NTSTATUS waylanddrv_unix_read_events(void *arg)
On Tue Sep 3 16:32:31 2024 +0000, Aida Jonikienė wrote:
Right now the current `__wine_set_user_driver()` behavior is to not change user driver entrypoints if they've been changed from the lazy load ones (if I'm reading the function code correctly); this means the Wayland driver entrypoints are always being used (even if the driver loading fails) and this causes weird behavior like `planes = 0` FIXME being printed for some bitmap function and libelf segfaulting Should I change the behavior of `__wine_set_user_driver(NULL)` to always change the entrypoints (even if the entrypoints have been modified from the lazy load ones)? Right now none of the Wine graphics drivers except winewayland use this function in that way
I delayed the second roundtrip in the updated MR (if this is still a bad approach then I'll move to win32u)
Here's how little Wayland activity there is now (I had to force a error path though because KWin Wayland supports everything with the DRM backend):
<details> <summary>Frog</summary>
``` bash-5.2$ WINEDEBUG=+unixcon,+waylanddrv WINE_VIDEO_DRIVER=wayland WAYLAND_DEBUG=1 winetkg winecfg 01d8:trace:waylanddrv:wayland_process_init wl_display=0x55555f54c860 [2721280.345] -> wl_display#1.get_registry(new id wl_registry#2) [2721280.356] -> wl_display#1.sync(new id wl_callback#3) [2721288.484] {Display Queue} wl_display#1.delete_id(3) [2721288.512] wl_registry#2.global(1, "wl_compositor", 6) 01d8:trace:waylanddrv:registry_handle_global interface=wl_compositor version=6 id=1 [2721288.524] -> wl_registry#2.bind(1, "wl_compositor", 4, new id [unknown]#4) [2721288.533] wl_registry#2.global(3, "zwp_tablet_manager_v2", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_tablet_manager_v2 version=1 id=3 [2721288.543] wl_registry#2.global(4, "zwp_keyboard_shortcuts_inhibit_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_keyboard_shortcuts_inhibit_manager_v1 version=1 id=4 [2721288.551] wl_registry#2.global(5, "zxdg_decoration_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zxdg_decoration_manager_v1 version=1 id=5 [2721288.560] wl_registry#2.global(6, "wp_viewporter", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_viewporter version=1 id=6 [2721288.569] -> wl_registry#2.bind(6, "wp_viewporter", 1, new id [unknown]#5) [2721288.574] wl_registry#2.global(7, "wp_security_context_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_security_context_manager_v1 version=1 id=7 [2721288.583] wl_registry#2.global(8, "wp_fractional_scale_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_fractional_scale_manager_v1 version=1 id=8 [2721288.591] wl_registry#2.global(9, "wl_shm", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wl_shm version=1 id=9 [2721288.600] -> wl_registry#2.bind(9, "wl_shm", 1, new id [unknown]#6) [2721288.605] wl_registry#2.global(10, "wl_seat", 9) 01d8:trace:waylanddrv:registry_handle_global interface=wl_seat version=9 id=10 [2721288.613] -> wl_registry#2.bind(10, "wl_seat", 5, new id [unknown]#7) [2721288.618] wl_registry#2.global(11, "zwp_pointer_gestures_v1", 3) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_pointer_gestures_v1 version=3 id=11 [2721288.626] wl_registry#2.global(12, "zwp_pointer_constraints_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_pointer_constraints_v1 version=1 id=12 [2721288.635] -> wl_registry#2.bind(12, "zwp_pointer_constraints_v1", 1, new id [unknown]#8) [2721288.640] wl_registry#2.global(13, "zwp_relative_pointer_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_relative_pointer_manager_v1 version=1 id=13 [2721288.649] -> wl_registry#2.bind(13, "zwp_relative_pointer_manager_v1", 1, new id [unknown]#9) [2721288.654] wl_registry#2.global(14, "wl_data_device_manager", 3) 01d8:trace:waylanddrv:registry_handle_global interface=wl_data_device_manager version=3 id=14 [2721288.663] wl_registry#2.global(15, "zwlr_data_control_manager_v1", 2) 01d8:trace:waylanddrv:registry_handle_global interface=zwlr_data_control_manager_v1 version=2 id=15 [2721288.671] wl_registry#2.global(16, "wp_cursor_shape_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_cursor_shape_manager_v1 version=1 id=16 [2721288.680] wl_registry#2.global(17, "zwp_primary_selection_device_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_primary_selection_device_manager_v1 version=1 id=17 [2721288.688] wl_registry#2.global(18, "org_kde_kwin_idle", 1) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_idle version=1 id=18 [2721288.697] wl_registry#2.global(19, "zwp_idle_inhibit_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_idle_inhibit_manager_v1 version=1 id=19 [2721288.705] wl_registry#2.global(20, "ext_idle_notifier_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=ext_idle_notifier_v1 version=1 id=20 [2721288.713] wl_registry#2.global(21, "org_kde_plasma_shell", 8) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_plasma_shell version=8 id=21 [2721288.722] wl_registry#2.global(22, "org_kde_kwin_appmenu_manager", 1) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_appmenu_manager version=1 id=22 [2721288.730] wl_registry#2.global(23, "org_kde_kwin_server_decoration_palette_manager", 1) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_server_decoration_palette_manager version=1 id=23 [2721288.739] wl_registry#2.global(25, "org_kde_plasma_virtual_desktop_management", 2) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_plasma_virtual_desktop_management version=2 id=25 [2721288.747] wl_registry#2.global(27, "org_kde_kwin_shadow_manager", 2) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_shadow_manager version=2 id=27 [2721288.755] wl_registry#2.global(28, "org_kde_kwin_dpms_manager", 1) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_dpms_manager version=1 id=28 [2721288.764] wl_registry#2.global(29, "org_kde_kwin_server_decoration_manager", 1) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_server_decoration_manager version=1 id=29 [2721288.772] wl_registry#2.global(30, "kde_output_management_v2", 9) 01d8:trace:waylanddrv:registry_handle_global interface=kde_output_management_v2 version=9 id=30 [2721288.781] wl_registry#2.global(31, "zxdg_output_manager_v1", 3) 01d8:trace:waylanddrv:registry_handle_global interface=zxdg_output_manager_v1 version=3 id=31 [2721288.790] -> wl_registry#2.bind(31, "zxdg_output_manager_v1", 3, new id [unknown]#10) [2721288.795] wl_registry#2.global(32, "wl_subcompositor", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wl_subcompositor version=1 id=32 [2721288.804] -> wl_registry#2.bind(32, "wl_subcompositor", 1, new id [unknown]#11) [2721288.809] wl_registry#2.global(33, "zxdg_exporter_v2", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zxdg_exporter_v2 version=1 id=33 [2721288.818] wl_registry#2.global(34, "zxdg_importer_v2", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zxdg_importer_v2 version=1 id=34 [2721288.826] wl_registry#2.global(37, "xdg_activation_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=xdg_activation_v1 version=1 id=37 [2721288.834] wl_registry#2.global(39, "wp_content_type_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_content_type_manager_v1 version=1 id=39 [2721288.842] wl_registry#2.global(40, "wp_tearing_control_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_tearing_control_manager_v1 version=1 id=40 [2721288.851] wl_registry#2.global(41, "xdg_toplevel_drag_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=xdg_toplevel_drag_manager_v1 version=1 id=41 [2721288.859] wl_registry#2.global(42, "kde_screen_edge_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=kde_screen_edge_manager_v1 version=1 id=42 [2721288.867] wl_registry#2.global(43, "frog_color_management_factory_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=frog_color_management_factory_v1 version=1 id=43 [2721288.876] wl_registry#2.global(44, "wp_presentation", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_presentation version=1 id=44 [2721288.884] wl_registry#2.global(45, "xdg_wm_dialog_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=xdg_wm_dialog_v1 version=1 id=45 [2721288.891] wl_registry#2.global(48, "xdg_wm_base", 6) 01d8:trace:waylanddrv:registry_handle_global interface=xdg_wm_base version=6 id=48 [2721288.900] -> wl_registry#2.bind(48, "xdg_wm_base", 2, new id [unknown]#12) [2721288.906] wl_registry#2.global(49, "zwlr_layer_shell_v1", 5) 01d8:trace:waylanddrv:registry_handle_global interface=zwlr_layer_shell_v1 version=5 id=49 [2721288.919] wl_registry#2.global(51, "wp_drm_lease_device_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_drm_lease_device_v1 version=1 id=51 [2721288.930] wl_registry#2.global(52, "wp_drm_lease_device_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_drm_lease_device_v1 version=1 id=52 [2721288.939] wl_registry#2.global(53, "kde_output_order_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=kde_output_order_v1 version=1 id=53 [2721288.947] wl_registry#2.global(54, "zwp_text_input_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_text_input_manager_v1 version=1 id=54 [2721288.956] wl_registry#2.global(55, "zwp_text_input_manager_v2", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_text_input_manager_v2 version=1 id=55 [2721288.966] wl_registry#2.global(56, "zwp_text_input_manager_v3", 1) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_text_input_manager_v3 version=1 id=56 [2721288.975] wl_registry#2.global(58, "wl_drm", 2) 01d8:trace:waylanddrv:registry_handle_global interface=wl_drm version=2 id=58 [2721288.983] wl_registry#2.global(59, "zwp_linux_dmabuf_v1", 4) 01d8:trace:waylanddrv:registry_handle_global interface=zwp_linux_dmabuf_v1 version=4 id=59 [2721288.991] wl_registry#2.global(60, "wp_linux_drm_syncobj_manager_v1", 1) 01d8:trace:waylanddrv:registry_handle_global interface=wp_linux_drm_syncobj_manager_v1 version=1 id=60 [2721288.999] wl_registry#2.global(61, "kde_output_device_v2", 8) 01d8:trace:waylanddrv:registry_handle_global interface=kde_output_device_v2 version=8 id=61 [2721289.007] wl_registry#2.global(62, "kde_output_device_v2", 8) 01d8:trace:waylanddrv:registry_handle_global interface=kde_output_device_v2 version=8 id=62 [2721289.014] wl_registry#2.global(63, "wl_output", 4) 01d8:trace:waylanddrv:registry_handle_global interface=wl_output version=4 id=63 [2721289.024] -> wl_registry#2.bind(63, "wl_output", 2, new id [unknown]#13) [2721289.031] -> zxdg_output_manager_v1#10.get_xdg_output(new id zxdg_output_v1#14, wl_output#13) [2721289.038] wl_registry#2.global(64, "wl_output", 4) 01d8:trace:waylanddrv:registry_handle_global interface=wl_output version=4 id=64 [2721289.046] -> wl_registry#2.bind(64, "wl_output", 2, new id [unknown]#15) [2721289.053] -> zxdg_output_manager_v1#10.get_xdg_output(new id zxdg_output_v1#16, wl_output#15) [2721289.058] wl_registry#2.global(65, "org_kde_kwin_blur_manager", 1) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_blur_manager version=1 id=65 [2721289.066] wl_registry#2.global(66, "org_kde_kwin_contrast_manager", 2) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_contrast_manager version=2 id=66 [2721289.075] wl_registry#2.global(67, "org_kde_kwin_slide_manager", 1) 01d8:trace:waylanddrv:registry_handle_global interface=org_kde_kwin_slide_manager version=1 id=67 [2721289.084] wl_callback#3.done(592081) 01d8:err:waylanddrv:wayland_process_init Wayland compositor doesn't support wp_viewporter 01d8:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded. 01d8:err:winediag:nodrv_CreateWindow L"The explorer process failed to start." 01d8:err:systray:initialize_systray Could not create tray window 0200:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded. 0200:err:winediag:nodrv_CreateWindow L"Make sure that your display server is running and that its variables are set." ```
</details>
!6908 probably supersedes this
This merge request was closed by Aida Jonikienė.