From 15c209fdd96c6f0628bfb034a2f318e0edde7d4e Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Thu, 20 Mar 2025 20:18:40 -0400 Subject: [PATCH] Add support for pcsx2. --- nix/configuration/configuration.nix | 1 + nix/configuration/hosts/odo/default.nix | 1 + nix/configuration/hosts/odo/wifi.nix | 7 +- nix/configuration/roles/pcsx2/default.nix | 95 ++++++++++++++++ nix/configuration/roles/pcsx2/files/PCSX2.ini | 104 ++++++++++++++++++ nix/steam_deck/configuration/home.nix | 1 + .../configuration/hosts/deck/default.nix | 1 + .../configuration/roles/pcsx2/default.nix | 94 ++++++++++++++++ .../configuration/roles/pcsx2/files/PCSX2.ini | 104 ++++++++++++++++++ 9 files changed, 405 insertions(+), 3 deletions(-) create mode 100644 nix/configuration/roles/pcsx2/default.nix create mode 100644 nix/configuration/roles/pcsx2/files/PCSX2.ini create mode 100644 nix/steam_deck/configuration/roles/pcsx2/default.nix create mode 100644 nix/steam_deck/configuration/roles/pcsx2/files/PCSX2.ini diff --git a/nix/configuration/configuration.nix b/nix/configuration/configuration.nix index 286918c..026b4d1 100644 --- a/nix/configuration/configuration.nix +++ b/nix/configuration/configuration.nix @@ -69,6 +69,7 @@ ./roles/sops ./roles/gcloud ./roles/steam_run_free + ./roles/pcsx2 ]; nix.settings.experimental-features = [ diff --git a/nix/configuration/hosts/odo/default.nix b/nix/configuration/hosts/odo/default.nix index 9b2dbd8..c5ac484 100644 --- a/nix/configuration/hosts/odo/default.nix +++ b/nix/configuration/hosts/odo/default.nix @@ -65,6 +65,7 @@ me.lvfs.enable = true; me.media.enable = true; me.nix_index.enable = true; + me.pcsx2.enable = true; me.python.enable = true; me.qemu.enable = true; me.rust.enable = true; diff --git a/nix/configuration/hosts/odo/wifi.nix b/nix/configuration/hosts/odo/wifi.nix index d523f3c..867f37f 100644 --- a/nix/configuration/hosts/odo/wifi.nix +++ b/nix/configuration/hosts/odo/wifi.nix @@ -9,9 +9,10 @@ imports = [ ]; config = { - environment.loginShellInit = lib.mkIf (!config.me.buildingIso) '' - doas iw dev wlan0 set power_save off - ''; + # Doesn't seem necessary starting with 6.13 + # environment.loginShellInit = lib.mkIf (!config.me.buildingIso) '' + # doas iw dev wlan0 set power_save off + # ''; # Enable debug logging for ath12k wifi card. boot.kernelParams = [ diff --git a/nix/configuration/roles/pcsx2/default.nix b/nix/configuration/roles/pcsx2/default.nix new file mode 100644 index 0000000..2af42ea --- /dev/null +++ b/nix/configuration/roles/pcsx2/default.nix @@ -0,0 +1,95 @@ +{ + config, + lib, + pkgs, + ... +}: + +{ + imports = [ ]; + + options.me = { + pcsx2.enable = lib.mkOption { + type = lib.types.bool; + default = false; + example = true; + description = "Whether we want to install pcsx2."; + }; + }; + + config = lib.mkIf config.me.pcsx2.enable ( + lib.mkMerge [ + (lib.mkIf config.me.graphical { + environment.systemPackages = with pkgs; [ + pcsx2 + ]; + + environment.persistence."/state" = lib.mkIf (!config.me.buildingIso) { + hideMounts = true; + users.talexander = { + directories = [ + { + # Shaders, games list, and achievement data. + directory = ".config/PCSX2/cache"; + user = "talexander"; + group = "talexander"; + mode = "0755"; + } + { + # Save states. + directory = ".config/PCSX2/sstates"; + user = "talexander"; + group = "talexander"; + mode = "0755"; + } + { + # Screenshots. + directory = ".config/PCSX2/snaps"; + user = "talexander"; + group = "talexander"; + mode = "0755"; + } + { + # Game covers. + directory = ".config/PCSX2/covers"; + user = "talexander"; + group = "talexander"; + mode = "0755"; + } + { + # Video recordings. + directory = ".config/PCSX2/videos"; + user = "talexander"; + group = "talexander"; + mode = "0755"; + } + ]; + }; + }; + + environment.persistence."/persist" = lib.mkIf (!config.me.buildingIso) { + hideMounts = true; + users.talexander = { + directories = [ + { + # Game saves + directory = ".config/PCSX2/memcards"; + user = "talexander"; + group = "talexander"; + mode = "0755"; + } + ]; + }; + }; + + home-manager.users.talexander = + { pkgs, ... }: + { + home.file.".config/PCSX2/inis/PCSX2.ini" = { + source = ./files/PCSX2.ini; + }; + }; + }) + ] + ); +} diff --git a/nix/configuration/roles/pcsx2/files/PCSX2.ini b/nix/configuration/roles/pcsx2/files/PCSX2.ini new file mode 100644 index 0000000..fe61506 --- /dev/null +++ b/nix/configuration/roles/pcsx2/files/PCSX2.ini @@ -0,0 +1,104 @@ +[UI] +SettingsVersion = 1 +InhibitScreensaver = true +ConfirmShutdown = false +StartPaused = false +PauseOnFocusLoss = true +StartFullscreen = true + + +[Folders] +Bios = ../../persist/games/ps2/bios +Snapshots = snaps +Savestates = sstates +MemoryCards = memcards +Logs = logs +Cheats = cheats +Patches = patches +UserResources = resources +Cache = cache +Textures = textures +InputProfiles = inputprofiles +Videos = videos + + +[EmuCore/GS] +VsyncEnable = true +# Internal resolution aspect corrected +ScreenshotSize = 1 +# webp +ScreenshotFormat = 2 +OsdShowFPS = true +# Capture video at internal resolution +VideoCaptureAutoResolution = true +# 2x native resolution +upscale_multiplier = 2 +CaptureContainer = mkv +VideoCaptureCodec = av1_vaapi +AudioCaptureCodec = flac + + +[Filenames] +BIOS = ps2-0230a-20080220.bin + +[MemoryCards] +Slot1_Enable = true +Slot1_Filename = Mcd001.ps2 +Slot2_Enable = true +Slot2_Filename = Mcd002.ps2 + + +[InputSources] +Keyboard = false +Mouse = false +SDL = true +# Enhanced ps4 and ps5 controller support +SDLControllerEnhancedMode = true +SDLPS5PlayerLED = true + + +[Pad1] +Type = DualShock2 +InvertL = 0 +InvertR = 0 +Deadzone = 0 +AxisScale = 1.33 +LargeMotorScale = 1 +SmallMotorScale = 1 +ButtonDeadzone = 0 +PressureModifier = 0.5 +Up = SDL-0/DPadUp +Right = SDL-0/DPadRight +Down = SDL-0/DPadDown +Left = SDL-0/DPadLeft +Triangle = SDL-0/Y +Circle = SDL-0/B +Cross = SDL-0/A +Square = SDL-0/X +Select = SDL-0/Back +Start = SDL-0/Start +L1 = SDL-0/LeftShoulder +L2 = SDL-0/+LeftTrigger +R1 = SDL-0/RightShoulder +R2 = SDL-0/+RightTrigger +L3 = SDL-0/LeftStick +R3 = SDL-0/RightStick +LUp = SDL-0/-LeftY +LRight = SDL-0/+LeftX +LDown = SDL-0/+LeftY +LLeft = SDL-0/-LeftX +RUp = SDL-0/-RightY +RRight = SDL-0/+RightX +RDown = SDL-0/+RightY +RLeft = SDL-0/-RightX +Analog = SDL-0/Guide +LargeMotor = SDL-0/LargeMotor +SmallMotor = SDL-0/SmallMotor + + +[AutoUpdater] +CheckAtStartup = false + + +[GameList] +RecursivePaths = /home/talexander/persist/games/ps2/roms diff --git a/nix/steam_deck/configuration/home.nix b/nix/steam_deck/configuration/home.nix index cbb12f9..ecc0307 100644 --- a/nix/steam_deck/configuration/home.nix +++ b/nix/steam_deck/configuration/home.nix @@ -9,6 +9,7 @@ imports = [ ./roles/2ship2harkinian ./roles/graphics + ./roles/pcsx2 ./roles/shipwright ./roles/sm64ex ./roles/steam_rom_manager diff --git a/nix/steam_deck/configuration/hosts/deck/default.nix b/nix/steam_deck/configuration/hosts/deck/default.nix index fb5c5e5..c99526d 100644 --- a/nix/steam_deck/configuration/hosts/deck/default.nix +++ b/nix/steam_deck/configuration/hosts/deck/default.nix @@ -10,6 +10,7 @@ config = { me.graphical = true; + me.pcsx2.enable = true; me.ship2harkinian.enable = true; me.shipwright.enable = true; me.sm64ex.enable = true; diff --git a/nix/steam_deck/configuration/roles/pcsx2/default.nix b/nix/steam_deck/configuration/roles/pcsx2/default.nix new file mode 100644 index 0000000..616bffd --- /dev/null +++ b/nix/steam_deck/configuration/roles/pcsx2/default.nix @@ -0,0 +1,94 @@ +# MANUAL: mkdir -p ~/.persist/.config/PCSX2/memcards ~/.state/.config/PCSX2/cache ~/.state/.config/PCSX2/sstates ~/.state/.config/PCSX2/snaps ~/.state/.config/PCSX2/covers ~/.state/.config/PCSX2/videos +{ + config, + lib, + pkgs, + ... +}: + +let + steam_pcsx2 = pkgs.writeScriptBin "steam_pcsx2" '' + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${pkgs.libglvnd}/lib" + exec ${pkgs.pcsx2}/bin/pcsx2-qt + ''; +in +{ + imports = [ ]; + + options.me = { + pcsx2.enable = lib.mkOption { + type = lib.types.bool; + default = false; + example = true; + description = "Whether we want to install pcsx2."; + }; + }; + + config = lib.mkIf config.me.pcsx2.enable ( + lib.mkMerge [ + (lib.mkIf config.me.graphical { + home.packages = with pkgs; [ + pcsx2 + steam_pcsx2 + ]; + + home.file.".config/PCSX2/inis/PCSX2.ini" = { + source = ./files/PCSX2.ini; + }; + + home.persistence."/home/deck/.persist" = { + directories = [ + { + directory = ".config/PCSX2/memcards"; + method = "symlink"; + } + ]; + }; + home.persistence."/home/deck/.state" = { + directories = [ + { + directory = ".config/PCSX2/cache"; + method = "symlink"; + } + { + directory = ".config/PCSX2/sstates"; + method = "symlink"; + } + { + directory = ".config/PCSX2/snaps"; + method = "symlink"; + } + { + directory = ".config/PCSX2/covers"; + method = "symlink"; + } + { + directory = ".config/PCSX2/videos"; + method = "symlink"; + } + ]; + }; + + nixpkgs.overlays = [ + (final: prev: { + pcsx2 = pkgs.buildEnv { + name = prev.pcsx2.name; + paths = [ + (config.lib.nixGL.wrap prev.pcsx2) + ]; + extraOutputsToInstall = [ + "man" + "doc" + "info" + ]; + # We have to use 555 instead of the normal 444 here because the .desktop file ends up inside $HOME on steam deck and desktop files must be either not in $HOME or must be executable, otherwise KDE Plasma refuses to execute them. + postBuild = '' + chmod 0555 $out/share/applications/PCSX2.desktop + ''; + }; + }) + ]; + }) + ] + ); +} diff --git a/nix/steam_deck/configuration/roles/pcsx2/files/PCSX2.ini b/nix/steam_deck/configuration/roles/pcsx2/files/PCSX2.ini new file mode 100644 index 0000000..e38238d --- /dev/null +++ b/nix/steam_deck/configuration/roles/pcsx2/files/PCSX2.ini @@ -0,0 +1,104 @@ +[UI] +SettingsVersion = 1 +InhibitScreensaver = true +ConfirmShutdown = false +StartPaused = false +PauseOnFocusLoss = true +StartFullscreen = true + + +[Folders] +Bios = ../../.persist/manual/games/ps2/bios +Snapshots = snaps +Savestates = sstates +MemoryCards = memcards +Logs = logs +Cheats = cheats +Patches = patches +UserResources = resources +Cache = cache +Textures = textures +InputProfiles = inputprofiles +Videos = videos + + +[EmuCore/GS] +VsyncEnable = true +# Internal resolution aspect corrected +ScreenshotSize = 1 +# webp +ScreenshotFormat = 2 +OsdShowFPS = true +# Capture video at internal resolution +VideoCaptureAutoResolution = true +# 2x native resolution +upscale_multiplier = 2 +CaptureContainer = mkv +VideoCaptureCodec = av1_vaapi +AudioCaptureCodec = flac + + +[Filenames] +BIOS = ps2-0230a-20080220.bin + +[MemoryCards] +Slot1_Enable = true +Slot1_Filename = Mcd001.ps2 +Slot2_Enable = true +Slot2_Filename = Mcd002.ps2 + + +[InputSources] +Keyboard = false +Mouse = false +SDL = true +# Enhanced ps4 and ps5 controller support +SDLControllerEnhancedMode = true +SDLPS5PlayerLED = true + + +[Pad1] +Type = DualShock2 +InvertL = 0 +InvertR = 0 +Deadzone = 0 +AxisScale = 1.33 +LargeMotorScale = 1 +SmallMotorScale = 1 +ButtonDeadzone = 0 +PressureModifier = 0.5 +Up = SDL-0/DPadUp +Right = SDL-0/DPadRight +Down = SDL-0/DPadDown +Left = SDL-0/DPadLeft +Triangle = SDL-0/Y +Circle = SDL-0/B +Cross = SDL-0/A +Square = SDL-0/X +Select = SDL-0/Back +Start = SDL-0/Start +L1 = SDL-0/LeftShoulder +L2 = SDL-0/+LeftTrigger +R1 = SDL-0/RightShoulder +R2 = SDL-0/+RightTrigger +L3 = SDL-0/LeftStick +R3 = SDL-0/RightStick +LUp = SDL-0/-LeftY +LRight = SDL-0/+LeftX +LDown = SDL-0/+LeftY +LLeft = SDL-0/-LeftX +RUp = SDL-0/-RightY +RRight = SDL-0/+RightX +RDown = SDL-0/+RightY +RLeft = SDL-0/-RightX +Analog = SDL-0/Guide +LargeMotor = SDL-0/LargeMotor +SmallMotor = SDL-0/SmallMotor + + +[AutoUpdater] +CheckAtStartup = false + + +[GameList] +RecursivePaths = /home/deck/.persist/manual/games/ps2/roms