nix-community / nixpkgs-wayland

Automated, pre-built packages for Wayland (sway/wlroots) tools for NixOS. [maintainers=@colemickens, @Artturin]
510 stars 47 forks source link

(NOTES) WORKING: sway + nvidia-beta #312

Closed colemickens closed 2 years ago

colemickens commented 3 years ago

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.

nixos-discourse commented 3 years ago

This issue has been mentioned on NixOS Discourse. There might be relevant details there:

https://discourse.nixos.org/t/nvidia-users-testers-requested-sway-on-nvidia-steam-on-wayland/15264/11

colemickens commented 3 years ago

OP updated with better links.

dmayle commented 2 years ago

@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
          ''
      );
    })
      ))
    ];
  };
}
colemickens commented 2 years ago

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.