diff options
| author | srdusr <[email protected]> | 2025-05-28 09:42:00 +0200 |
|---|---|---|
| committer | srdusr <[email protected]> | 2025-05-28 09:42:00 +0200 |
| commit | 6a9e50280ad8262e9fe49e390527e7490564f8dd (patch) | |
| tree | 6911dbfe68ac983c228b5c9fc9320beae42b6e6a /crates/wayland/src/udev/platform.rs | |
| parent | d0103908bd1c316bdebaa48e13aae332cffdeabf (diff) | |
| download | srdwm-6a9e50280ad8262e9fe49e390527e7490564f8dd.tar.gz srdwm-6a9e50280ad8262e9fe49e390527e7490564f8dd.zip | |
Add a real general.gpu config option for the GPU render path
SRDWM_GPU=1 was the only way to opt into the udev backend's GBM+EGL
GPU render path - an env var, not a real config option, with no way
to enable it from init.lua the way every other general.* flag works.
WindowManager::gpu_enabled (plain bool, false by default - unlike
rounded_corners_enabled's Option<bool>, GPU rendering has one
unambiguous default regardless of which backend ends up connecting,
so there's no "let the backend decide" case to preserve) is read from
general.gpu in apply_general_settings, same as every other general.*
key. gpu::probe now takes an explicit enabled: bool instead of
checking the env var itself; udev/platform.rs's call site computes it
as wm.gpu_enabled OR SRDWM_GPU=1, so the env var still works as a
quick manual override for testing without touching config, on top of
the new persistent option.
Falls back to the existing software (Pixman) path exactly as before
on any failure at any step (no GBM device, no atomic-modesetting
support, a software-only EGL renderer, ...) - gpu::probe's own
fallback behavior is unchanged, only how the initial enabled/disabled
decision gets made.
Diffstat (limited to 'crates/wayland/src/udev/platform.rs')
| -rw-r--r-- | crates/wayland/src/udev/platform.rs | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/crates/wayland/src/udev/platform.rs b/crates/wayland/src/udev/platform.rs index 19991e8..691c8de 100644 --- a/crates/wayland/src/udev/platform.rs +++ b/crates/wayland/src/udev/platform.rs @@ -36,15 +36,21 @@ impl UdevPlatform { .open(&gpu_path, rustix::fs::OFlags::RDWR | rustix::fs::OFlags::CLOEXEC) .map_err(err)?; let card = Rc::new(Card(fd)); - // Opt-in only (`SRDWM_GPU=1`, unset by default) - see `gpu::probe`'s - // own doc comment for exactly what this does and does not do yet. - // A no-op unless that variable is set, so this line changes nothing - // about any session that doesn't set it. `gpu_notifier` is - // registered as its own calloop event source further down - // (alongside `register_drm_fd`'s own registration for the - // existing legacy heads); `gpu_context` is stored on `UdevState` - // below and consulted by `render_udev_frame`. - let (mut gpu_context, gpu_notifier) = match super::gpu::probe(&card) { + // Opt-in only - `general.gpu` in config (`wm.gpu_enabled`, + // `false` by default) or the lower-level `SRDWM_GPU=1` env var, + // whichever says yes - see `gpu::probe`'s own doc comment for + // exactly what this does and does not do yet. A no-op unless + // either says to, so this line changes nothing about any session + // that leaves both alone. The env var stays as a quick manual + // override for testing without touching config (still works even + // if `general.gpu` is explicitly `false`) - it does not gate + // config *off*, only ever adds an extra way to opt *in*. + // `gpu_notifier` is registered as its own calloop event source + // further down (alongside `register_drm_fd`'s own registration + // for the existing legacy heads); `gpu_context` is stored on + // `UdevState` below and consulted by `render_udev_frame`. + let gpu_enabled = wm.borrow().gpu_enabled || std::env::var("SRDWM_GPU").as_deref() == Ok("1"); + let (mut gpu_context, gpu_notifier) = match super::gpu::probe(&card, gpu_enabled) { Some((ctx, notifier)) => (Some(ctx), Some(notifier)), None => (None, None), }; |