Files
nixos/hosts/yarn/default.nix

180 lines
5.9 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
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/<dir>
# and steamapps/compatdata/<id>/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;
};
};
}