From 9b8320cead708e70a9db4729d25ed7258bc12208 Mon Sep 17 00:00:00 2001 From: nnduc Date: Sun, 27 Sep 2026 17:16:30 +0700 Subject: [PATCH] adaptive sync --- README.md | 6 ++++++ sway/config | 4 +++- sway/scripts/lock-now | 10 +++++----- sway/scripts/vrr-follow | 14 ++++++++++++++ 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100755 sway/scripts/vrr-follow diff --git a/README.md b/README.md index 92b519c..a2e8750 100755 --- a/README.md +++ b/README.md @@ -189,6 +189,12 @@ sudo emerge --ask games-util/gamemode - `mangohud` is **not in the main Gentoo tree** — GURU overlay (`sudo emerge --ask games-util/mangohud` after enabling GURU). +Adaptive sync (sway): the desktop runs at a fixed 240 Hz with VRR off, because +sway only renders on change and idle frame rates fall below the panel's 48 Hz +floor (out of LFC range → flicker). `sway/scripts/vrr-follow` turns VRR on for +DP-1 only while the visible workspace has a fullscreen window; `lock-now` turns +it off while locked. Needs `jq`. + ### GPU monitoring & tuning **Arch** diff --git a/sway/config b/sway/config index 8ed5263..2f26caa 100755 --- a/sway/config +++ b/sway/config @@ -38,7 +38,9 @@ exec --no-startup-id ~/.config/sway/scripts/wallpaper-rotate $wallpaper_dir # You can get the names of your outputs by running: swaymsg -t get_outputs # adaptive_sync on the desktop makes sway stutter/flicker; 120Hz avoids AMD # VRAM clock flicker at high refresh (see README). -output DP-1 mode 1920x1080@120Hz adaptive_sync off allow_tearing yes +output DP-1 mode 1920x1080@240Hz adaptive_sync off allow_tearing yes +exec_always pkill -xf '/bin/sh /home/nnduc/.config/sway/scripts/vrr-follow'; ~/.config/sway/scripts/vrr-follow +#output DP-1 mode 1920x1080@240Hz adaptive_sync on allow_tearing yes ### Idle configuration # diff --git a/sway/scripts/lock-now b/sway/scripts/lock-now index 5292c3e..16d78b0 100755 --- a/sway/scripts/lock-now +++ b/sway/scripts/lock-now @@ -1,8 +1,8 @@ #!/bin/bash wall_dir="${1:?wallpaper directory required}" img=$(find "$wall_dir" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | shuf -n1) -if [ -n "$img" ]; then - exec swaylock -f -i "$img" -else - exec swaylock -f -fi +swaymsg -q output DP-1 adaptive_sync off # lock screen redraws rarely: fixed 240 Hz +swaylock -f ${img:+-i "$img"} +# once unlocked, let vrr-follow decide again (in background so swayidle/suspend aren't held up) +( while pgrep -x swaylock >/dev/null; do sleep 1; done + ~/.config/sway/scripts/vrr-follow once ) & diff --git a/sway/scripts/vrr-follow b/sway/scripts/vrr-follow new file mode 100755 index 0000000..5fc9f27 --- /dev/null +++ b/sway/scripts/vrr-follow @@ -0,0 +1,14 @@ +#!/bin/sh +# adaptive_sync on DP-1 only while the visible workspace shows a fullscreen window +OUT=DP-1 +update() { + if [ "$(swaymsg -t get_tree | jq --arg o "$OUT" ' + .nodes[] | select(.name==$o) as $out | $out.nodes[] + | select(.name==$out.current_workspace) + | [.. | objects | select((.fullscreen_mode? // 0) > 0)] | length')" -gt 0 ] + then s=on; else s=off; fi + [ "$s" != "$last" ] && swaymsg -q output "$OUT" adaptive_sync "$s" && last=$s +} +[ "$1" = once ] && { update; exit; } +update +swaymsg -t subscribe -m '["workspace","window"]' | while read -r _; do update; done