diff --git a/config/dot/hypr/monitors.lua b/config/dot/hypr/monitors.lua index beff4f9..0847720 100644 --- a/config/dot/hypr/monitors.lua +++ b/config/dot/hypr/monitors.lua @@ -244,10 +244,20 @@ local shipped_mode = "4500x3000@60" local shipped_scale = 1.5 local shipped_transform = 0 --- 10-bit output. 4500x3000@60 at 10bpc is ~24 Gbps, right at the edge of DP 1.4 --- HBR3, so this relies on DSC. If the display fails to light up or falls back to --- a lower mode, drop this to 8 first. -local shipped_bitdepth = 10 +-- 8-bit output. 4500x3000@60 at 10bpc is ~24 Gbps, right at the edge of DP 1.4 +-- HBR3 and reliant on DSC, and this panel's link is marginal: every modeset +-- retrains it and blanks the screen. 8bpc keeps headroom on the link. +-- +-- Related: directScanoutPolicy is 0 in Panama settings (2026-09-13). With +-- scanout on, a fullscreen game whose buffer depth differs from the desktop +-- (games ship both 8- and 10-bit swapchains) makes Hyprland change the output +-- format, and on amdgpu a format change is a full modeset. Compositing always +-- keeps the format fixed, so the link never retrains mid-game. +-- +-- vrrPolicy is also 0 there. VRR on this panel loses sync and blacks out +-- (seen on GNOME in July 2026 and again here); a 60Hz panel gains little +-- from it anyway. +local shipped_bitdepth = 8 -- "auto" = sRGB at 8bpc, wide gamut at 10bpc. Not HDR; see header. local shipped_cm = "auto" diff --git a/config/dot/hypr/rules.lua b/config/dot/hypr/rules.lua index 9fcd80d..760cba3 100644 --- a/config/dot/hypr/rules.lua +++ b/config/dot/hypr/rules.lua @@ -125,6 +125,16 @@ hl.window_rule({ no_dim = true, }) +-- Steam games never get true fullscreen. Everything Hyprland does only for a +-- real fullscreen window (direct scanout, VRR, tearing, auto HDR) makes this +-- panel's marginal DP link retrain and blank (2026-09-13). "1 2" keeps the +-- window maximized internally while the game believes it is fullscreen, which +-- is what borderless windowed looks like from the game's side. +hl.window_rule({ + match = { class = "^steam_app_\\d+$" }, + fullscreen_state = "1 2", +}) + -- Steam itself is a normal window, but its transient popups are a mess. hl.window_rule({ match = { class = "^steam$", title = "^(Friends List|Steam Settings|Special Offer.*)$" },