From 635d7fd0f3f2f54b432a2df095d4b0caf1d29025 Mon Sep 17 00:00:00 2001
From: 514fpv <koishi@514fpv.one>
Date: Tue, 2 Jan 2024 16:20:52 +0800
Subject: [PATCH] feat(gui): add graphics driver options

---
 faucet/gui/default.nix | 55 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 55 insertions(+)
 create mode 100644 faucet/gui/default.nix

diff --git a/faucet/gui/default.nix b/faucet/gui/default.nix
new file mode 100644
index 00000000..20ec2c16
--- /dev/null
+++ b/faucet/gui/default.nix
@@ -0,0 +1,55 @@
+{ pkgs
+, lib
+, config
+, ... }: with lib; let
+  cfg = config.faucet.gui;
+in {
+  options.faucet.gui = {
+    enable = mkEnableOption "various setup required for GUI and support software";
+    type = mkOption {
+      type = with types; enum [ "intel" "amdgpu" "nvidia" "prime" ];
+      description = "type of graphics acceleration used";
+    };
+    prime = {
+      integrated = mkOption {
+        type = with types; str;
+        default = "i915";
+        description = "integrated gpu driver";
+      };
+    };
+  };
+
+  config = mkIf cfg.enable {
+    hardware.opengl = {
+      enable = true;
+      driSupport = true;
+      driSupport32Bit = true;
+    };
+
+    services.xserver.videoDrivers =
+    optional ((cfg.type == "nvidia") || (cfg.type == "prime")) "nvidia" ++
+    optional (cfg.type == "amdgpu") "amdgpu";
+    # has to be enabled even when using wayland
+    services.xserver.enable = true;
+
+    hardware.nvidia = mkIf ((cfg.type == "nvidia") || (cfg.type == "prime")) {
+      modesetting.enable = true;
+      nvidiaSettings = true;
+
+      prime = mkIf (cfg.type == "prime") {
+        offload = {
+          enable = true;
+          enableOffloadCmd = true;
+        };
+      };
+
+      powerManagement.enable = false;
+      powerManagement.finegrained = false;
+      open = false;
+    };
+
+    boot.initrd.kernelModules =
+    optional (cfg.type == "amdgpu") "amdgpu" ++
+    optional (cfg.type == "prime") cfg.prime.integrated;
+  };
+}