246 lines
10 KiB
Nix
246 lines
10 KiB
Nix
{ config, pkgs, ... }:
|
|
|
|
let
|
|
rev = "c4388cf"; # revision from https://github.com/keylase/nvidia-patch to use
|
|
hash = "sha256-ua6LpbV3ymR22hAT2AZenoMXDqr3DUJ1wtBi/Psypow="; # sha256sum for https://github.com/keylase/nvidia-patch at the specified revision
|
|
|
|
# create patch functions for the specified revision
|
|
nvidia-patch = pkgs.nvidia-patch rev hash;
|
|
|
|
# nvidia package to patch
|
|
nvidiaPackage = config.boot.kernelPackages.nvidiaPackages.latest;
|
|
|
|
user = "sunshine";
|
|
resolutionScript = pkgs.writeTextFile {
|
|
name = "sunshine-resolution-script";
|
|
text = ''
|
|
#!${pkgs.bash}/bin/bash
|
|
|
|
width=''${1:-1920}
|
|
height=''${2:-1080}
|
|
refresh_rate=''${3:-120}
|
|
|
|
# Get the modeline info from the 2nd row in the cvt output
|
|
modeline=$(${pkgs.xorg.libxcvt}/bin/cvt ''${width} ''${height} ''${refresh_rate} | ${pkgs.gawk}/bin/gawk 'FNR == 2')
|
|
xrandr_mode_str=''${modeline//Modeline \"*\" /}
|
|
mode_alias="''${width}x''${height}"
|
|
|
|
echo "xrandr setting new mode ''${mode_alias} ''${xrandr_mode_str}"
|
|
${pkgs.xorg.xrandr}/bin/xrandr --rmmode ''${mode_alias}
|
|
${pkgs.xorg.xrandr}/bin/xrandr --newmode ''${mode_alias} ''${xrandr_mode_str}
|
|
${pkgs.xorg.xrandr}/bin/xrandr --addmode DP-0 ''${mode_alias}
|
|
|
|
# Apply new xrandr mode
|
|
${pkgs.xorg.xrandr}/bin/xrandr --output DP-0 --primary --mode ''${mode_alias} --pos 0x0 --rotate normal
|
|
|
|
${config.boot.kernelPackages.nvidia-x11}/bin/nvidia-settings -a 'SyncToVBlank=0'
|
|
${config.boot.kernelPackages.nvidia-x11}/bin/nvidia-smi --persistence-mode=ENABLED
|
|
'';
|
|
executable = true;
|
|
destination = "/bin/resolution.sh";
|
|
};
|
|
configFile = pkgs.writeText "sunshine.conf"
|
|
''
|
|
capture=nvfbc
|
|
encoder=nvenc
|
|
wan_encryption_mode = 0
|
|
lan_encryption_mode = 0
|
|
origin_web_ui_allowed=lan
|
|
channels=2
|
|
min_threads=12
|
|
global_prep_cmd=[{"do":"${pkgs.bash}/bin/bash -c \"${resolutionScript}/bin/resolution.sh ''${SUNSHINE_CLIENT_WIDTH} ''${SUNSHINE_CLIENT_HEIGHT} ''${SUNSHINE_CLIENT_FPS}\""}]
|
|
'';
|
|
sunshinePkg = pkgs.unstablePkgs.sunshine.override { cudaSupport = true; };
|
|
in
|
|
{
|
|
boot.kernelModules = [ "uinput" ];
|
|
|
|
environment = {
|
|
systemPackages = with pkgs; [
|
|
sunshinePkg
|
|
xorg.xrandr
|
|
xorg.xorgserver
|
|
xorg.libxcvt
|
|
gamemode
|
|
];
|
|
|
|
variables = {
|
|
VDPAU_DRIVER = "nvidia";
|
|
LIBVA_DRIVER_NAME = "nvidia";
|
|
NVD_BACKEND = "direct";
|
|
};
|
|
};
|
|
|
|
hardware = {
|
|
pulseaudio.enable = true;
|
|
opengl = {
|
|
enable = true;
|
|
driSupport = true;
|
|
driSupport32Bit = true;
|
|
};
|
|
|
|
nvidia = {
|
|
modesetting.enable = true;
|
|
powerManagement.enable = false;
|
|
powerManagement.finegrained = false;
|
|
open = false;
|
|
nvidiaSettings = true;
|
|
package = nvidia-patch.patch-nvenc (nvidia-patch.patch-fbc nvidiaPackage);
|
|
};
|
|
};
|
|
|
|
programs.steam.enable = true;
|
|
|
|
security = {
|
|
polkit.extraConfig = ''
|
|
polkit.addRule(function(action, subject) {
|
|
if (action.id == "org.freedesktop.login1.suspend" ||
|
|
action.id == "org.freedesktop.login1.suspend-multiple-sessions" ||
|
|
action.id == "org.freedesktop.login1.hibernate" ||
|
|
action.id == "org.freedesktop.login1.hibernate-multiple-sessions")
|
|
{
|
|
return polkit.Result.NO;
|
|
}
|
|
});
|
|
'';
|
|
rtkit.enable = true;
|
|
};
|
|
|
|
services = {
|
|
avahi = {
|
|
enable = true;
|
|
publish.userServices = true;
|
|
};
|
|
|
|
udev.extraRules = ''
|
|
KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess"
|
|
'';
|
|
|
|
xserver = {
|
|
enable = true;
|
|
videoDrivers = [ "nvidia" ];
|
|
displayManager = {
|
|
sddm = {
|
|
enable = true;
|
|
wayland.enable = false;
|
|
autoLogin.relogin = true;
|
|
};
|
|
autoLogin = {
|
|
inherit user;
|
|
enable = true;
|
|
};
|
|
};
|
|
desktopManager.xfce.enable = true;
|
|
|
|
monitorSection = ''
|
|
HorizSync 5.0 - 1000.0
|
|
VertRefresh 5.0 - 1000.0
|
|
Option "DPMS"
|
|
|
|
# 1920x1080 @ 30.00 Hz (GTF) hsync: 32.97 kHz; pclk: 80.18 MHz
|
|
Modeline "1920x1080_30.00" 80.18 1920 1984 2176 2432 1080 1081 1084 1099 -HSync +Vsync
|
|
# 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
|
|
Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
|
|
# 1920x1080 @ 90.00 Hz (GTF) hsync: 102.33 kHz; pclk: 270.15 MHz
|
|
Modeline "1920x1080_90.00" 270.15 1920 2072 2280 2640 1080 1081 1084 1137 -HSync +Vsync
|
|
# 1920x1080 @ 120.00 Hz (GTF) hsync: 138.84 kHz; pclk: 368.76 MHz
|
|
Modeline "1920x1080_120.00" 368.76 1920 2072 2288 2656 1080 1081 1084 1157 -HSync +Vsync
|
|
# 2240x1290 @ 30.00 Hz (GTF) hsync: 39.39 kHz; pclk: 113.44 MHz
|
|
Modeline "2240x1290_30.00" 113.44 2240 2328 2560 2880 1290 1291 1294 1313 -HSync +Vsync
|
|
# 2240x1290 @ 60.00 Hz (GTF) hsync: 80.10 kHz; pclk: 243.50 MHz
|
|
Modeline "2240x1290_60.00" 243.50 2240 2400 2640 3040 1290 1291 1294 1335 -HSync +Vsync
|
|
# 2240x1290 @ 120.00 Hz (GTF) hsync: 165.84 kHz; pclk: 517.42 MHz
|
|
Modeline "2240x1290_120.00" 517.42 2240 2432 2680 3120 1290 1291 1294 1382 -HSync +Vsync
|
|
# 2800x1290 @ 30.00 Hz (GTF) hsync: 39.39 kHz; pclk: 141.80 MHz
|
|
Modeline "2800x1290_30.00" 141.80 2800 2912 3200 3600 1290 1291 1294 1313 -HSync +Vsync
|
|
# 2800x1290 @ 60.00 Hz (GTF) hsync: 80.10 kHz; pclk: 303.74 MHz
|
|
Modeline "2800x1290_60.00" 303.74 2800 2992 3296 3792 1290 1291 1294 1335 -HSync +Vsync
|
|
# 2800x1290 @ 120.00 Hz (GTF) hsync: 165.84 kHz; pclk: 647.44 MHz
|
|
Modeline "2800x1290_120.00" 647.44 2800 3040 3352 3904 1290 1291 1294 1382 -HSync +Vsync
|
|
# 2560x1440 @ 30.00 Hz (GTF) hsync: 43.95 kHz; pclk: 146.27 MHz
|
|
Modeline "2560x1440_30.00" 146.27 2560 2680 2944 3328 1440 1441 1444 1465 -HSync +Vsync
|
|
# 2560x1440 @ 60.00 Hz (GTF) hsync: 89.40 kHz; pclk: 311.83 MHz
|
|
Modeline "2560x1440_60.00" 311.83 2560 2744 3024 3488 1440 1441 1444 1490 -HSync +Vsync
|
|
# 2560x1440 @ 90.00 Hz (GTF) hsync: 136.44 kHz; pclk: 484.63 MHz
|
|
Modeline "2560x1440_90.00" 484.63 2560 2768 3056 3552 1440 1441 1444 1516 -HSync +Vsync
|
|
# 2560x1440 @ 120.00 Hz (GTF) hsync: 185.16 kHz; pclk: 660.65 MHz
|
|
Modeline "2560x1440_120.00" 660.65 2560 2776 3064 3568 1440 1441 1444 1543 -HSync +Vsync
|
|
# 3840x1600 @ 30.00 Hz (GTF) hsync: 48.84 kHz; pclk: 246.15 MHz
|
|
Modeline "3840x1600_30.00" 246.15 3840 4040 4440 5040 1600 1601 1604 1628 -HSync +Vsync
|
|
# 3840x1600 @ 60.00 Hz (GTF) hsync: 99.36 kHz; pclk: 523.03 MHz
|
|
Modeline "3840x1600_60.00" 523.03 3840 4128 4552 5264 1600 1601 1604 1656 -HSync +Vsync
|
|
# 3840x1600 @ 90.00 Hz (GTF) hsync: 151.56 kHz; pclk: 807.51 MHz
|
|
Modeline "3840x1600_90.00" 807.51 3840 4160 4584 5328 1600 1601 1604 1684 -HSync +Vsync
|
|
# 3840x1600 @ 120.00 Hz (GTF) hsync: 205.68 kHz; pclk: 1105.74 MHz
|
|
Modeline "3840x1600_120.00" 1105.74 3840 4176 4608 5376 1600 1601 1604 1714 -HSync +Vsync
|
|
# 3840x2160 @ 30.00 Hz (GTF) hsync: 65.91 kHz; pclk: 339.57 MHz
|
|
Modeline "3840x2160_30.00" 339.57 3840 4080 4496 5152 2160 2161 2164 2197 -HSync +Vsync
|
|
# 3840x2160 @ 60.00 Hz (GTF) hsync: 134.10 kHz; pclk: 712.34 MHz
|
|
Modeline "3840x2160_60.00" 712.34 3840 4152 4576 5312 2160 2161 2164 2235 -HSync +Vsync
|
|
# 3840x2160 @ 90.00 Hz (GTF) hsync: 204.66 kHz; pclk: 1100.25 MHz
|
|
Modeline "3840x2160_90.00" 1100.25 3840 4176 4608 5376 2160 2161 2164 2274 -HSync +Vsync
|
|
# 3840x2160 @ 120.00 Hz (GTF) hsync: 277.68 kHz; pclk: 1501.69 MHz
|
|
Modeline "3840x2160_120.00" 1501.69 3840 4192 4624 5408 2160 2161 2164 2314 -HSync +Vsync
|
|
'';
|
|
|
|
deviceSection = ''
|
|
VendorName "NVIDIA Corporation"
|
|
Option "CustomEDID" "DFP-1:/etc/X11/120edid.bin"
|
|
Option "ConnectedMonitor" "DFP-1"
|
|
'';
|
|
|
|
screenSection = ''
|
|
Monitor "Configured Monitor"
|
|
DefaultDepth 24
|
|
|
|
Option "ModeValidation" "NoVertRefreshCheck, NoHorizSyncCheck, NoMaxSizeCheck, NoMaxPClkCheck, AllowNonEdidModes, NoEdidMaxPClkCheck"
|
|
Option "UseEdidfreqs" "False"
|
|
Option "TripleBuffer" "False"
|
|
|
|
SubSection "Display"
|
|
Depth 24
|
|
EndSubSection
|
|
'';
|
|
};
|
|
};
|
|
|
|
sound.enable = true;
|
|
|
|
systemd = {
|
|
targets = {
|
|
sleep.enable = false;
|
|
suspend.enable = false;
|
|
hibernate.enable = false;
|
|
hybrid-sleep.enable = false;
|
|
};
|
|
|
|
user.services.${user} = {
|
|
description = "Sunshine server";
|
|
wantedBy = [ "graphical-session.target" ];
|
|
startLimitIntervalSec = 500;
|
|
startLimitBurst = 5;
|
|
partOf = [ "graphical-session.target" ];
|
|
wants = [ "graphical-session.target" ];
|
|
after = [ "graphical-session.target" ];
|
|
path = with pkgs; [ resolutionScript gamemode ];
|
|
serviceConfig = {
|
|
ExecStart = "${sunshinePkg}/bin/sunshine ${configFile}";
|
|
Restart = "on-failure";
|
|
RestartSec = "5s";
|
|
};
|
|
};
|
|
};
|
|
|
|
users = {
|
|
users.${user} = {
|
|
isNormalUser = true;
|
|
home = "/home/${user}";
|
|
description = "Sunshine Server";
|
|
extraGroups = [ "wheel" "networkmanager" "input" "video" "sound" ];
|
|
openssh.authorizedKeys.keys = [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC1we38/N+t8Ah5yrLof8QUwhrob7/VXFKIddaJeOVBLuDVnW7ljiAtdtEiL69D/DV4Ohmt5wMvkAAjfuHmim6FD9A6lzPbSU4KH9W2dcckszKbbI636kuDwem/xui6BW3wJa6P+0xW5ksygEAkzcK2PXuC2b4B9uwhuUdKahiGMKDxISG/WianqAe72cGMfNkYvion3Y1VsMLUdm48d2ABnxNpr7NI9B5iJ8dziOft9gpgfz13CCQRlReo75gk/4xI+vSNrQp7eR+wzJy2/dZg/T8jtyA9Q6jVxrxBpqQ1LNXkAKaJkGo9OabF6Wgpzp+YTAurL4nwR2NaJxwFuyoKvACQy0ai4jrS3206gC6JXZv8ktZMZrwUN+jPqCwfgh5qObFkAqKCxbp52ioDek2MQLdOvzQBX//DBhGEp5rzHGLZ3vhRIiiQiaof5sF5zWiYDW5mqezSPNxJPX/BrTP/Wbs/jpwTLBh3wytiia0S1WXQmya89bqzTPFiDWvTRA62EVKB/JaQtPQQOFAxWwg799DMycPeZ81xttZOyMtI/MZSddyqx2S8fWGwvToZQvuZ38mSIpFseLM1IkgabRIrAmat5SBNGGy9Dqa0eMEa7bwIY/4CMB1y6HMTnaoMXA6cnQfHMoB/zyTZ6oTXIeqeOyiZsK+RN0Mvahj8mXi7dw== giulio@giulio-X230" ];
|
|
};
|
|
|
|
groups.media.members = [ user ];
|
|
};
|
|
}
|