game-mods: drop in-house launchOptions writer, hardcode FH5 ini
Replaces three handfuls of custom code with upstream / static data:
- Per-app Steam launch options now declared via different-name/steam-
config-nix's `programs.steam.config.apps.<n>` instead of a custom
~70-line `apply_launch_options` Python function. The dropped writer
was racy: it edited localconfig.vdf without checking for a running
Steam, so any timer firing while Steam was open would lose its
changes on the next Steam shutdown. steam-config-nix's `closeSteam`
flag closes that race.
Also moves the GE-Proton compat-tool pin to declarative config —
one fewer manual click in Steam UI to remember.
- `mods.<>.launchOptions` option, the `launchOptionsData` aggregation,
and `LAUNCH_OPTIONS_DATA` are removed from desktop-game-mods.nix.
The module now does file-drops only; Steam config lives in its own
`programs.steam.config` namespace, where it belongs.
fh5-vkd3d-no-hvv (which existed only to set VKD3D_CONFIG) collapses
into the FH5 launchOptions block in hosts/yarn/default.nix.
- `unitConfig.X-ConfigHash` on game-mods.service is replaced with
`restartTriggers`. NixOS already emits `X-Restart-Triggers=<hash>`
on the unit; the workaround was redundant. The Type=oneshot,
RemainAfterExit=no semantics make `systemctl restart` re-run
ExecStart cleanly on hash change.
- The awk pipeline that patched OptiScaler's stock OptiScaler.ini at
build time is replaced with a hand-written hosts/yarn/optiscaler-
fh5-rdna3.ini containing only the keys we override (5 of them).
OptiScaler's Config::readString defaults missing keys to "auto"
(Config.cpp:1568), so a minimal file is sufficient. Side benefits:
one upstream-source dependency removed, a key-rename in upstream
becomes a behavior change rather than a silent awk-no-match.
Override values + sources:
Fsr4Update=true FH5 wiki, FSR4 Linux Setup
DlssReactiveMaskBias=0.65 FH5 wiki, "Known Issues"
FsrNonLinearColorSpace=true FSR4 wiki, "Image Quality"
EnableFsr2Inputs=false FH5 wiki, "Known Issues"
Dxgi=false FH5 wiki
- forza-trigger's three custom Python derivations (pydualsense,
hidapi-usb, fdp) factored out of default.nix into a sibling
python-packages.nix. Same logic, single-purpose file. Bumping a
version is now a one-place hash roll.
- pkgs.dualsensectl removed from the daemon's environment.system-
Packages. Single-shot writes from the CLI get clobbered by the BG
sendReport thread within ~4ms anyway, so the tool is only useful
with the daemon stopped — not worth the unconditional install.
Bring it in ad-hoc with `nix-shell -p dualsensectl`.
This commit is contained in:
@@ -83,61 +83,40 @@
|
||||
# PS5 DualSense adaptive triggers in Forza Horizon 4 / 5.
|
||||
services.forzaTrigger.enable = true;
|
||||
|
||||
# Declarative game-file mods on top of Steam.
|
||||
# Declarative game-file mods on top of Steam (file drops only; Steam launch
|
||||
# options live in `programs.steam.config.apps` below).
|
||||
#
|
||||
# fh5-no-intro: stub the 40 MB T10/Microsoft Studios cold-start splash.
|
||||
# Two copies live in the install (SD + hires); engine picks one based on
|
||||
# the installed asset profile, so stub both. PCGamingWiki documents both
|
||||
# paths under "Skip intro video".
|
||||
#
|
||||
# fh5-optiscaler: drop OptiScaler v0.9.1 + a FH5-tuned OptiScaler.ini into
|
||||
# the install dir to enable FSR 4 INT8 on this RDNA 3 Navi 32 box.
|
||||
# OptiScaler intercepts FH5's DLSS/XeSS calls and reroutes them through
|
||||
# the bundled FFX SDK. Settings flipped from upstream defaults:
|
||||
# Fsr4Update auto -> true # FSR 4 path required for INT8 RDNA 3
|
||||
# Dxgi auto -> false # FH5 wiki: required for 0.9
|
||||
# DlssReactiveMaskBias auto -> 0.65 # FH5 wiki: fixes flickering lights, reduces car ghosting
|
||||
# fh5-optiscaler: drop OptiScaler v0.9.1 + a hand-written FH5/RDNA3 INI into
|
||||
# the install dir to enable FSR 4 INT8 on this Navi 32 box. OptiScaler
|
||||
# intercepts FH5's DLSS/XeSS calls and reroutes them through the bundled
|
||||
# FFX SDK. Override values + sources live in
|
||||
# ./optiscaler-fh5-rdna3.ini; keys not listed there fall through to
|
||||
# OptiScaler's "auto" defaults.
|
||||
#
|
||||
# Required one-time per-game setup in Steam (Proton picker is not
|
||||
# declarable from NixOS; launch options are written declaratively below):
|
||||
# 1. Properties -> Compatibility: force "GE-Proton" (proton-ge-bin is
|
||||
# already in extraCompatPackages; pick the latest installed).
|
||||
# Steam must be closed when the launch options write happens, or
|
||||
# Steam will overwrite our localconfig.vdf edit on shutdown.
|
||||
# 2. In-game: switch the Upscaling option from FSR 2.2 to DLSS or XeSS
|
||||
# (FSR 2 inputs aren't intercepted). Press Insert to open the Opti
|
||||
# overlay and set the FFX upscaler to FSR 4.
|
||||
# Required one-time per-game setup the user has to do in Steam (the
|
||||
# in-game upscaler picker has no public API):
|
||||
# - In-game: switch the Upscaling option from FSR 2.2 to DLSS or XeSS
|
||||
# (FSR 2 inputs aren't intercepted). Press Insert to open the Opti
|
||||
# overlay and set the FFX upscaler to FSR 4.
|
||||
#
|
||||
# Caveats:
|
||||
# - OptiScaler.ini is dropped with mode = "init" so in-game overlay edits
|
||||
# persist. The awk-patched template below is only written on first apply
|
||||
# (or after manual deletion). To push a new default into an existing
|
||||
# persist. The hand-written template is only written on first apply (or
|
||||
# after manual deletion). To push a new default into an existing
|
||||
# install: rm OptiScaler.ini in the FH5 dir, then `systemctl start
|
||||
# game-mods`. The DLLs and other static assets stay mode = "create" so
|
||||
# they're updated on every OptiScaler version bump.
|
||||
# - OptiScaler's installation page warns against use with online games.
|
||||
# FH5 has no kernel-mode anti-cheat but Playground does server-side
|
||||
# telemetry. Use at your own risk.
|
||||
#
|
||||
# fh5-vkd3d-no-hvv: append `VKD3D_CONFIG=no_upload_hvv` to FH5's launch
|
||||
# options. Disables vkd3d-proton's host-visible VRAM upload heap, which
|
||||
# works around a Proton stutter/crash on this box. Kept as its own mod
|
||||
# (no files, just env) so the workaround can be removed independently of
|
||||
# OptiScaler when a future Proton release fixes the underlying issue.
|
||||
services.gameMods =
|
||||
let
|
||||
optiPkg = pkgs.optiscaler;
|
||||
# OptiScaler.ini ships with CRLF line endings, so we use awk with explicit
|
||||
# RS/ORS to keep the rewrites line-ending agnostic. The regex is matched
|
||||
# against the CR-stripped record, the original CRLF is restored on output.
|
||||
optiIni = pkgs.runCommand "OptiScaler-fh5.ini" { } ''
|
||||
awk -v RS='\r\n' -v ORS='\r\n' '
|
||||
/^Fsr4Update=auto$/ { print "Fsr4Update=true"; next }
|
||||
/^Dxgi=auto$/ { print "Dxgi=false"; next }
|
||||
/^DlssReactiveMaskBias=auto$/ { print "DlssReactiveMaskBias=0.65"; next }
|
||||
{ print }
|
||||
' ${optiPkg}/OptiScaler.ini > $out
|
||||
'';
|
||||
fromOpti = relpath: {
|
||||
source = "${optiPkg}/${relpath}";
|
||||
mode = "create";
|
||||
@@ -152,24 +131,14 @@
|
||||
};
|
||||
mods."fh5-optiscaler" = {
|
||||
steamAppId = 1551360;
|
||||
# RDNA 3 (Navi 32) FSR 4 path on Linux:
|
||||
# PROTON_FSR4_UPGRADE=1 opts FH5 into Proton's FSR 4 upgrade.
|
||||
# DXIL_SPIRV_CONFIG=wmma_rdna3_... fixes broken visuals on RDNA 3 per
|
||||
# the OptiScaler FSR4 wiki.
|
||||
# Other FH5-targeting mods (e.g. fh5-vkd3d-no-hvv) append their own
|
||||
# entries to this list; the module joins them and adds %command%.
|
||||
launchOptions = [
|
||||
"PROTON_FSR4_UPGRADE=1"
|
||||
"DXIL_SPIRV_CONFIG=wmma_rdna3_workaround"
|
||||
];
|
||||
files = {
|
||||
# OptiScaler.dll is renamed to dxgi.dll so FH5's DLL search order
|
||||
# picks it up as the dxgi shim per the OptiScaler FH5 wiki page.
|
||||
"dxgi.dll" = fromOpti "OptiScaler.dll";
|
||||
"OptiScaler.ini" = {
|
||||
source = optiIni;
|
||||
# init: drop the patched template once, then leave it alone so
|
||||
# the in-game overlay can persist user tweaks.
|
||||
source = ./optiscaler-fh5-rdna3.ini;
|
||||
# init: drop the template once, then leave it alone so the in-game
|
||||
# overlay can persist user tweaks.
|
||||
mode = "init";
|
||||
};
|
||||
}
|
||||
@@ -188,9 +157,30 @@
|
||||
"libxess_fg.dll"
|
||||
] fromOpti;
|
||||
};
|
||||
mods."fh5-vkd3d-no-hvv" = {
|
||||
steamAppId = 1551360;
|
||||
launchOptions = [ "VKD3D_CONFIG=no_upload_hvv" ];
|
||||
};
|
||||
|
||||
# Steam launch options + per-app compat-tool pin via steam-config-nix
|
||||
# (different-name/steam-config-nix). The patcher runs as a system oneshot
|
||||
# at activation; closeSteam = true ensures Steam is shut down before the
|
||||
# localconfig.vdf write so Steam can't clobber it on its next exit.
|
||||
programs.steam.config = {
|
||||
enable = true;
|
||||
closeSteam = true;
|
||||
defaultCompatTool = "GE-Proton";
|
||||
apps."fh5" = {
|
||||
id = 1551360;
|
||||
compatTool = "GE-Proton";
|
||||
launchOptions.env = {
|
||||
# OptiScaler FSR 4 INT8 path on this RDNA 3 (Navi 32) box.
|
||||
# PROTON_FSR4_UPGRADE opts FH5 into Proton's FSR 4 DLL upgrade;
|
||||
# DXIL_SPIRV_CONFIG fixes the broken visuals the wmma RDNA3 emulation
|
||||
# path otherwise produces. Source: OptiScaler FSR4 wiki Linux Setup.
|
||||
PROTON_FSR4_UPGRADE = "1";
|
||||
DXIL_SPIRV_CONFIG = "wmma_rdna3_workaround";
|
||||
# vkd3d-proton stutter/crash workaround on this box; remove when a
|
||||
# future Proton release fixes the upload-hvv path upstream.
|
||||
VKD3D_CONFIG = "no_upload_hvv";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user