{ 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 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; # Steam per-app declarative config via steam-config-nix: # - launch-option env vars (PROTON_FSR4_UPGRADE et al) # - file drops into the install dir (FH5 intro stubs, OptiScaler DLLs + # hand-written FH5/RDNA3 INI). Backups land next to replaced files with # a `.steam-config-nix-backup` suffix on first apply. # # 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 next exit. File drops happen in the same run but # don't share that concern \u2014 they only touch steamapps/common/ # and steamapps/compatdata//pfx. # # OptiScaler intercepts FH5's DLSS/XeSS calls and reroutes them through # the bundled FFX SDK. Override values + sources for the FH5/RDNA3 path # 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 (no API): # - Properties > Compatibility: pick the GE-Proton tool by hand. The # `compatTool` option is intentionally unset \u2014 nixpkgs registers # proton-ge-bin under its versioned id (e.g. GE-Proton10-34), and # writing the generic "GE-Proton" string silently falls back to # bundled Proton. # - 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. # # 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 trigger a redeploy. 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. programs.steam.config = let fromOpti = relpath: { source = "${pkgs.optiscaler}/${relpath}"; mode = "create"; }; in { 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"; }; files = { # FH5 cold-start splash. Two copies live in the install (SD + # hires); the engine picks one based on the installed asset # profile, so stub both. PCGamingWiki documents both paths under # "Skip intro video". "media/UI/Videos/T10_MS_Combined.bk2".empty = true; "media/UI/Videos/hires/T10_MS_Combined.bk2".empty = true; # 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; 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; }; }; }