A standalone mod of DevilutionX that adds Vulkan GPU rendering and libretro shader support to Diablo & Hellfire on modern operating systems.
(The health-bar and XP-bar are off by default but can be enabled in the game settings. Widescreen can also be disabled if preferred.)
Important
This is a standalone mod, not the official DevilutionX.
The GPU shader work in this repository originally targeted upstream (PR #8737). As of October 11, 2026, development continues here as an independent mod, branched from upstream 1.6.0-dev.
A plan-first upstream merge track now exists in parallel: a phased, audit-gated 8-PR plan (docs/merge-plan-r2.md) was shared with the upstream maintainers on October 16, 2026 and is awaiting their reply. Nothing has been submitted or accepted as a PR — and whether or not one ever is, the long-term goal is the same: finish the codebase audit, then harden the shader pipeline into a standalone library any SDL3 project could reuse (see docs/diablo-handoff.md, §14).
- Report bugs and request features in this repository — please do not send mod-specific reports to upstream.
- The official project lives at https://github.com/diasurgical/DevilutionX.
DevilutionX is a port of Diablo and Hellfire that strives to make it simple to run the game while providing engine improvements, bug fixes, and some optional quality of life features.
Check out the manual for available features and how to take advantage of them.
For a full list of base-game changes, see the upstream changelog.
This mod keeps the stock SDL render path fully intact and layers a GPU shader pipeline on top of it:
- Vulkan GPU render path — the game still renders internally at its native 640x480/960x540 8-bit paletted surface, but when a shader filter is active, the frame is uploaded to a GPU texture each frame and pushed through an SDL3 GPU (
SDL_GPU) pipeline backed by Vulkan on Windows and Linux (Metal on macOS). If no compatible GPU device can be created — driver update, remote desktop, VM without GPU — the shader simply reports as(Unavailable)and the game keeps running on the stock render path. - libretro shader preset support — load
.slangp/.slangpresets from ashaders/folder next to the executable. Multi-pass chains are translated in-process with glslang to SPIR-V at runtime, with a content-addressed disk cache and sidecar.spvfast path for near-instant reloads. There are no baked-in shaders: the filters you get are exactly the presets you install (see Setting Up Shaders). - The full RetroArch shader ecosystem — CRT simulation, xBR, ScaleFX, HQx, and hundreds more, straight from libretro's
slang-shaderscollection. Unlike the stock renderer's plain stretch, these GPU filters reconstruct pixel-art detail: sharper edges, smoother diagonals, and cleaner corner transitions. Some presets (e.g. the HQx family) load PNG lookup textures at runtime. - Live shader feedback — the on-screen overlay always shows the active filter and backend (e.g.
Shader: ScaleFX 3x (Vulkan)orShader: Off). If a shader fails to compile or load, the overlay reports it as(Unavailable)— and you can select a new shader right from that state without restarting. Every change is also logged togpu-scaler.log, and the choice persists indiablo.iniunder theShader Filterkey. - Audio fix available — a standalone fix for decoding Diablo's 1996-era WAV files (zero-length RIFF chunks fail on current SDL3_mixer) is maintained on the
wav-mixer-fixbranch. - Documented and audited — feature docs in docs/GPU_SHADERS.md, architecture notes in docs/diablo-handoff.md, per-preset compatibility audits plus the current field-sweep test list under docs/audit/, and the audit-gated upstream-merge / library roadmap in docs/merge-plan-r2.md.
See it in action: shader demo video.
- A GPU with Vulkan support (or Metal on macOS) and a driver new enough for that API. Vulkan is the only actively-supported backend on Windows and Linux.
- A build with SDL3 (
USE_SDL3=ON).USE_GPU_SCALERis a dependent option that defaults to ON wheneverUSE_SDL3is ON andUSE_SDL1is OFF. - The in-game Upscale option enabled (it is on by default).
git-lfsinstalled when cloning the shader pack (some presets load PNG lookup textures at runtime — see Setting Up Shaders).
Note: You'll need access to the data from the original game. If you don't have an original CD, you can buy Diablo from GoG.com or Battle.net. Alternatively, you can use spawn.mpq from the shareware [2] version, in place of DIABDAT.MPQ, to play the shareware portion of the game.
Download the latest release and extract the contents to a location of your choosing, or build from source. Releases are built by CI for Windows x64 and Linux x64; other platforms require building from source.
- Copy
DIABDAT.MPQfrom the CD or Diablo installation (or extract it from the GoG installer) to the DevilutionX folder. - To run the Diablo: Hellfire expansion, you will also need to copy
hellfire.mpq,hfmonk.mpq,hfmusic.mpq, andhfvoice.mpq. - Optional: install the libretro shader pack — see Setting Up Shaders (on Windows, run the included
install_shaders.cmd; on Linux,install_shaders.sh).
For more detailed instructions: Installation Instructions.
Shader presets are loaded at runtime from a shaders/ folder next to the executable — nothing is baked into the binary. The easiest way to populate it is to clone libretro's shader collection directly into your Diablo folder:
git clone https://github.com/libretro/slang-shaders shaders
cd shaders
git lfs pullThe git lfs pull step matters: some presets (like HQ2x) reference PNG lookup textures, and without pulling the LFS assets those PNGs are left as pointer stubs, so the presets that need them will fail to load or render incorrectly. Make sure git-lfs is installed and initialized (git lfs install) before cloning.
The release zips ship helper scripts beside the executable that automate the above:
install_shaders.cmd(Windows) /install_shaders.sh(Linux) — wipes and re-downloadsshaders/beside the executable (fresh clone plusgit lfs pull; needsgitandgit-lfs— the Linux script prints the per-distro install command if either is missing).clear_shader_cache.cmd(Windows) /clear_shader_cache.sh(Linux) — deletesshaders/cache/, the translated-shader compile cache. It is rebuilt automatically on the next preset load; run it after a corpus update or a game update if presets misbehave.install_git.cmd(Windows) — one-time helper for machines withoutgit: installs Git for Windows (bundling Git LFS) via winget soinstall_shaders.cmdcan run.
Presets are selected from the in-game folder browser, so you can keep the whole collection or just the handful of .slangp files you actually use.
- Install the shader pack as described in Setting Up Shaders.
- Start the game and open Main Menu → Options → Graphics Options.
- Scroll to Shader Filter and pick a preset from the folder browser (
Offuses the stock renderer). - Confirm — the renderer is recreated and the filter applies immediately from the menu. The option is disabled during an ongoing game because it forces a renderer recreation.
- Shaders are loaded immediately upon selecting them — no restart required. If a shader fails to compile or load, the overlay reports it as
(Unavailable); you can select a new shader straight from that state and it will load.
The GPU backend can be forced explicitly with the DEVILUTIONX_GPU_BACKEND=vulkan environment variable.
Want to compile the program by yourself? Great! Follow the general build instructions, and see docs/GPU_SHADERS.md for the full mod-specific build matrix (including the MinGW-w64 Windows cross-build). Quick start on Linux:
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DUSE_SDL3=ON \
-DDEVILUTIONX_SYSTEM_SDL3=OFF -DDEVILUTIONX_SYSTEM_LIBSODIUM=OFF \
-DBUILD_TESTING=OFF
cmake --build build -j$(nproc)Build notes:
USE_GPU_SCALERdefaults to ON whenUSE_SDL3=ONandUSE_SDL1=OFF.- Shader presets are compiled at runtime by the bundled glslang (
3rdParty/glslang) — no external shader toolchain is needed at build time. - The SDL_GPU device, swapchain, and pipelines are created lazily and torn down on shutdown and renderer reinitialization, so switching a shader filter to
Off(or losing the GPU) restores the exact stock render path. - CI (gpu-shaders.yml) builds Windows x64 and Linux x64 on every push, manual dispatch, and release.
This is an independent, standalone mod, so all contributions happen here: issues, pull requests, testing the latest builds, and documentation are all welcome. The plan-first upstream merge track (docs/merge-plan-r2.md) is pending a maintainer reply; until anything changes, this repository remains the single place where development happens. For engine behavior that this mod does not touch, the upstream wiki and contributing guide remain the best references.
- The original Devilution project: Devilution
- Everyone who worked on Devilution/DevilutionX
- Nikolay Popov for UI and graphics
- WiAParker for the Polish voice pack
- Shader authors whose work this mod builds on: ScaleFX by Sp00kyFox (MIT), the HQx family by Maxim Steppin, Adam Zemek and Blok (LGPL-2.1), and the wider libretro slang shaders ecosystem
- glslang by The Khronos Group for runtime shader translation
- Mod integration and maintenance by VTSTech (vts-tech.org)
DevilutionX is made publicly available and released under the Sustainable Use License (see LICENSE). This mod is a derivative work of DevilutionX and is distributed under the same terms.
The source code in this repository is for non-commercial use only. If you use the source code, you may not charge others for access to it or any derivative work thereof.
Diablo® - Copyright © 1996 Blizzard Entertainment, Inc. All rights reserved. Diablo and Blizzard Entertainment are trademarks or registered trademarks of Blizzard Entertainment, Inc. in the U.S. and/or other countries.
DevilutionX and any of its maintainers are in no way associated with or endorsed by Blizzard Entertainment®.



