Cannot launch steamapps - CTD after loading shaders

I am in the process of setting up NixOS on my desktop to be my daily driver, however suddenly no steam games are able to launch they were working until recently (reverting to an older build didn’t help), they load vulcan shaders then attempt to launch before crashing with no errors.

Currently this machine dual boot with windows until I iron out most of the kinks. NixOS is configured with flakes and home-manager(standalone) but steam is set to install system wide in the main config for multiple user access. I had been testing with games installed on the windows drive. they would load but had crackly sound, now they just don’t load. No issues with the installs they still function in windows.

I should note that modrinth also crashes when launched but I do get an empty window briefly first.

configuration.nix

# Edit this configuration file to define what should be installed on
# your system.  Help is available in the configuration.nix(5) man page
# and in the NixOS manual (accessible by running ‘nixos-help’).

{ config, pkgs, ... }:

{
  imports = [
      ./hardware-configuration.nix
      ./Hardware/Graphics/nvidia.nix
      ./Software/Games/Steam.nix
      ./Software/Games/protonup.nix
      ./Software/system-apps.nix
    ];

  # Bootloader.
  boot.loader.systemd-boot.enable = true;
  boot.loader.efi.canTouchEfiVariables = true;
  boot.supportedFilesystems = [ "ntfs" ];

  # NTFS support
  fileSystems."/run/media/jan/Boot" = {
    device = "/dev/sda4";
    fsType = "ntfs-3g";
    options = [ "rw" "uuid=jan" ];
  };

  # Enable flakes and nix-command
  nix.settings.experimental-features = [ "nix-command" "flakes" ];

  networking.hostName = "Glad0s"; # Define your hostname.
  # networking.wireless.enable = true;  # Enables wireless support via wpa_supplicant.

  # Configure network proxy if necessary
  # networking.proxy.default = "http://user:password@proxy:port/";
  # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain";

  # Enable networking
  networking.networkmanager.enable = true;

  # Set your time zone.
  time.timeZone = "America/New_York";

  # Select internationalisation properties.
  i18n.defaultLocale = "en_US.UTF-8";

  i18n.extraLocaleSettings = {
    LC_ADDRESS = "en_US.UTF-8";
    LC_IDENTIFICATION = "en_US.UTF-8";
    LC_MEASUREMENT = "en_US.UTF-8";
    LC_MONETARY = "en_US.UTF-8";
    LC_NAME = "en_US.UTF-8";
    LC_NUMERIC = "en_US.UTF-8";
    LC_PAPER = "en_US.UTF-8";
    LC_TELEPHONE = "en_US.UTF-8";
    LC_TIME = "en_US.UTF-8";
  };

  # Enable the X11 windowing system.
  # You can disable this if you're only using the Wayland session.
  services.xserver.enable = true;

  # Enable the KDE Plasma Desktop Environment.
  services.displayManager.sddm.enable = true;
  services.desktopManager.plasma6.enable = true;

  # Configure keymap in X11
  services.xserver.xkb = {
    layout = "us";
    variant = "";
  };

  # Enable CUPS to print documents.
  services.printing.enable = true;

  # Enable Bluetooth
  hardware.bluetooth.enable = true;

  # Enable sound with pipewire.
  hardware.pulseaudio.enable = false;
  security.rtkit.enable = true;
  services.pipewire = {
    enable = true;
    alsa.enable = true;
    alsa.support32Bit = true;
    pulse.enable = true;
    # If you want to use JACK applications, uncomment this
    # jack.enable = true;

    # use the example session manager (no others are packaged yet so this is enabled by default,
    # no need to redefine it in your config for now)
    #media-session.enable = true;
  };

  # Enable touchpad support (enabled default in most desktopManager).
  # services.xserver.libinput.enable = true;

  # Define a user account. Don't forget to set a password with ‘passwd’.
  users.users.jan = {
    isNormalUser = true;
    description = "Jan";
    extraGroups = [ "networkmanager" "wheel" ];
  };

  # Allow unfree packages
  nixpkgs.config.allowUnfree = true;

  # List packages installed in system profile. To search, run:
  # $ nix search wget


  # Some programs need SUID wrappers, can be configured further or are
  # started in user sessions.
  # programs.mtr.enable = true;
  # programs.gnupg.agent = {
  #   enable = true;
  #   enableSSHSupport = true;
  # };

  # List services that you want to enable:

  # Enable the OpenSSH daemon.
  # services.openssh.enable = true;

  # Open ports in the firewall.
  # networking.firewall.allowedTCPPorts = [ ... ];
  # networking.firewall.allowedUDPPorts = [ ... ];
  # Or disable the firewall altogether.
  # networking.firewall.enable = false;

  # This value determines the NixOS release from which the default
  # settings for stateful data, like file locations and database versions
  # on your system were taken. It‘s perfectly fine and recommended to leave
  # this value at the release version of the first install of this system.
  # Before changing this value read the documentation for this option
  # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html).
  system.stateVersion = "24.11"; # Did you read the comment?

}

