2025-03-23 22:40:32 -04:00
{
config ,
lib ,
pkgs ,
. . .
} :
let
steam_rpcs3 = pkgs . writeScriptBin " s t e a m _ r p c s 3 " ''
export LD_LIBRARY_PATH = " $ L D _ L I B R A R Y _ P A T H : ${ pkgs . libglvnd } / l i b "
2025-03-29 16:46:52 -04:00
exec $ { pkgs . rpcs3 } /bin/rpcs3 " ' ' ${ @ } "
2025-03-23 22:40:32 -04:00
'' ;
2025-05-26 16:26:48 -04:00
rpcs3_config_yaml = settingsFormat . generate " c o n f i g . y m l " config . me . rpcs3 . config ;
settingsFormat = pkgs . formats . yaml { } ;
2025-03-23 22:40:32 -04:00
in
{
imports = [ ] ;
options . me = {
rpcs3 . enable = lib . mkOption {
type = lib . types . bool ;
default = false ;
example = true ;
description = " W h e t h e r w e w a n t t o i n s t a l l r p c s 3 . " ;
} ;
2025-05-26 16:26:48 -04:00
rpcs3 . config = lib . mkOption rec {
apply = lib . recursiveUpdate default ;
inherit ( settingsFormat ) type ;
default = {
Core = {
" U s e L L V M C P U " = " z n v e r 2 " ;
} ;
VFS = {
" E n a b l e / h o s t _ r o o t / " = false ;
} ;
Video = {
" W r i t e C o l o r B u f f e r s " = true ;
VSync = true ;
" P e r f o r m a n c e O v e r l a y " = {
Enabled = false ;
} ;
} ;
Miscellaneous = {
" P a u s e e m u l a t i o n o n R P C S 3 f o c u s l o s s " = true ;
" S t a r t g a m e s i n f u l l s c r e e n m o d e " = true ;
" P a u s e E m u l a t i o n D u r i n g H o m e M e n u " = false ; # true makes the home menu slow
} ;
} ;
example = null ;
description = " R P C S 3 ' s c o n f i g . y m l i n n i x f o r m . " ;
} ;
2025-03-23 22:40:32 -04:00
} ;
config = lib . mkIf config . me . rpcs3 . enable (
lib . mkMerge [
( lib . mkIf config . me . graphical {
home . packages = with pkgs ; [
rpcs3
steam_rpcs3
] ;
2025-05-26 16:26:48 -04:00
home . file . " . c o n f i g / r p c s 3 / c o n f i g . y m l " = lib . mkIf ( config . me . rpcs3 . config != null ) {
source = rpcs3_config_yaml ;
} ;
home . file . " . c o n f i g / r p c s 3 / G u i C o n f i g s / C u r r e n t S e t t i n g s . i n i " = {
source = ./files/CurrentSettings.ini ;
} ;
2025-03-23 22:40:32 -04:00
2025-05-26 16:26:48 -04:00
# TODO: Persist file .config/rpcs3/GuiConfigs/persistent_settings.dat # play times and recently played
2025-03-30 17:26:05 -04:00
me . persist . directories = [
2025-05-26 16:26:48 -04:00
" . c o n f i g / r p c s 3 / g a m e s " # Location of ROMs.
2025-03-30 17:26:05 -04:00
" . c o n f i g / r p c s 3 / d e v _ h d d 0 "
" . c o n f i g / r p c s 3 / d e v _ h d d 1 "
" . c o n f i g / r p c s 3 / s a v e s t a t e s "
" . c o n f i g / r p c s 3 / d e v _ u s b 0 0 0 "
" . c o n f i g / r p c s 3 / d e v _ f l a s h " # Seems to be where the firmware is installed.
2025-05-26 16:26:48 -04:00
" . c o n f i g / r p c s 3 / i n p u t _ c o n f i g s " # Controller config.
" . c o n f i g / r p c s 3 / I c o n s " # Game icons.
2025-03-30 17:26:05 -04:00
] ;
me . state . directories = [ " . c a c h e / r p c s 3 " ] ;
2025-03-23 22:40:32 -04:00
nixpkgs . overlays = [
2025-03-24 19:54:09 -04:00
(
final : prev :
let
optimizeWithFlags =
pkg : flags :
pkg . overrideAttrs ( old : {
NIX_CFLAGS_COMPILE = [ ( old . NIX_CFLAGS_COMPILE or " " ) ] ++ flags ;
} ) ;
original_package =
if config . me . optimizations . enable then
( optimizeWithFlags prev . rpcs3 [
" - m a r c h = z n v e r 2 "
" - m t u n e = z n v e r 2 "
] )
else
prev . rpcs3 ;
in
{
rpcs3 = pkgs . buildEnv {
name = prev . rpcs3 . name ;
paths = [
( config . lib . nixGL . wrap original_package )
] ;
extraOutputsToInstall = [
" m a n "
" d o c "
" i n f o "
] ;
# 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/rpcs3.desktop
'' ;
} ;
}
)
2025-03-23 22:40:32 -04:00
] ;
} )
]
) ;
}