nixpkgs' proton-ge-bin (the package wired into programs.steam.extra- CompatPackages via modules/desktop-steam.nix) registers in Steam's compat-tool list under its versioned id, currently GE-Proton10-34. steam-config-nix's README example uses the unversioned string "GE-Proton", which on a fresh boot wrote that literal value into localconfig.vdf — Steam resolved it to no installed tool and silently fell back to bundled Proton 10. FH5 then launched on stock Proton, which doesn't pick up PROTON_FSR4_UPGRADE the way GE does. Drop both `compatTool` (per-app) and `defaultCompatTool` (global). The wrapper-based launchOptions.env path is unaffected — env vars still pass through to whatever Proton Steam ends up using. Tool selection goes back to manual Steam UI > Properties > Compatibility. A versioned pin (`compatTool = "GE-Proton10-34";`) would work but couples the host config to whatever the proton-ge-bin nixpkgs entry ships this week; not worth the maintenance.
191 lines
6.3 KiB
Nix
191 lines
6.3 KiB
Nix
{
|
|
pkgs,
|
|
lib,
|
|
username,
|
|
inputs,
|
|
site_config,
|
|
...
|
|
}:
|
|
{
|
|
imports = [
|
|
../../modules/desktop-common.nix
|
|
../../modules/desktop-jovian.nix
|
|
../../modules/no-rgb.nix
|
|
./disk.nix
|
|
./impermanence.nix
|
|
./lact.nix
|
|
./vr.nix
|
|
./forza-trigger
|
|
../../modules/desktop-game-mods.nix
|
|
|
|
inputs.impermanence.nixosModules.impermanence
|
|
];
|
|
|
|
fileSystems."/media/games" = {
|
|
device = "/dev/disk/by-uuid/1878136e-765d-4784-b204-3536ab4fdac8";
|
|
fsType = "f2fs";
|
|
options = [ "nofail" ];
|
|
};
|
|
|
|
systemd.targets = {
|
|
sleep.enable = false;
|
|
suspend.enable = false;
|
|
hibernate.enable = false;
|
|
hybrid-sleep.enable = false;
|
|
};
|
|
|
|
networking.hostId = "abf570f9";
|
|
|
|
# Static IP for consistent SSH access
|
|
networking.networkmanager.ensureProfiles.profiles.enp7s0-static = {
|
|
connection = {
|
|
id = "enp7s0-static";
|
|
type = "ethernet";
|
|
interface-name = "enp7s0";
|
|
autoconnect = true;
|
|
};
|
|
ipv4 = {
|
|
method = "manual";
|
|
address1 = "${site_config.hosts.yarn.ip}/24,${site_config.lan.gateway}";
|
|
dns = lib.concatMapStrings (n: "${n};") site_config.dns_servers;
|
|
};
|
|
ipv6.method = "disabled";
|
|
};
|
|
|
|
services.openssh = {
|
|
enable = true;
|
|
ports = [ 22 ];
|
|
settings = {
|
|
PasswordAuthentication = false;
|
|
PermitRootLogin = "yes";
|
|
};
|
|
};
|
|
|
|
users.users.${username}.openssh.authorizedKeys.keys = [
|
|
site_config.ssh_keys.laptop
|
|
];
|
|
|
|
users.users.root.openssh.authorizedKeys.keys = [
|
|
site_config.ssh_keys.laptop
|
|
site_config.ssh_keys.ci_deploy
|
|
];
|
|
|
|
programs.steam = {
|
|
remotePlay.openFirewall = true;
|
|
localNetworkGameTransfers.openFirewall = true;
|
|
};
|
|
|
|
environment.systemPackages = [ pkgs.jovian-stubs ];
|
|
|
|
# yarn is not a Steam Deck
|
|
jovian.devices.steamdeck.enable = false;
|
|
|
|
# PS5 DualSense adaptive triggers in Forza Horizon 4 / 5.
|
|
services.forzaTrigger.enable = true;
|
|
|
|
# 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 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 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 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.
|
|
services.gameMods =
|
|
let
|
|
optiPkg = pkgs.optiscaler;
|
|
fromOpti = relpath: {
|
|
source = "${optiPkg}/${relpath}";
|
|
mode = "create";
|
|
};
|
|
in
|
|
{
|
|
enable = true;
|
|
mods."fh5-no-intro" = {
|
|
steamAppId = 1551360;
|
|
files."media/UI/Videos/T10_MS_Combined.bk2".empty = true;
|
|
files."media/UI/Videos/hires/T10_MS_Combined.bk2".empty = true;
|
|
};
|
|
mods."fh5-optiscaler" = {
|
|
steamAppId = 1551360;
|
|
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 = ./optiscaler-fh5-rdna3.ini;
|
|
# init: drop the template once, then leave it alone so the in-game
|
|
# overlay can persist user tweaks.
|
|
mode = "init";
|
|
};
|
|
}
|
|
// lib.genAttrs [
|
|
"D3D12_Optiscaler/D3D12Core.dll"
|
|
"amd_fidelityfx_dx12.dll"
|
|
"amd_fidelityfx_framegeneration_dx12.dll"
|
|
"amd_fidelityfx_upscaler_dx12.dll"
|
|
"amd_fidelityfx_vk.dll"
|
|
"dlssg_to_fsr3_amd_is_better.dll"
|
|
"fakenvapi.dll"
|
|
"fakenvapi.ini"
|
|
"libxell.dll"
|
|
"libxess.dll"
|
|
"libxess_dx11.dll"
|
|
"libxess_fg.dll"
|
|
] fromOpti;
|
|
};
|
|
};
|
|
|
|
# Steam launch options 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.
|
|
#
|
|
# No declarative compat-tool pin: nixpkgs' proton-ge-bin registers under
|
|
# its versioned tool id (e.g. GE-Proton10-34), not the generic "GE-Proton"
|
|
# string steam-config-nix's README assumes, so writing the latter resolved
|
|
# to no installed tool and silently fell back to bundled Proton. Pick the
|
|
# tool in Steam UI > Properties > Compatibility instead.
|
|
programs.steam.config = {
|
|
enable = true;
|
|
closeSteam = true;
|
|
apps."fh5" = {
|
|
id = 1551360;
|
|
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";
|
|
};
|
|
};
|
|
};
|
|
}
|