flake.nix

{
  description = "The Cake is a flake";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
    home-manager.url = "github:nix-community/home-manager/master";
    home-manager.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs = { self, nixpkgs, home-manager,  ...}:
    let
      lib = nixpkgs.lib;
      system = "x86_64-linux";
      pkgs = nixpkgs.legacyPackages.${system};
    in {
    nixosConfigurations = {
      Glad0s = lib.nixosSystem {
        inherit system;
        modules = [ ./configuration.nix ];
      };
    };
    homeConfigurations = {
      jan = home-manager.lib.homeManagerConfiguration {
        inherit pkgs;
        modules = [ ./home.nix ];
      };
    };
  };
}

home.nix

{ config, pkgs, ... }:

{

  imports = [
    ./Software/Games/modrinth-app_HM.nix
  ];

  # set username and home directory
  home.username = "jan";
  home.homeDirectory = "/home/jan";

  nixpkgs = {
    config = {
      allowUnfree = true;
      allowUnfreePredicate = (_: true);
    };
  };

  # Applications
  home.packages = with pkgs; [
    discord            #Official Discord App
    obsidian           #Obsidian Notes
    syncthing          #Syncthing folder synchronization app
    signal-desktop     #Signal Encrypted messaging client
    ungoogled-chromium #for webusb access
    rpi-imager         #Raspberry pi imager
    godot_4            #Godot 4 SDK
    kdePackages.kate   #Kate IDE

  ];

  # Firefox latest
  programs.firefox = {
    enable = true;
  };

  # Git login info
  programs.git = {
    enable = true;
    userName ="BackgroundLogic";
    userEmail = "backgroundlogic@gmail.com";
  };

  # you do not need to change this if you're reading this in the future.
  # dont ever change this after the first build.
  home.stateVersion = "25.05"; # Please read the comment before changing.

  # Let Home Manager install and manage itself.
  programs.home-manager = {
    enable = true;
    # useGlobalPkgs = true;
    # useUserPackages = true;
  };
}

Steam.nix

{ pkgs, ... }:

{
    programs.steam = {
        enable = true;
        gamescopeSession.enable = true;
        remotePlay.openFirewall = true;
        dedicatedServer.openFirewall = true;
        localNetworkGameTransfers.openFirewall = true;
    };

    programs.gamemode.enable = true;
}

Nvidia.nix

{ config, lib, pkgs, ... }:
{

  # Enable OpenGL
  hardware.graphics = {
    enable = true;
  };

  # Load nvidia driver for Xorg and Wayland
  services.xserver.videoDrivers = ["nvidia"];

  hardware.nvidia = {

    # Modesetting is required.
    modesetting.enable = true;

    # Nvidia power management. Experimental, and can cause sleep/suspend to fail.
    # Enable this if you have graphical corruption issues or application crashes after waking
    # up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead
    # of just the bare essentials.
    powerManagement.enable = false;

    # Fine-grained power management. Turns off GPU when not in use.
    # Experimental and only works on modern Nvidia GPUs (Turing or newer).
    powerManagement.finegrained = false;

    # Use the NVidia open source kernel module (not to be confused with the
    # independent third-party "nouveau" open source driver).
    # Support is limited to the Turing and later architectures. Full list of
    # supported GPUs is at:
    # https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus
    # Only available from driver 515.43.04+
    open = false;

    # Enable the Nvidia settings menu,
	# accessible via `nvidia-settings`.
    nvidiaSettings = true;

    # Optionally, you may need to select the appropriate driver version for your specific GPU.
    package = config.boot.kernelPackages.nvidiaPackages.stable;
  };
}

