The scenario
You launch a Windows game through Steam or Lutris and the frame rate drops to single digits. The game stutters, textures pop in late, or the launcher crashes before the main menu appears. You already have a decent GPU. The bottleneck is not your hardware. It is the missing translation layer between Direct3D and your Linux graphics stack.
What is actually happening
Fedora ships with a strictly open-source graphics stack by default. That means Mesa drivers for AMD and Intel, and the open-source Nouveau driver for NVIDIA. The Vulkan API is the modern standard for low-level graphics access, but Fedora does not bundle the proprietary NVIDIA Vulkan libraries or the DXVK translation layer out of the box. DXVK intercepts Direct3D 9, 10, and 11 calls from Windows games and converts them to Vulkan calls on the fly. Without it, the game falls back to older software rendering or struggles through Wine's built-in translation, which is slow and incomplete.
Think of DXVK as a real-time interpreter that speaks the game's native language and translates it into something your GPU understands instantly. The Vulkan loader acts as the dispatcher, routing those translated calls to the correct driver for your specific hardware. When the loader, the driver, and the translation layer are all present and correctly configured, Windows games run at near-native performance.
Install the Vulkan stack and RPM Fusion
Fedora's base repositories do not include proprietary graphics libraries or certain multimedia codecs. The community maintains RPM Fusion to fill that gap. You need both the free and nonfree repositories. The free repository contains open-source packages that depend on non-free firmware. The nonfree repository contains proprietary drivers and codecs. Both are required for a complete gaming stack.
Here is how to enable RPM Fusion and install the core Vulkan packages in one transaction.
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
# The free repo provides open-source packages that may depend on proprietary firmware
# The nonfree repo provides closed-source drivers and codecs required for gaming
# dnf handles repository metadata automatically after installing the release packages
sudo dnf install vulkan-loader vulkan-tools mesa-vulkan-drivers
# vulkan-loader provides the ICD dispatch layer that routes calls to your GPU driver
# vulkan-tools includes vulkaninfo and vulkan-validate for verification and debugging
# mesa-vulkan-drivers installs the RADV and ANV drivers for AMD and Intel hardware
If you are running an NVIDIA GPU, you will also need the proprietary driver stack. The open-source Nouveau driver does not support modern Vulkan features well enough for gaming. Install the akmod-nvidia package and the nvidia-vulkan package from the nonfree repository. Reboot after the kernel module compiles. The system will load the correct Vulkan ICD automatically.
Convention aside: Fedora separates user configuration from package-managed files. The Vulkan ICD registry lives in /usr/share/vulkan/icd.d/. Do not edit files there. Package updates will overwrite them. If you need to override driver selection, create a symlink or configuration in /etc/vulkan/icd.d/ instead. The system checks /etc/ first.
Configure DXVK for your games
DXVK does not run as a system-wide daemon. It loads as a DLL inside your Wine or Proton prefix. Steam handles most of this automatically when you enable Proton. Lutris and Heroic Game Launcher require manual prefix configuration. You need to place the DXVK binaries in the correct directory and set environment variables so the game knows to load them.
Here is how to set up a DXVK environment variable for a test run.
export DXVK_HUD=1
# DXVK_HUD=1 draws a performance overlay showing FPS, GPU usage, and active translation layer
# This variable is temporary and only applies to the current terminal session
# Steam and Proton read environment variables from your shell or launch options
For Steam, open the game properties, navigate to the Launch Options field, and add DXVK_HUD=1 %command%. Steam's Proton runtime ships with a built-in DXVK version, but it often lags behind the latest releases. You can force a specific version by downloading the DXVK archive from the official GitHub releases page, extracting the x64 folder into your game's pfx/drive_c/windows/system32/ directory, and adding WINEDLLOVERRIDES="d3d9=d3d10=d3d11=n,b" to your launch options. The n,b suffix tells Wine to never load the native DLL and to always use the built-in replacement.
For Lutris or standalone Wine, you must install DXVK manually. Run winetricks dxvk inside the target prefix. Winetricks downloads the latest release, places the DLLs in the correct system32 directory, and registers them in the Wine registry. Verify the installation by running wine reg query "HKCU\Software\Wine\DllOverrides" and checking that d3d9, d3d10, and d3d11 point to n,b.
Convention aside: Wine prefixes are isolated environments. Installing DXVK in one prefix does not affect another. If a game breaks after enabling DXVK, create a fresh prefix and test again. Do not mix DXVK versions across prefixes. Keep one stable version per game to avoid registry conflicts.
Verify it worked
You need to confirm that the Vulkan loader is routing calls correctly and that DXVK is actually intercepting the Direct3D calls. Run the Vulkan diagnostic tool first. It queries the system for available ICDs, supported extensions, and GPU capabilities.
vulkaninfo | grep "deviceName"
# vulkaninfo queries the Vulkan loader for all available physical devices
# grep filters the output to show only the GPU model names
# This confirms the loader sees your hardware and the driver is loaded
Launch your game with DXVK_HUD=1. The overlay should appear in the top-left corner. Look for DXVK v1.x.x in the overlay text. If you see WineD3D or Software instead, the translation layer failed to load. Check the Proton or Wine log file for DLL load errors. The log lives in ~/.steam/steam/logs/ for Steam games, or in the Lutris runner log for third-party launchers.
Run vulkaninfo without grep if you need to check supported Vulkan versions. Fedora's Mesa drivers support Vulkan 1.3 on modern AMD and Intel hardware. NVIDIA proprietary drivers report their own version string. If vulkaninfo returns Vulkan Instance Version: 1.0.0 or crashes immediately, your ICD registry is broken or the driver package is missing. Reinstall vulkan-loader and mesa-vulkan-drivers or nvidia-vulkan.
Reboot before you debug. Half the time the symptom is gone.
Common pitfalls and error messages
The most common failure is a missing RPM Fusion repository. The dnf install command will refuse to proceed and print Error: Unable to find a match: vulkan-loader. The package exists in RPM Fusion, not in Fedora's base repos. Enable the repositories first.
Another frequent issue is Proton version mismatch. Valve's default Proton runtime updates automatically, but sometimes the bundled DXVK version conflicts with a game's anti-cheat or shader cache. You will see [Proton] DXVK failed to initialize in the log. Switch to Proton-GE or downgrade to a previous Proton version through Steam's compatibility settings. Proton-GE includes newer translation layers and community patches that Valve does not ship by default.
SELinux denials occasionally block Vulkan shader compilation. The system logs a Permission denied error when the game tries to write to the shader cache directory. Check journalctl -t setroubleshoot for a one-line summary. The fix is usually restorecon -Rv ~/.local/share/Steam/ or chcon -Rt container_file_t ~/.wine/. Do not disable SELinux. Adjust the context instead.
If you see [FAILED] Failed to start nvidia-persistenced.service during boot, your NVIDIA driver installation is incomplete. The Vulkan ICD requires the persistent daemon to manage GPU power states. Run sudo systemctl enable --now nvidia-persistenced and verify the service is active.
Trust the package manager. Manual file edits drift, snapshots stay.
When to use this setup
Use native Vulkan when the game already ships a Linux client or runs flawlessly through Proton without translation layers. Use DXVK when playing Direct3D 9, 10, or 11 titles through Wine or Proton and you need stable frame pacing. Use VKD3D-Proton when the game requires Direct3D 12 and DXVK cannot intercept the calls. Use Proton-GE when Valve's default runtime lacks the latest translation layers or community patches for a specific title. Stay on the default Steam Proton if the game runs perfectly and you want automatic updates without manual prefix management.