From 6a13b3311d320a304e11c39fa4810ac310669056 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 12:40:07 +0000 Subject: [PATCH 1/2] fix(wayland): bind wl_display to egl renderer for hardware acceleration Qt applications and browsers require the `EGL_WL_bind_wayland_display` extension to properly initialize hardware acceleration natively on Wayland. This explicitly calls `bind_wl_display()` on the `GlesRenderer` (using the `ImportEgl` trait) in both the DRM and Winit backends, making this extension available to Wayland clients. Co-authored-by: paperbenni <15818888+paperbenni@users.noreply.github.com> --- src/wayland/runtime/drm.rs | 8 ++++++++ src/wayland/runtime/winit.rs | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/wayland/runtime/drm.rs b/src/wayland/runtime/drm.rs index 3befa173..38eaa093 100644 --- a/src/wayland/runtime/drm.rs +++ b/src/wayland/runtime/drm.rs @@ -9,6 +9,7 @@ use smithay::backend::drm::{DrmDevice, DrmEvent}; use smithay::backend::libinput::LibinputInputBackend; use smithay::backend::libinput::LibinputSessionInterface; use smithay::backend::renderer::ImportDma; +use smithay::backend::renderer::ImportEgl; use smithay::backend::renderer::gles::GlesRenderer; use smithay::backend::session::Event as SessionEvent; use smithay::backend::session::Session; @@ -72,6 +73,13 @@ pub fn run() -> ! { crate::runtime::init_keyboard_layout(&mut state.wm); state.init_dmabuf_global(dmabuf_formats, Some(&egl_display)); + + state.with_renderer(|state, renderer| { + if let Err(err) = renderer.bind_wl_display(&state.display_handle) { + log::warn!("failed to bind egl to wayland display: {}", err); + } + }); + state.init_screencopy_manager(); let cursor_manager = init_cursor_manager(&state.cursor_config); diff --git a/src/wayland/runtime/winit.rs b/src/wayland/runtime/winit.rs index 90c1e48a..abdba2ed 100644 --- a/src/wayland/runtime/winit.rs +++ b/src/wayland/runtime/winit.rs @@ -8,6 +8,7 @@ use std::time::Duration; use smithay::backend::input::InputEvent; use smithay::backend::renderer::ImportDma; +use smithay::backend::renderer::ImportEgl; use smithay::backend::renderer::gles::GlesRenderer; use smithay::backend::winit::{self, WinitEvent}; use smithay::reexports::calloop::{EventLoop, LoopSignal}; @@ -53,6 +54,11 @@ pub fn run() -> ! { crate::runtime::init_keyboard_layout(&mut state.wm); state.init_dmabuf_global(dmabuf_formats, Some(&egl_display)); + + if let Err(err) = backend.renderer().bind_wl_display(&state.display_handle) { + log::warn!("failed to bind egl to wayland display: {}", err); + } + state.init_screencopy_manager(); let output_size = backend.window_size(); From 06ec5daa812ebf2dcf298491f791723c5e366463 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Mon, 23 Mar 2026 12:49:13 +0000 Subject: [PATCH 2/2] fix(wayland): bind wl_display to egl renderer for hardware acceleration Qt applications and browsers require the `EGL_WL_bind_wayland_display` extension to properly initialize hardware acceleration natively on Wayland. This explicitly calls `bind_wl_display()` on the `GlesRenderer` (using the `ImportEgl` trait) in both the DRM and Winit backends, making this extension available to Wayland clients. Co-authored-by: Claude Co-authored-by: paperbenni <15818888+paperbenni@users.noreply.github.com> --- src/backend/wayland/compositor/state.rs | 9 +++++++++ src/wayland/runtime/drm.rs | 5 +---- src/wayland/runtime/winit.rs | 5 +---- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/backend/wayland/compositor/state.rs b/src/backend/wayland/compositor/state.rs index a89cde6d..3d1be67d 100644 --- a/src/backend/wayland/compositor/state.rs +++ b/src/backend/wayland/compositor/state.rs @@ -305,6 +305,15 @@ impl WaylandState { } } + pub fn bind_egl_to_display(&self, renderer: &mut R) + where + R: smithay::backend::renderer::ImportEgl, + { + if let Err(err) = renderer.bind_wl_display(&self.display_handle) { + log::warn!("failed to bind egl to wayland display: {}", err); + } + } + pub fn init_dmabuf_global(&mut self, formats: Vec, egl_display: Option<&EGLDisplay>) { if self.dmabuf_global.is_some() { return; diff --git a/src/wayland/runtime/drm.rs b/src/wayland/runtime/drm.rs index 38eaa093..7ac5d864 100644 --- a/src/wayland/runtime/drm.rs +++ b/src/wayland/runtime/drm.rs @@ -9,7 +9,6 @@ use smithay::backend::drm::{DrmDevice, DrmEvent}; use smithay::backend::libinput::LibinputInputBackend; use smithay::backend::libinput::LibinputSessionInterface; use smithay::backend::renderer::ImportDma; -use smithay::backend::renderer::ImportEgl; use smithay::backend::renderer::gles::GlesRenderer; use smithay::backend::session::Event as SessionEvent; use smithay::backend::session::Session; @@ -75,9 +74,7 @@ pub fn run() -> ! { state.init_dmabuf_global(dmabuf_formats, Some(&egl_display)); state.with_renderer(|state, renderer| { - if let Err(err) = renderer.bind_wl_display(&state.display_handle) { - log::warn!("failed to bind egl to wayland display: {}", err); - } + state.bind_egl_to_display(renderer); }); state.init_screencopy_manager(); diff --git a/src/wayland/runtime/winit.rs b/src/wayland/runtime/winit.rs index abdba2ed..132a80e3 100644 --- a/src/wayland/runtime/winit.rs +++ b/src/wayland/runtime/winit.rs @@ -8,7 +8,6 @@ use std::time::Duration; use smithay::backend::input::InputEvent; use smithay::backend::renderer::ImportDma; -use smithay::backend::renderer::ImportEgl; use smithay::backend::renderer::gles::GlesRenderer; use smithay::backend::winit::{self, WinitEvent}; use smithay::reexports::calloop::{EventLoop, LoopSignal}; @@ -55,9 +54,7 @@ pub fn run() -> ! { state.init_dmabuf_global(dmabuf_formats, Some(&egl_display)); - if let Err(err) = backend.renderer().bind_wl_display(&state.display_handle) { - log::warn!("failed to bind egl to wayland display: {}", err); - } + state.bind_egl_to_display(backend.renderer()); state.init_screencopy_manager();