The gles/egl backend still segfaults on Wayland when exiting the application.
Description
If vulkan is not available on a machine that's running Wayland, the application will crash in eglTerminate. This has previously been thought to have been fixed in #4650, but apparently it is not the case. (I first posted in the thread for that issue, but later realized that this will probably go unnoticed.)
Repro steps
As the examples in the wgpu repo are hitting #5505, I'm providing a reproduction using the examples in the ggez repo instead.
- Use a Linux machine running Wayland.
- Clone https://github.com/ggez/ggez/ and checkout the
develbranch, which at the time of writing makes use ofwgpu 25.0.0. -
cargo add wgpu --features 'gles,wgsl' --no-default-features -
cargo run --example 01_super_simple - Press Escape or otherwise close the window.
-
Segmentation fault
Backtrace
#0 0x000071b89401d8ac in wl_map_insert_at (map=map@entry=0x5dddbc2bb520, flags=flags@entry=1, i=41, data=<optimized out>) at ../wayland-1.23.1/src/wayland-util.c:290
#1 0x000071b89401da21 in proxy_destroy (proxy=0x5dddbc3d2bb0) at ../wayland-1.23.1/src/wayland-client.c:574
#2 0x000071b89401f7d7 in wl_proxy_destroy_caller_locks (proxy=0x5dddbc3d2bb0) at ../wayland-1.23.1/src/wayland-client.c:598
#3 wl_proxy_marshal_array_flags (proxy=0x5dddbc3d2bb0, opcode=opcode@entry=0, interface=interface@entry=0x0, version=version@entry=4, flags=flags@entry=1, args=args@entry=0x7ffd1ed8bb30) at ../wayland-1.23.1/src/wayland-client.c:943
#4 0x000071b8940203cb in wl_proxy_marshal_flags (proxy=<optimized out>, opcode=0, interface=0x0, version=4, flags=1) at ../wayland-1.23.1/src/wayland-client.c:857
#5 0x000071b887b52a04 in wl_buffer_destroy () at /usr/include/wayland-client-protocol.h:2149
#6 dri2_teardown_wayland () at ../mesa-25.0.4/src/egl/drivers/dri2/platform_wayland.c:3128
#7 0x000071b887b47fe9 in dri2_display_destroy () at ../mesa-25.0.4/src/egl/drivers/dri2/egl_dri2.c:1003
#8 0x000071b887b48659 in dri2_display_release () at ../mesa-25.0.4/src/egl/drivers/dri2/egl_dri2.c:964
#9 dri2_display_release () at ../mesa-25.0.4/src/egl/drivers/dri2/egl_dri2.c:949
#10 dri2_terminate () at ../mesa-25.0.4/src/egl/drivers/dri2/egl_dri2.c:1060
#11 0x000071b887b34dc9 in eglTerminate () at ../mesa-25.0.4/src/egl/main/eglapi.c:780
#12 0x00005ddd80b68ea0 in khronos_egl::{impl#97}::eglTerminate<libloading::safe::Library> (self=0x5dddbc368360, display=0x5dddbc3d1a70) at /home/maya/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/khronos-egl-6.0.0/src/lib.rs:2321
#13 khronos_egl::Instance<khronos_egl::Dynamic<libloading::safe::Library, khronos_egl::EGL1_4>>::terminate<khronos_egl::Dynamic<libloading::safe::Library, khronos_egl::EGL1_4>> (self=0x5dddbc368360, display=...)
at /home/maya/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/khronos-egl-6.0.0/src/lib.rs:1181
#14 0x00005ddd80bd62a6 in wgpu_hal::gles::egl::terminate_display (egl=0x5dddbc368360, display=...) at src/gles/egl.rs:516
#15 0x00005ddd80bd9ce3 in wgpu_hal::gles::egl::{impl#11}::drop (self=0x5dddbc3478e8) at src/gles/egl.rs:733
#16 0x00005ddd80baff87 in core::ptr::drop_in_place<wgpu_hal::gles::egl::Inner> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#17 0x00005ddd80bb158b in core::ptr::drop_in_place<core::cell::UnsafeCell<wgpu_hal::gles::egl::Inner>> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#18 0x00005ddd80baed9f in core::ptr::drop_in_place<lock_api::mutex::Mutex<parking_lot::raw_mutex::RawMutex, wgpu_hal::gles::egl::Inner>> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#19 0x00005ddd80bb027c in core::ptr::drop_in_place<wgpu_hal::gles::egl::Instance> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#20 0x00005ddd80a2cd44 in core::ptr::drop_in_place<alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance, alloc::alloc::Global>> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#21 0x00005ddd80a1b95f in core::ptr::drop_in_place<(wgpu_types::Backend, alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance, alloc::alloc::Global>)> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#22 0x00005ddd80a1d37e in core::ptr::drop_in_place<[(wgpu_types::Backend, alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance, alloc::alloc::Global>)]> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#23 0x00005ddd808a44a3 in alloc::vec::{impl#25}::drop<(wgpu_types::Backend, alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance, alloc::alloc::Global>), alloc::alloc::Global> (self=0x5dddbc3c4f88)
at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/vec/mod.rs:3798
#24 0x00005ddd80a1e7c7 in core::ptr::drop_in_place<alloc::vec::Vec<(wgpu_types::Backend, alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance, alloc::alloc::Global>), alloc::alloc::Global>> ()
at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#25 0x00005ddd80a2233c in core::ptr::drop_in_place<wgpu_core::instance::Instance> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#26 0x00005ddd8084a794 in core::ptr::drop_in_place<wgpu_core::global::Global> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#27 0x00005ddd8083ac82 in alloc::sync::Arc<wgpu_core::global::Global, alloc::alloc::Global>::drop_slow<wgpu_core::global::Global, alloc::alloc::Global> (self=0x5dddbcfe9370) at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/sync.rs:1943
#28 0x00005ddd8083b6bd in alloc::sync::{impl#38}::drop<wgpu_core::global::Global, alloc::alloc::Global> (self=0x5dddbcfe9370) at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/sync.rs:2633
#29 0x00005ddd8084c46b in core::ptr::drop_in_place<alloc::sync::Arc<wgpu_core::global::Global, alloc::alloc::Global>> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#30 0x00005ddd8084b934 in core::ptr::drop_in_place<wgpu::backend::wgpu_core::ContextWgpuCore> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#31 0x00005ddd8084adf7 in core::ptr::drop_in_place<wgpu::backend::wgpu_core::CoreBuffer> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#32 0x00005ddd8083a882 in alloc::sync::Arc<wgpu::backend::wgpu_core::CoreBuffer, alloc::alloc::Global>::drop_slow<wgpu::backend::wgpu_core::CoreBuffer, alloc::alloc::Global> (self=0x7ffd1ed8d1c8)
at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/sync.rs:1943
#33 0x00005ddd8083b2cd in alloc::sync::{impl#38}::drop<wgpu::backend::wgpu_core::CoreBuffer, alloc::alloc::Global> (self=0x7ffd1ed8d1c8) at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc/src/sync.rs:2633
#34 0x00005ddd8084d00b in core::ptr::drop_in_place<alloc::sync::Arc<wgpu::backend::wgpu_core::CoreBuffer, alloc::alloc::Global>> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#35 0x00005ddd8084a879 in core::ptr::drop_in_place<wgpu::dispatch::DispatchBuffer> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#36 0x00005ddd8084a687 in core::ptr::drop_in_place<wgpu::api::buffer::Buffer> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#37 0x00005ddd8061a80c in core::ptr::drop_in_place<ggez::graphics::mesh::Mesh> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#38 0x00005ddd80583eeb in core::ptr::drop_in_place<01_super_simple::MainState> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#39 0x00005ddd805837b9 in core::ptr::drop_in_place<ggez::event::GgezApplicationHandler<01_super_simple::MainState, ggez::context::Context, ggez::error::GameError>> () at /home/maya/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ptr/mod.rs:524
#40 0x00005ddd80593962 in ggez::event::run<01_super_simple::MainState, ggez::context::Context, ggez::error::GameError> (ctx=..., event_loop=..., state=...) at src/event.rs:294
#41 0x00005ddd805b6bb2 in 01_super_simple::main () at examples/01_super_simple.rs:53
Debugging
For more details, try the following:
-
gdb target/debug/examples/01_super_simple -
r - The window shows up.
- Ctrl+C in the debugger window
-
b wl_display_disconnect -
b eglTerminate -
c - Close the window (it will stay open)
- Observe that the
wl_display_disconnectwindow is called first - If desired, obtain a backtrace (
bt) -
c - Observe that
eglTerminateis called after the window has already been disposed of.
This example leads me to believe that this is incorrect sequencing.
Code analysis
I believe that this part of the code might be the culprit:
https://github.com/gfx-rs/wgpu/blob/50eb207a77963a3818e8d05f65da34f1f6e6018c/wgpu-hal/src/gles/egl.rs#L997-L1040
From a cursory reading, it would appear that this makes the entire Instance depend on the lifetime of the Window, rather than just the Surface having this dependency. I am lead to believe that, on Wayland, Instance should hold a Box<dyn WindowHandle>, like Surface does. Actually achieving this would be non-trivial, though.
This might be just another symptom of #6211, in which case the best course of action might be simply accepting the segfaults, or manually taking care to hold the window longer than the wgpu Instance and everything that grabs a copy of any relevant Arcs.
Platform wgpu 25.0.0 (wgpu-core 25.0.1) mesa 25.0.4 sway 1.10.1 (also tested on KWin) Arch Linux
We have tested 5 machines. Apart from one where the example fails to initialize (I think it detects that the GL is emulated on top of vulkan or something? That or it's just nvidia drivers being weird), the issue has reproduced on all four, on both AMD and Intel graphics.
I can reproduce this on my wayland machine. Of note, this happens if the OpenGL backend is only enabled - it doesn't matter if it is the selected backend. I presume that's because the highlighted code is always run as part of Instance::request_adapter in case the egl backend is enabled.
Edit: Backtrace
* thread #1, name = 'mason', stop reason = signal SIGSEGV: address not mapped to object (fault address=0x11c)
* frame #0: 0x00007ffff4e1e9fc libwayland-client.so.0`___lldb_unnamed_symbol196 + 76
frame #1: 0x00007ffff4e1eb65 libwayland-client.so.0`___lldb_unnamed_symbol197 + 261
frame #2: 0x00007ffff4e208d7 libwayland-client.so.0`wl_proxy_marshal_array_flags + 999
frame #3: 0x00007ffff4e21408 libwayland-client.so.0`wl_proxy_marshal_flags + 232
frame #4: 0x00007ffff421962e libEGL_mesa.so.0`___lldb_unnamed_symbol1051 + 158
frame #5: 0x00007ffff420de18 libEGL_mesa.so.0`___lldb_unnamed_symbol873 + 328
frame #6: 0x00007ffff420e480 libEGL_mesa.so.0`___lldb_unnamed_symbol876 + 80
frame #7: 0x00007ffff41faeec libEGL_mesa.so.0`___lldb_unnamed_symbol642 + 188
frame #8: 0x00005555571468e0 mason`khronos_egl::egl1_0::<impl khronos_egl::Instance<T>>::terminate [inlined] <khronos_egl::Dynamic<L,khronos_egl::EGL1_4> as khronos_egl::api::EGL1_0>::eglTerminate(self=0x0000555557fe8ee0, display=0x0000555558612a30) at lib.rs:2321:7
frame #9: 0x00005555571468cd mason`khronos_egl::egl1_0::<impl khronos_egl::Instance<T>>::terminate(self=0x0000555557fe8ee0, display=Display @ 0x00007fffffff32a8) at lib.rs:1181:8
frame #10: 0x00005555570ec766 mason`wgpu_hal::gles::egl::terminate_display(egl=0x0000555557fe8ee0, display=Display @ 0x00007fffffff3330) at egl.rs:501:9
frame #11: 0x00005555570f0203 mason`<wgpu_hal::gles::egl::Inner as core::ops::drop::Drop>::drop(self=0x00005555580930f8) at egl.rs:718:25
frame #12: 0x000055555710de87 mason`core::ptr::drop_in_place<wgpu_hal::gles::egl::Inner>((null)=0x00005555580930f8) at mod.rs:523:1
frame #13: 0x00005555571104eb mason`core::ptr::drop_in_place<core::cell::UnsafeCell<wgpu_hal::gles::egl::Inner>>((null)=0x00005555580930f8) at mod.rs:523:1
frame #14: 0x000055555710af1f mason`core::ptr::drop_in_place<lock_api::mutex::Mutex<parking_lot::raw_mutex::RawMutex,wgpu_hal::gles::egl::Inner>>((null)=0x00005555580930f0) at mod.rs:523:1
frame #15: 0x000055555710e2cc mason`core::ptr::drop_in_place<wgpu_hal::gles::egl::Instance>((null)=0x00005555580930e0) at mod.rs:523:1
frame #16: 0x0000555556daece4 mason`core::ptr::drop_in_place<alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance>>((null)=0x0000555558073c30) at mod.rs:523:1
frame #17: 0x0000555556d9db9f mason`core::ptr::drop_in_place<(wgpu_types::Backend,alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance>)>((null)=0x0000555558073c28) at mod.rs:523:1
frame #18: 0x0000555556d9f6ce mason`core::ptr::drop_in_place<[(wgpu_types::Backend,alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance>)]>((null)=*mut [(wgpu_types::Backend, alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance, alloc::alloc::Global>)] @ 0x00007fffffff35a8) at mod.rs:523:1
frame #19: 0x0000555556d2de33 mason`<alloc::vec::Vec<T,A> as core::ops::drop::Drop>::drop(self=0x0000555558091fa8) at mod.rs:3798:13
frame #20: 0x0000555556da09f7 mason`core::ptr::drop_in_place<alloc::vec::Vec<(wgpu_types::Backend,alloc::boxed::Box<dyn wgpu_hal::dynamic::instance::DynInstance>)>>((null)=0x0000555558091fa8) at mod.rs:523:1
frame #21: 0x0000555556da422c mason`core::ptr::drop_in_place<wgpu_core::instance::Instance>((null)=0x0000555558091f90) at mod.rs:523:1
frame #22: 0x0000555556ccc504 mason`core::ptr::drop_in_place<wgpu_core::global::Global>((null)=0x0000555558091f90) at mod.rs:523:1
frame #23: 0x0000555556cbfb62 mason`alloc::sync::Arc<T,A>::drop_slow(self=0x00005555580aa4f0) at sync.rs:1943:18
frame #24: 0x0000555556cc0aad mason`<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop(self=0x00005555580aa4f0) at sync.rs:2633:13
frame #25: 0x0000555556cce3eb mason`core::ptr::drop_in_place<alloc::sync::Arc<wgpu_core::global::Global>>((null)=0x00005555580aa4f0) at mod.rs:523:1
frame #26: 0x0000555556ccd814 mason`core::ptr::drop_in_place<wgpu::backend::wgpu_core::ContextWgpuCore>((null)=0x00005555580aa4f0) at mod.rs:523:1
frame #27: 0x0000555556ccce64 mason`core::ptr::drop_in_place<wgpu::backend::wgpu_core::CoreSampler>((null)=0x00005555580aa4f0) at mod.rs:523:1
frame #28: 0x0000555556cbfd62 mason`alloc::sync::Arc<T,A>::drop_slow(self=0x00007fffffff4a18) at sync.rs:1943:18
frame #29: 0x0000555556cc0ced mason`<alloc::sync::Arc<T,A> as core::ops::drop::Drop>::drop(self=0x00007fffffff4a18) at sync.rs:2633:13
frame #30: 0x0000555556ccf11b mason`core::ptr::drop_in_place<alloc::sync::Arc<wgpu::backend::wgpu_core::CoreSampler>>((null)=0x00007fffffff4a18) at mod.rs:523:1
frame #31: 0x0000555556ccc76b mason`core::ptr::drop_in_place<wgpu::dispatch::DispatchSampler>((null)=0x00007fffffff4a18) at mod.rs:523:1
frame #32: 0x0000555556ccc54b mason`core::ptr::drop_in_place<wgpu::api::sampler::Sampler>((null)=0x00007fffffff4a18) at mod.rs:523:1
frame #33: 0x00005555561fd794 mason`core::ptr::drop_in_place<wgpu::util::texture_blitter::TextureBlitter>((null)=0x00007fffffff4a08) at mod.rs:523:1
frame #34: 0x00005555561fd4b6 mason`core::ptr::drop_in_place<vello::util::RenderSurface>((null)=0x00007fffffff4950) at mod.rs:523:1
frame #35: 0x00005555561fd86c mason`core::ptr::drop_in_place<masonry_winit::event_loop_runner::WindowState>((null)=0x00007fffffff4928) at mod.rs:523:1
frame #36: 0x0000555556109d20 mason`core::ptr::drop_in_place<masonry_winit::event_loop_runner::MasonryState>((null)=0x00007fffffff39f0) at mod.rs:523:1
frame #37: 0x0000555556109a73 mason`core::ptr::drop_in_place<masonry_winit::event_loop_runner::MainState>((null)=0x00007fffffff39f0) at mod.rs:523:1
frame #38: 0x0000555556100c71 mason`masonry_winit::event_loop_runner::run_with(event_loop=EventLoop<masonry_winit::event_loop_runner::MasonryUserEvent> @ 0x00007fffffffb508, window=WindowAttributes @ 0x00007fffffffbd20, root_widget=RootWidget @ 0x00007fffffffbf30, app_driver=MasonryDriver<mason::AppData, fn(&mut mason::AppData) -> xilem_core::views::fork::Fork<xilem::view::sized_box::SizedBox<xilem::view::flex::Flex<(xilem::view::flex::Flex<(xilem::view::label::Label, xilem::view::label::Label), mason::AppData, ()>, xilem::view::flex::Flex<xilem::view::textbox::Textbox<mason::AppData, ()>, mason::AppData, ()>, xilem::view::prose::Prose, xilem::view::button::Button<xilem::view::button::button_any_pointer::{closure_env#0}<mason::AppData, (), alloc::string::String, mason::app_logic::{closure_env#3}>>, xilem::view::checkbox::Checkbox<mason::app_logic::{closure_env#4}>, alloc::boxed::Box<(dyn xilem_core::any_view::AnyView<mason::AppData, (), xilem::ViewCtx, xilem::Pod<xilem::any_view::DynWidget>, xilem_core::message::DynMessage> + core::marker::Send + core::marker::Sync), alloc::alloc::Global>, xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), &str, mason::app_logic::{closure_env#5}>>, xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), &str, mason::app_logic::{closure_env#6}>>, xilem::view::flex::Flex<([xilem::view::flex::AnyFlexChild<mason::AppData, ()>; 2], alloc::vec::Vec<(xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), alloc::string::String, mason::app_logic::{closure#0}::{closure_env#0}>>, xilem::view::flex::FlexSpacer), alloc::alloc::Global>), mason::AppData, ()>), mason::AppData, ()>, mason::AppData, ()>, core::option::Option<xilem::view::task::Task<mason::app_logic::{closure#7}::{closure_env#0}, mason::app_logic::{closure#7}::{closure_env#1}, ()>>>, xilem_core::views::fork::Fork<xilem::view::sized_box::SizedBox<xilem::view::flex::Flex<(xilem::view::flex::Flex<(xilem::view::label::Label, xilem::view::label::Label), mason::AppData, ()>, xilem::view::flex::Flex<xilem::view::textbox::Textbox<mason::AppData, ()>, mason::AppData, ()>, xilem::view::prose::Prose, xilem::view::button::Button<xilem::view::button::button_any_pointer::{closure_env#0}<mason::AppData, (), alloc::string::String, mason::app_logic::{closure_env#3}>>, xilem::view::checkbox::Checkbox<mason::app_logic::{closure_env#4}>, alloc::boxed::Box<(dyn xilem_core::any_view::AnyView<mason::AppData, (), xilem::ViewCtx, xilem::Pod<xilem::any_view::DynWidget>, xilem_core::message::DynMessage> + core::marker::Send + core::marker::Sync), alloc::alloc::Global>, xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), &str, mason::app_logic::{closure_env#5}>>, xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), &str, mason::app_logic::{closure_env#6}>>, xilem::view::flex::Flex<([xilem::view::flex::AnyFlexChild<mason::AppData, ()>; 2], alloc::vec::Vec<(xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), alloc::string::String, mason::app_logic::{closure#0}::{closure_env#0}>>, xilem::view::flex::FlexSpacer), alloc::alloc::Global>), mason::AppData, ()>), mason::AppData, ()>, mason::AppData, ()>, core::option::Option<xilem::view::task::Task<mason::app_logic::{closure#7}::{closure_env#0}, mason::app_logic::{closure#7}::{closure_env#1}, ()>>>, ((((), ()), (), (), (), (), xilem_core::any_view::AnyViewState, (), (), ([xilem::view::flex::hidden::AnyFlexChildState<mason::AppData, ()>; 2], xilem_core::sequence::VecViewState<((), ())>)), xilem_core::sequence::OptionSeqState<tokio::runtime::task::join::JoinHandle<()>>)> @ 0x00007fffffffbfa0, default_properties=DefaultProperties @ 0x00007fffffffccf0, background_color=AlphaColor<color::colorspace::Srgb> @ 0x00007fffffffcdd0) at event_loop_runner.rs:145:1
frame #39: 0x00005555560b1e46 mason`xilem::Xilem<State,Logic>::run_windowed_in(self=Xilem<mason::AppData, fn(&mut mason::AppData) -> xilem_core::views::fork::Fork<xilem::view::sized_box::SizedBox<xilem::view::flex::Flex<(xilem::view::flex::Flex<(xilem::view::label::Label, xilem::view::label::Label), mason::AppData, ()>, xilem::view::flex::Flex<xilem::view::textbox::Textbox<mason::AppData, ()>, mason::AppData, ()>, xilem::view::prose::Prose, xilem::view::button::Button<xilem::view::button::button_any_pointer::{closure_env#0}<mason::AppData, (), alloc::string::String, mason::app_logic::{closure_env#3}>>, xilem::view::checkbox::Checkbox<mason::app_logic::{closure_env#4}>, alloc::boxed::Box<(dyn xilem_core::any_view::AnyView<mason::AppData, (), xilem::ViewCtx, xilem::Pod<xilem::any_view::DynWidget>, xilem_core::message::DynMessage> + core::marker::Send + core::marker::Sync), alloc::alloc::Global>, xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), &str, mason::app_logic::{closure_env#5}>>, xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), &str, mason::app_logic::{closure_env#6}>>, xilem::view::flex::Flex<([xilem::view::flex::AnyFlexChild<mason::AppData, ()>; 2], alloc::vec::Vec<(xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), alloc::string::String, mason::app_logic::{closure#0}::{closure_env#0}>>, xilem::view::flex::FlexSpacer), alloc::alloc::Global>), mason::AppData, ()>), mason::AppData, ()>, mason::AppData, ()>, core::option::Option<xilem::view::task::Task<mason::app_logic::{closure#7}::{closure_env#0}, mason::app_logic::{closure#7}::{closure_env#1}, ()>>>> @ 0x00007fffffffd698, event_loop=EventLoopBuilder<masonry_winit::event_loop_runner::MasonryUserEvent> @ 0x00007fffffff76e6, window_attributes=WindowAttributes @ 0x00007fffffffce40) at lib.rs:270:9
frame #40: 0x00005555560b17c1 mason`xilem::Xilem<State,Logic>::run_windowed(self=Xilem<mason::AppData, fn(&mut mason::AppData) -> xilem_core::views::fork::Fork<xilem::view::sized_box::SizedBox<xilem::view::flex::Flex<(xilem::view::flex::Flex<(xilem::view::label::Label, xilem::view::label::Label), mason::AppData, ()>, xilem::view::flex::Flex<xilem::view::textbox::Textbox<mason::AppData, ()>, mason::AppData, ()>, xilem::view::prose::Prose, xilem::view::button::Button<xilem::view::button::button_any_pointer::{closure_env#0}<mason::AppData, (), alloc::string::String, mason::app_logic::{closure_env#3}>>, xilem::view::checkbox::Checkbox<mason::app_logic::{closure_env#4}>, alloc::boxed::Box<(dyn xilem_core::any_view::AnyView<mason::AppData, (), xilem::ViewCtx, xilem::Pod<xilem::any_view::DynWidget>, xilem_core::message::DynMessage> + core::marker::Send + core::marker::Sync), alloc::alloc::Global>, xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), &str, mason::app_logic::{closure_env#5}>>, xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), &str, mason::app_logic::{closure_env#6}>>, xilem::view::flex::Flex<([xilem::view::flex::AnyFlexChild<mason::AppData, ()>; 2], alloc::vec::Vec<(xilem::view::button::Button<xilem::view::button::button::{closure_env#0}<mason::AppData, (), alloc::string::String, mason::app_logic::{closure#0}::{closure_env#0}>>, xilem::view::flex::FlexSpacer), alloc::alloc::Global>), mason::AppData, ()>), mason::AppData, ()>, mason::AppData, ()>, core::option::Option<xilem::view::task::Task<mason::app_logic::{closure#7}::{closure_env#0}, mason::app_logic::{closure#7}::{closure_env#1}, ()>>>> @ 0x00007fffffffd808, event_loop=EventLoopBuilder<masonry_winit::event_loop_runner::MasonryUserEvent> @ 0x00007fffffffd786, window_title="�_XUU) at lib.rs:247:9
frame #41: 0x000055555611517c mason`mason::run(event_loop=EventLoopBuilder<masonry_winit::event_loop_runner::MasonryUserEvent> @ 0x00007fffffffda06) at mason.rs:159:5
frame #42: 0x00005555561151f6 mason`mason::main at mason.rs:172:5
frame #43: 0x0000555556104642 mason`core::ops::function::FnOnce::call_once((null)=0x00005555561151d0, (null)=<unavailable>) at function.rs:250:5
frame #44: 0x000055555614c335 mason`std::sys::backtrace::__rust_begin_short_backtrace(f=0x00005555561151d0) at backtrace.rs:152:18
frame #45: 0x00005555560f5234 mason`std::rt::lang_start::{{closure}} at rt.rs:199:18
frame #46: 0x0000555557d25560 mason`std::rt::lang_start_internal [inlined] core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once at function.rs:284:13
frame #47: 0x0000555557d2555d mason`std::rt::lang_start_internal [inlined] std::panicking::try::do_call at panicking.rs:589:40
frame #48: 0x0000555557d2555d mason`std::rt::lang_start_internal [inlined] std::panicking::try at panicking.rs:552:19
frame #49: 0x0000555557d2555d mason`std::rt::lang_start_internal [inlined] std::panic::catch_unwind at panic.rs:359:14
frame #50: 0x0000555557d2555d mason`std::rt::lang_start_internal [inlined] std::rt::lang_start_internal::{{closure}} at rt.rs:168:24
frame #51: 0x0000555557d250ef mason`std::rt::lang_start_internal [inlined] std::panicking::try::do_call at panicking.rs:589:40
frame #52: 0x0000555557d250ef mason`std::rt::lang_start_internal [inlined] std::panicking::try at panicking.rs:552:19
frame #53: 0x0000555557d250ef mason`std::rt::lang_start_internal [inlined] std::panic::catch_unwind at panic.rs:359:14
frame #54: 0x0000555557d250ef mason`std::rt::lang_start_internal at rt.rs:164:5
frame #55: 0x00005555560f5217 mason`std::rt::lang_start(main=0x00005555561151d0, argc=1, argv=140737488346472, sigpipe=0) at rt.rs:198:5
frame #56: 0x000055555611521e mason`main + 30
frame #57: 0x00007ffff7cb51ca libc.so.6`___lldb_unnamed_symbol3278 + 122
frame #58: 0x00007ffff7cb528b libc.so.6`__libc_start_main + 139
frame #59: 0x0000555556089fa5 mason`_start + 37
Without diving too much into the stacktraces and respective libraries, it looks like this is all closing down the event loop and respective wl_display compositor connection before destroying the Instance (and Adapter which has a copy of these handles) from wgpu which tries to destroy the EGLDisplay that was built on top of the wl_display compositor connection.
That should normally not have too much to do with window destruction though.
EDIT: Kirill already mentioned exactly this in https://github.com/gfx-rs/wgpu/issues/4650#issuecomment-2848423731. It's a bit unfortunate that context got lost when this follow-up issue was opened.
Separately I wonder how much https://github.com/gfx-rs/wgpu/pull/8012 improves to the situation, if only for visibility (i.e. since the Instance is created with a RawDisplayHandle, the EventLoop that provided it should outlive the wgpu Instance).