{ pkgs, lib, options, ... }: lib.mkMerge [
# assumes common-gpu-amd from nixos-hardware is also added
# TODO: should we move it from flake.nix to here?
# https://github.com/NixOS/nixos-hardware/blob/master/common/gpu/amd/default.nix

(lib.mkIf (lib.versionOlder (lib.versions.majorMinor lib.version) "24.11") {
  hardware.opengl.enable = true;
  hardware.opengl.driSupport = true;
  hardware.opengl.driSupport32Bit = true;
})
(lib.mkIf (lib.versionAtLeast (lib.versions.majorMinor lib.version) "24.11") {
  hardware.graphics.enable = true;
  hardware.graphics.enable32Bit = true;
})
{

  nixpkgs.config.openglSupport = true; # why is this not set by hardware.opengl.enable ?
  nixpkgs.config.rocmSupport = true;
  nixpkgs.config.vdpauSupport = true;
  nixpkgs.config.vaapiSupport = true;

  services.ollama.acceleration = lib.mkDefault "rocm";

  hardware.amdgpu.opencl.enable = lib.mkDefault true;
  #hardware.amdgpu.amdvlk.enable = lib.mkDefault true;
  #hardware.amdgpu.amdvlk.support32Bit.enable = lib.mkDefault true;

  # https://libreddit.noximilien.pbsds.net/r/archlinux/comments/nih9c9/amdgpu_vs_modesetting_in_current_510_kernels_xorg/
  services.xserver.videoDrivers = [ "amdgpu" ]; # use gpu, adaptive sync and and hardware page flipping
  #services.xserver.videoDrivers = [ "modesetting" ]; # integrated (non-accelerated) framebuffer, KMS  (default in nixos-hardware)

  # https://wiki.nixos.org/wiki/AMD_GPU#HIP
  systemd.tmpfiles.rules = let
    rocmEnv = pkgs.symlinkJoin {
      name = "rocm-combined";
      paths = with pkgs.rocmPackages; [
        rocblas
        hipblas
        clr
      ];
    };
  in [ "L+    /opt/rocm   -    -    -     -    ${rocmEnv}" ];

  nixpkgs.overlays = [
    (prev: final: {
      blender = prev.blender-hip;
    })
  ];

  # enable opencl on polaris, (rx580)
  environment.variables.ROC_ENABLE_PRE_VEGA = "1";

  environment.systemPackages = [
    (pkgs.nvtopPackages.amd or pkgs.nvtop-amd)
    pkgs.lact
  ];

  # lact - amdgpu GUI tool
  systemd.packages = [ pkgs.lact ];
  systemd.services.lactd.enable = true;
  systemd.services.lactd.wantedBy = [ "multi-user.target" ]; # add this if you want the unit to auto start at boot time
}
]