Firstly, your config doesn’t look inherently wrong.

I AM however going to continue to be a broken record and begin by saying that NVIDIA themselves recommend you use the open kernel modules unless you have a very special case. Also you’re likely going to get graphics corruption on wake from sleep unless you enable the non-finegrained powermanagement (finegrained powermanagement in turn has nothing to do with its parent module, and should indeed be off for systems without an iGPU, though that’s the default setting).

All in all, as of NixOS 25.05 you can simplify your nvidia config for this system (assuming a GPU < 6 years old, you didn’t tell us which you have in fairness) to just:

services.xserver.videoDrivers = ["nvidia"];
hardware.graphics.enable = true;

# Optionally, if you have issues with sleep, i.e., on most modern
# GPUs since they have and use too much memory for non-userspace
# memory management, particularly if you put your system to sleep
# while running some graphics intensive application
hardware.nvidia.powerManagement.enable = true;

All your other nvidia options are either the default already (and should therefore not be set so that upstream can change the defaults for you if and when that becomes necessary for some reason) or should most likely be changed to the defaults.

If you’re aware and actually have some super special case, sorry, I’m just trying to fight the cargo cult.


This is unlikely to fix your issues, though, given that things were working before. Sounds like all graphical applications are crashing, so driver issues aren’t too far fetched, but it’s notable that this happened just after the 25.05 release and that it persists between generation switches, so this might be a cache somewhere too.

What does glxgears do, and does glxinfo give any useful output (both packages are in mesa-demos)? Does anything get logged into in sudo journalctl -f when you start an application?


While I’m doing a full config review, another code smell is that you probably want to use the home-manager module instead of managing home-manager standalone when using NixOS. There is arguably some user preference here, but doing things this way around is just asking for trouble if you’re not 100% certain of how it works.

You might also want to tighten up those steam firewall settings, doesn’t look like you’re running a team fortress server or anything.

Most of my config is from tutorials with some modifications to suit sharing dotfiles between my laptop and desktop configs.

My video card is a 1080ti so it is about 8 years old at this point, but I will take your suggestion to drop the false declarations.

I am intentionally using standalone because of future plans and from what I can tell standalone would make those easier overall or at least more organized.

I’ll take a loot at glsgears/glxinfo but for now sudo journalctl -f gives when running risk of rain 2:

