Closed colemickens closed 2 years ago
This issue has been mentioned on NixOS Discourse. There might be relevant details there:
OP updated with better links.
@colemickens I'm trying to follow your notes, but I'm unable to get hardware acceleration working. At this point, my nvidia.sway looks like this:
{ config, pkgs, lib, ... }:
let
useNvidiaWayland = true;
nvidiaPackage = config.boot.kernelPackages.nvidiaPackages.beta;
colemickens = builtins.fetchTarball {
name = "cmpkgs";
url = "https://github.com/colemickens/nixpkgs/archive/f2424637430b0cefece0481a3648c41871f0f663.tar.gz";
sha256 = "130r5252b9q420swrd50fc2ak5c5ayyaf7jpp0hdlzki8imag7s7";
};
cmPkgs = import colemickens { config.allowUnfree = true; };
overlayCMP = (self: super: {
nvidia-x11 = cmPkgs.nvidia-x11;
config.boot.kernalPackages.nvidiaPackages.beta = cmPkgs.config.boot.kernalPackages.nvidiaPackages.beta;
});
nvidia-sway = (pkgs.writeShellScriptBin "nvidia-sway" ''
env \
GBM_BACKEND=nvidia-drm \
GBM_BACKENDS_PATH=/etc/gbm \
__GLX_VENDOR_LIBRARY_NAME=nvidia \
WLR_NO_HARDWARE_CURSORS=1 \
sway --unsupported-gpu -d &>/tmp/sway.log
'');
nvidia-wlroots-overlay = (final: prev: {
wlroots = prev.wlroots.overrideAttrs(old: {
postPatch = ''
sed -i 's/assert(argb8888 &&/assert(true || argb8888 ||/g' 'render/wlr_renderer.c'
'';
});
});
in
{
imports = if useNvidiaWayland then [
./wayland-tweaks.nix
"${colemickens}/nixos/modules/hardware/video/nvidia.nix"
] else [];
disabledModules = [
"hardware/video/nvidia.nix"
];
config = {
environment.etc."gbm/nvidia-drm_gbm.so".source = "${nvidiaPackage}/lib/libnvidia-allocator.so";
hardware.opengl.driSupport = true;
hardware.opengl.driSupport32Bit = true;
nixpkgs.overlays = [ nvidia-wlroots-overlay overlayCMP ];
environment.systemPackages = with pkgs; [
mesa-demos
vulkan-tools
nvidia-sway
libglvnd
];
hardware.nvidia.modesetting.enable = true;
hardware.nvidia.package = nvidiaPackage;
hardware.nvidia.powerManagement.enable = false;
services.xserver = {
videoDrivers = [ "nvidia" ];
displayManager.gdm.wayland = useNvidiaWayland;
displayManager.gdm.nvidiaWayland = useNvidiaWayland;
};
};
}
Any pointers for what I'm missing?
I'm also importing nixpkgs-wayland with the following file:
{ config, lib, pkgs, ... }:
let
rev = "master";
url = "https://github.com/nix-community/nixpkgs-wayland/archive/${rev}.tar.gz";
waylandOverlay = (import "${builtins.fetchTarball url}/overlay.nix");
in
{
nixpkgs.overlays = [ waylandOverlay ];
}
And I have the following tweaks file:
{ pkgs, lib, inputs, ... }:
let
patchGoogleChrome = true;
in
{
config = {
nixpkgs.overlays = [
(final: prev: (
{
xwayland = prev.xwayland.overrideAttrs (old: rec {
version = "21.1.3";
src = prev.fetchFromGitLab {
domain = "gitlab.freedesktop.org";
owner = "xorg";
repo = "xserver";
rev = "21e3dc3b5a576d38b549716bda0a6b34612e1f1f";
sha256 = "sha256-i2jQY1I9JupbzqSn1VA5JDPi01nVA6m8FwVQ3ezIbnQ=";
};
});
} //
(lib.optionalAttrs patchGoogleChrome {
google-chrome = (let
c = prev.google-chrome;
in prev.runCommandNoCC "wrap-chrome"
{ buildInputs = with pkgs; [ makeWrapper ]; }
''
makeWrapper ${c}/bin/google-chrome-stable $out/bin/google-chrome \
--add-flags "--enable-features=UseOzonePlatform" \
--add-flags "--ozone-platform=wayland"
ln -sf ${c}/share $out/share
''
);
})
))
];
};
}
Not much of this should be needed these days. I have never figured out Wayland+Nvidia+XWayland+EGL but I'm not really interested in dealing with XWayland these days.
So I actually got Sway working properly:
I'm launching it with a wrapper: https://github.com/cole-mickens/nixcfg/blob/707b2db0a5f69ffda027f8008835f01d03954dcb/mixins/nvidia.nix#L7-L13
I'm patching wlroots: https://github.com/cole-mickens/nixcfg/blob/707b2db0a5f69ffda027f8008835f01d03954dcb/mixins/nvidia.nix#L14-L20
And now... Sway works well. Almost as well as the eglstreams version. There is some flickering, as another user noted here: https://forums.developer.nvidia.com/t/nvidia-495-on-sway-tutorial-questions-arch-based-distros/192212/3
I also have some extra commits related to nvidia: https://github.com/colemickens/nixpkgs/commits/cmpkgs work is ongoing to upstream these, either from myself or jonringer.