193 lines
6.2 KiB
Nix
193 lines
6.2 KiB
Nix
{ ... }: {
|
|
flake.nixosModules.systemChromiumHevcVaapi =
|
|
{ config, lib, pkgs, ... }:
|
|
let
|
|
cfg = config.chiasson.system.chromiumHevc;
|
|
in
|
|
{
|
|
options.chiasson.system.chromiumHevc.enable = lib.mkEnableOption ''
|
|
VA-API packages for Chromium HEVC (Intel iHD + optional NVIDIA nvidia-vaapi-driver).
|
|
Pair with `wisdomBrowsersChromiumHevc` on the user side.
|
|
'';
|
|
|
|
config = lib.mkIf cfg.enable {
|
|
hardware.graphics.enable = lib.mkDefault true;
|
|
hardware.graphics.extraPackages = lib.mkAfter (
|
|
with pkgs;
|
|
[ nvidia-vaapi-driver ]
|
|
);
|
|
};
|
|
};
|
|
|
|
flake.homeManagerModules.wisdomBrowsersChromiumHevc =
|
|
{ config, lib, pkgs, ... }:
|
|
let
|
|
root = config.chiasson.home;
|
|
cfg = config.chiasson.home.browsers.chromiumHevc;
|
|
|
|
browserCatalog = {
|
|
"google-chrome" = {
|
|
package = pkgs.google-chrome;
|
|
binary = "google-chrome-stable";
|
|
launcher = "google-chrome-hevc";
|
|
desktopName = "Google Chrome (HEVC)";
|
|
icon = "google-chrome";
|
|
};
|
|
chromium = {
|
|
package = pkgs.chromium;
|
|
binary = "chromium";
|
|
launcher = "chromium-hevc";
|
|
desktopName = "Chromium (HEVC)";
|
|
icon = "chromium";
|
|
};
|
|
"microsoft-edge" = {
|
|
package = pkgs.microsoft-edge;
|
|
binary = "microsoft-edge-stable";
|
|
launcher = "microsoft-edge-hevc";
|
|
desktopName = "Microsoft Edge (HEVC)";
|
|
icon = "microsoft-edge";
|
|
};
|
|
};
|
|
|
|
gpuProfiles = {
|
|
intel = {
|
|
driver = "iHD";
|
|
drmDevice = "/dev/dri/renderD128";
|
|
nvdBackend = "direct";
|
|
enableFeatures = [
|
|
"VaapiVideoDecodeLinuxGL"
|
|
"VaapiVideoDecoder"
|
|
"VaapiIgnoreDriverChecks"
|
|
"PlatformHEVCDecoderSupport"
|
|
"UseMultiPlaneFormatForHardwareVideo"
|
|
"AcceleratedVideoDecodeLinuxGL"
|
|
];
|
|
disableFeatures = [
|
|
"AcceleratedVideoDecodeLinuxZeroCopyGL"
|
|
];
|
|
};
|
|
nvidia = {
|
|
driver = "nvidia";
|
|
drmDevice = "/dev/dri/renderD129";
|
|
nvdBackend = "direct";
|
|
enableFeatures = [
|
|
"VaapiVideoDecoder"
|
|
"VaapiIgnoreDriverChecks"
|
|
"PlatformHEVCDecoderSupport"
|
|
"VaapiOnNvidiaGPUs"
|
|
"AcceleratedVideoDecodeLinuxGL"
|
|
];
|
|
disableFeatures = [
|
|
"AcceleratedVideoDecodeLinuxZeroCopyGL"
|
|
"UseMultiPlaneFormatForHardwareVideo"
|
|
"VaapiVideoDecodeLinuxGL"
|
|
];
|
|
};
|
|
};
|
|
|
|
activeGpu = gpuProfiles.${cfg.vaapi.gpu};
|
|
|
|
mkChromiumHevc =
|
|
packageName:
|
|
let
|
|
spec = browserCatalog.${packageName};
|
|
browser = spec.package;
|
|
launcherName = spec.launcher;
|
|
enableFeatures = lib.concatStringsSep "," activeGpu.enableFeatures;
|
|
disableFeatures = lib.concatStringsSep "," activeGpu.disableFeatures;
|
|
desktopItem = pkgs.makeDesktopItem {
|
|
name = launcherName;
|
|
desktopName = spec.desktopName;
|
|
genericName = "Web Browser";
|
|
exec = "${launcherName} %U";
|
|
icon = spec.icon;
|
|
categories = [
|
|
"Network"
|
|
"WebBrowser"
|
|
];
|
|
mimeTypes = [
|
|
"text/html"
|
|
"text/xml"
|
|
"application/xhtml+xml"
|
|
"x-scheme-handler/http"
|
|
"x-scheme-handler/https"
|
|
];
|
|
};
|
|
in
|
|
pkgs.runCommand launcherName
|
|
{
|
|
inherit (browser) version;
|
|
nativeBuildInputs = [ pkgs.makeWrapper ];
|
|
passthru = { inherit browser; };
|
|
}
|
|
''
|
|
mkdir -p $out/bin $out/share/applications
|
|
|
|
makeWrapper ${browser}/bin/${spec.binary} $out/bin/${launcherName} \
|
|
--set LIBVA_DRIVER_NAME ${lib.escapeShellArg activeGpu.driver} \
|
|
--set LIBVA_DRM_DEVICE ${lib.escapeShellArg activeGpu.drmDevice} \
|
|
--set NVD_BACKEND ${lib.escapeShellArg activeGpu.nvdBackend} \
|
|
--add-flags "--enable-features=${enableFeatures}" \
|
|
--add-flags "--disable-features=${disableFeatures}" \
|
|
${lib.concatMapStringsSep " " (a: "--add-flags ${lib.escapeShellArg a}") cfg.extraCommandLineArgs}
|
|
|
|
cp ${desktopItem}/share/applications/${launcherName}.desktop \
|
|
$out/share/applications/${launcherName}.desktop
|
|
'';
|
|
|
|
selectedPackages = lib.filter (
|
|
name:
|
|
let
|
|
spec = browserCatalog.${name};
|
|
in
|
|
lib.meta.availableOn pkgs.stdenv.hostPlatform spec.package
|
|
) cfg.packages;
|
|
|
|
wrappers = map mkChromiumHevc selectedPackages;
|
|
in
|
|
{
|
|
options.chiasson.home.browsers.chromiumHevc = {
|
|
enable = lib.mkEnableOption ''
|
|
`google-chrome-hevc`: Chromium with VA-API HEVC for Jellyfin / MSE playback.
|
|
|
|
Default GPU is **Intel** (`vaapi.gpu = "intel"`): Chromium + NVIDIA VA-API is
|
|
unsupported upstream (`nvidia-vaapi-driver` README) and fails with
|
|
`failed Initialize()ing the frame pool` in Jellyfin.
|
|
|
|
Requires `chiasson.system.chromiumHevc.enable` on NixOS.
|
|
'';
|
|
|
|
packages = lib.mkOption {
|
|
type = lib.types.listOf (
|
|
lib.types.enum (lib.attrNames browserCatalog)
|
|
);
|
|
default = [ "google-chrome" ];
|
|
description = "Chromium-based browsers to wrap.";
|
|
};
|
|
|
|
vaapi.gpu = lib.mkOption {
|
|
type = lib.types.enum [
|
|
"intel"
|
|
"nvidia"
|
|
];
|
|
default = "intel";
|
|
description = ''
|
|
VA-API stack for `google-chrome-hevc`. Use **intel** for Jellyfin (Chromium +
|
|
nvidia-vaapi-driver is unsupported and hits frame-pool init errors). **nvidia**
|
|
keeps renderD129 + VaapiOnNvidiaGPUs for experiments only.
|
|
'';
|
|
};
|
|
|
|
extraCommandLineArgs = lib.mkOption {
|
|
type = lib.types.listOf lib.types.str;
|
|
default = [ ];
|
|
description = "Extra Chromium flags appended after the HEVC profile flags.";
|
|
};
|
|
};
|
|
|
|
config = lib.mkIf (root.enable && cfg.enable) {
|
|
home.packages = wrappers;
|
|
};
|
|
};
|
|
}
|