May 30 09:13:45 Glad0s steam[2556]: pressure-vessel-wrap[7970]: W: Found more than one possible libdrm data directory from provider
May 30 09:13:45 Glad0s steam[2556]: pressure-vessel-wrap[7970]: W: "run/opengl-driver-32/share/drirc.d" is unlikely to appear in "/run/host"
May 30 09:13:45 Glad0s steam[2556]: pressure-vessel-wrap[7970]: W: "run/opengl-driver/share/drirc.d" is unlikely to appear in "/run/host"
May 30 09:13:47 Glad0s steam[2556]: Traceback (most recent call last):
May 30 09:13:47 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 1869, in <module>
May 30 09:13:47 Glad0s steam[2556]:     g_session.init_session(sys.argv[1] != "runinprefix")
May 30 09:13:47 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 1776, in init_session
May 30 09:13:47 Glad0s steam[2556]:     g_compatdata.setup_prefix()
May 30 09:13:47 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 1104, in setup_prefix
May 30 09:13:47 Glad0s steam[2556]:     try_copy(g_proton.default_pfx_dir + "drive_c/windows/system32/" + f + ".dll", "drive_c/windows/system32",
May 30 09:13:47 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 167, in try_copy
May 30 09:13:47 Glad0s steam[2556]:     copyfile(src, dst)
May 30 09:13:47 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 229, in copyfile_reflink
May 30 09:13:47 Glad0s steam[2556]:     with open(srcname, 'rb', buffering=0) as src:
May 30 09:13:47 Glad0s steam[2556]: FileNotFoundError: [Errno 2] No such file or directory: '/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/files/share/default_pfx/drive_c/windows/system32/d3d8.dll'
May 30 09:13:48 Glad0s steam[2556]: chdir "/home/jan/.local/share/Steam/steamapps/common/Risk of Rain 2"
May 30 09:13:48 Glad0s steam[2556]: ERROR: ld.so: object '/home/jan/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
May 30 09:13:48 Glad0s steam[2556]: Game Recording - would start recording game 632360, but recording for this game is disabled
May 30 09:13:48 Glad0s steam[2556]: Adding process 8160 for gameID 632360
May 30 09:13:48 Glad0s steam[2556]: ERROR: ld.so: object '/home/jan/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
May 30 09:13:48 Glad0s steam[2556]: ERROR: ld.so: object '/home/jan/.local/share/Steam/ubuntu12_64/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS64): ignored.
May 30 09:13:48 Glad0s steam[2556]: ERROR: ld.so: object '/home/jan/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
May 30 09:13:48 Glad0s steam[2556]: ERROR: ld.so: object '/home/jan/.local/share/Steam/ubuntu12_32/gameoverlayrenderer.so' from LD_PRELOAD cannot be preloaded (wrong ELF class: ELFCLASS32): ignored.
May 30 09:13:48 Glad0s steam[2556]: Adding process 8161 for gameID 632360
May 30 09:13:48 Glad0s steam[2556]: Adding process 8163 for gameID 632360
May 30 09:13:56 Glad0s steam[2556]: pressure-vessel-wrap[8161]: W: Found more than one possible libdrm data directory from provider
May 30 09:13:56 Glad0s steam[2556]: pressure-vessel-wrap[8161]: W: "run/opengl-driver-32/share/drirc.d" is unlikely to appear in "/run/host"
May 30 09:13:56 Glad0s steam[2556]: pressure-vessel-wrap[8161]: W: "run/opengl-driver/share/drirc.d" is unlikely to appear in "/run/host"
May 30 09:13:57 Glad0s steam[2556]: Adding process 8341 for gameID 632360
May 30 09:13:57 Glad0s steam[2556]: Traceback (most recent call last):
May 30 09:13:57 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 1869, in <module>
May 30 09:13:57 Glad0s steam[2556]:     g_session.init_session(sys.argv[1] != "runinprefix")
May 30 09:13:57 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 1776, in init_session
May 30 09:13:57 Glad0s steam[2556]:     g_compatdata.setup_prefix()
May 30 09:13:57 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 1104, in setup_prefix
May 30 09:13:57 Glad0s steam[2556]:     try_copy(g_proton.default_pfx_dir + "drive_c/windows/system32/" + f + ".dll", "drive_c/windows/system32",
May 30 09:13:57 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 167, in try_copy
May 30 09:13:57 Glad0s steam[2556]:     copyfile(src, dst)
May 30 09:13:57 Glad0s steam[2556]:   File "/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/proton", line 229, in copyfile_reflink
May 30 09:13:57 Glad0s steam[2556]:     with open(srcname, 'rb', buffering=0) as src:
May 30 09:13:57 Glad0s steam[2556]: FileNotFoundError: [Errno 2] No such file or directory: '/run/media/jan/Boot/Program Files (x86)/Steam/steamapps/common/Proton Hotfix/files/share/default_pfx/drive_c/windows/system32/d3d8.dll'
May 30 09:13:58 Glad0s steam[2556]: Game Recording - game stopped [gameid=632360]
May 30 09:13:58 Glad0s steam[2556]: Removing process 8341 for gameID 632360
May 30 09:13:58 Glad0s steam[2556]: Removing process 8163 for gameID 632360
May 30 09:13:58 Glad0s steam[2556]: Removing process 8161 for gameID 632360
May 30 09:13:58 Glad0s steam[2556]: Removing process 8160 for gameID 632360

FWIW, you don’t have to do one or the other. You can just write a separate entrypoint for standalone setups, and use the NixOS module on NixOS, but share the actual module configuration across both; it’ll save you a bunch of pain on NixOS without giving up any of the flexibility.

Heres the output for glxgears and glx info. Gears ran great no issues there. (cut all the extensions for character length)

glxgears
Running synchronized to the vertical refresh.  The framerate should be
approximately the same as the monitor refresh rate.
713 frames in 5.0 seconds = 142.428 FPS
719 frames in 5.0 seconds = 143.678 FPS
glxinfo
name of display: :0
display: :0  screen: 0
direct rendering: Yes
server glx vendor string: SGI
server glx version string: 1.4
server glx extensions:
    
client glx vendor string: NVIDIA Corporation
client glx version string: 1.4
client glx extensions:
    
GLX version: 1.4
GLX extensions:
    

OpenGL version string: 4.6.0 NVIDIA 570.144
OpenGL shading language version string: 4.60 NVIDIA
OpenGL context flags: (none)
OpenGL profile mask: (none)
OpenGL extensions:
    

OpenGL ES profile version string: OpenGL ES 3.2 NVIDIA 570.144
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.20
OpenGL ES profile extensions:
    

Ok, sounds unlikely to be NixOS related then, graphics libs are fine. It’s your steam env that’s broken. Given the message about a missing graphics dll maybe try a different proton?

I’m seeing a couple of issues. The game Portal, run through steam, is crashing:

[13886.877209] MatQueue0[36400]: segfault at 0 ip 00000000f7dc4679 sp 00000000d2d87268 error 6 in libc.so.6[191679,f7c56000+191000] likely on CPU 4 (core 4, socket 0)
[13886.877218] Code: 81 c3 21 73 04 00 03 1c 8b ff e3 8d b6 00 00 00 00 e8 54 51 ff ff 81 c3 cb 74 04 00 03 1c 8b ff e3 66 0f 12 00 66 0f 12 48 08 <66> 0f 13 02 66 0f 13 4a 08 57 89 d7 83 e2 f0 83 c2 10 29 d7 01 f9

The proton version works OK.

If I try to view a video with mpv, I get this:

[vo/gpu/libplacebo] shaderc: internal error: compilation succeeded but failed to optimize: Invalid SPIR-V binary version 1.6 for target environment SPIR-V 1.0 (under Vulkan 1.0 semantics).
[vo/gpu/libplacebo] 
[vo/gpu/libplacebo] 
[vo/gpu/libplacebo] shaderc compile status 'error' (0 errors, 0 warnings)
[vo/gpu/libplacebo] vk_compile_glsl(gpu, tmp, GLSL_SHADER_VERTEX, params->vertex_shader, &vert): VK_ERROR_INITIALIZATION_FAILED (../src/vulkan/gpu_pass.c:460)

Portal is non-functional on both an AMD and Nvidia machine. I have only tested mpv on the amdgpu machine so far.

So far as I know, these things worked in the past, but I haven’t tried recently and don’t have a record of when it stopped. This is against nixos-unstable as of 2025-05-31.

Looks like mismatched driver versions. Your issue is likely different, I’d open a new thread. I would suspect either mixed nixpkgs versions or you’re missing a flatpak update, or maybe cached imperatively installed libraries or such.

The MPV issue appears to be libplacebo: fails to compile shader on vulkan · Issue #412382 · NixOS/nixpkgs · GitHub fixed in libplacebo: revert `mpv`-breaking change by trofi · Pull Request #412889 · NixOS/nixpkgs · GitHub

For portal I’m running with the workaround of running via proton, but it would be nice to understand why it’s not working as expected. I’m not knowingly using mismatched nixpkgs versions nor flatpak.

Well, a segfault in libc could be practically anything. Practically impossible to debug without debug symbols and knowledge of the code. It may well be a bug in a new version of libc or something. Ask steam support, try reinstalling, etc.