EmuNews

Eglantine

Djihads80/Eglantine

15 tracked updates · latest 7 h ago

GitHub

Eglantine Build 05/11/2026

daily-20261105 nightly / pre-release
Release notes · 12 files

Automatic daily build of nx2 at e736dfd.

Changes since the previous daily build

  • Revert "buffer_cache: size native storage buffers from the mapping only in DL…" (4bc1ede493)
  • kernel: Fix OOT startup by implementing WaitIfEqual64 (b6706b0c29)
  • pls coderabit, pls (2814b15174)
  • buffer_cache: size native storage buffers from the mapping only in DLSS passes (3c131fb692)
  • pls final fix (578d88b67c)
  • final fixes (97db036789)
  • fixes (5016e217b8)
  • Update .github/workflows/release.yml (91b74512ee)
  • docs: removed unnecessary docs (21cfc42c97)
  • feat: implemented coderabbit suggestions (d31066ee04)
  • added some todos (97d3d9dec9)
  • ci: whole new ci, needs a lot of review, this is draft (689d08400b)
  • buffer_cache: keep native storage bindings in one device range (979d652d90)
  • yuzu, video_core: always use the game's own DLSS where it can run (3c45b94cae)
  • buffer_cache: size native compute storage buffers from the mapping (2e12e0def5)
  • shader_recompiler: don't require PT in UISETP bits 68-71 (adacbaae7b)
  • game_list: surface the NUP display version in the tooltip (35cde43095)
  • refactor: remove unused variable is_intel_anv from Device constructor (d6efc8ef08)
  • test: enhance StubEnvironment with additional methods for shader testing (4b1a1823ea)
  • nup_container: treat a contentless ExeFS as absent (9279b24e4c)
  • ci: remove fork-only local build workflow (d2f6956a1a)
  • shader: correct H0_NH1 mixed-sign half source (662545c5b0)
  • shader: fix H0_NH1 mixed-sign native half source (77952c8d8c)
  • core: detect NUP platform from the update ExeFS (24c9b2b0ba)
  • kepler_compute: emulate tensor programs only for Donkey Kong Bananza (fef7d2fc6c)
  • kepler_compute: emulate all of Donkey Kong Bananza's tensor programs (721b189bb7)
  • kepler_compute: emulate tensor programs that no upscale stands in for (3944c47805)
  • nx2: count the presents that return before their frame is done (204ae115e4)
  • nx2: wait for each of Donkey Kong Bananza's frames (6a22450d82)
  • set: correct the Polish language code (551fa99a99)

Linux

The AppImage is self-contained (needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch): make it executable with chmod +x and run it. The tar.gz uses your system libraries, so Qt 6 and the usual libraries must be installed.

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) MinGW PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip · dmg macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run . is inside the app, in .

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine v0.1.0-rc1

v0.1.0-rc1 nightly / pre-release
Release notes · 12 files

Release candidate of 0.1.0. Please test it and report problems before the final release.

  • Initial release candidate

Linux

The AppImage is self-contained (needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch): make it executable with chmod +x and run it. The tar.gz uses your system libraries, so Qt 6 and the usual libraries must be installed.

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) MinGW PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip · dmg macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run . is inside the app, in .

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2 build 212 (d6efc8e)

build-212 nightly / pre-release
Release notes · 12 files

What's changed

Two compatibility fixes (Switch 2 titles packed as NUP, and Intel/Mesa graphics), one shader fix, and test/CI cleanup.

  • Switch 2 titles packed as NUP are classified correctly again (#512, fixes #504) — platform detection now prefers the newest update's ExeFS, like AppLoader_NUP, and only falls back to the base when the update has no ExeFS. Previously, a NUP whose base ExeFS is empty was detected through that empty directory, so a Switch 2 title came up with the Switch 1 memory layout and guest clock: a guest-memory exception and a boot stuck at 0 FPS. Mario Kart World 1.8.0 (update 917504) now selects the automatic 12 GiB layout and the 31.25 MHz clock and reaches the title screen at roughly 30 FPS, from the same empty-base NUP.
  • The NUP packer no longer writes empty exefs/romfs directories — a contentless ExeFS is treated as absent both when packing and when reading a container (GetExeFSDir returns nothing for it), and exefs/romfs are only recorded when they actually contain files. RomFS-only updates keep working through the base fallback.
  • Intel banding fixed on Mesa ANV (#469) — conditional barriers were being stripped on ANV, and on Intel the shader recompiler deletes barriers inside loops and branches, so a compute shader sharing data between warps read stale shared memory. In Mario Kart World 1.8.0 this showed up as a banding pattern over the whole image on an ARC 390. Barriers are now only stripped for Intel's proprietary Windows driver, so the Windows reports in #130 and #66 take the same path.
  • Shader: H0_NH1 mixed-sign half source — it now swaps the packed FP16 halves before negating the new low half, instead of negating only the upper component. Programs using it previously failed with "native half mixed-sign source mode" and were skipped.
  • Tests — global_address_tracking gained a stub shader environment, so the test target builds again after its outdated GlobalMemoryToStorageBuffer-era call.
  • CI — the fork-only local build workflow was removed.

Known limitation of the NUP fix: a full race and long-session stability were not tested; the platform-classification checks and a boot to the Mario Kart World title screen were.

Changes since build-206 (c54bc22…d6efc8e), full compare.

All commits in this build
  • d6efc8ef08 refactor: remove unused variable is_intel_anv from Device constructor
  • 4b1a1823ea test: enhance StubEnvironment with additional methods for shader testing
  • 9279b24e4c nup_container: treat a contentless ExeFS as absent
  • d9558f05a2 Merge pull request #469 from ah-/fix/anv-conditional-barriers
  • d2f6956a1a ci: remove fork-only local build workflow
  • 662545c5b0 shader: correct H0_NH1 mixed-sign half source
  • 77952c8d8c shader: fix H0_NH1 mixed-sign native half source
  • 39c42e645b Merge pull request #512 from Mcm190/fix/nup-update-platform
  • 24c9b2b0ba core: detect NUP platform from the update ExeFS
  • 9de583e1b9 vulkan: stop stripping conditinal barriers on Mesa ANV

Automatic build of nx2 at d6efc8ef0849bf7423fe0a96dace49a8a2dcc877.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2 build 206 (c54bc22)

build-206 nightly / pre-release
Release notes · 12 files

What's changed

Build 206 is a one-fix release: Polish was handed to games as a language code they don't recognise, so every title that supports Polish fell back to Japanese.

  • Polish now selects Polish instead of Japanese (#505, fixes #451) — the LanguageCode constant for Polish encoded its two characters in the wrong order (lp instead of pl). Titles look the value up against known language codes, found no match, and used their fallback — Japanese. The constant is now the NUL-terminated pl string in the same byte order as th, en-US and zh-Hans.
  • Confirmed fixed — Mario Kart World (update 1.8) and Donkey Kong Bananza (update 3.1) with Europe region and Polish selected in system configuration; both now display Polish. Any other title that asks for the Polish language code is fixed by the same change.
  • Nothing else changed — no graphics, audio, input or compatibility work since build 205. If you don't play games in Polish, there is no reason to update from build 205.

The change

-    PL = 0x000000000000706C,
+    PL = 0x0000000000006C70,

LanguageCode is a little-endian u64 holding NUL-terminated ASCII. 0x6C70 reads out as p, l, \0; the old value read l, p, \0 and matched no known language.

Changes since build-205 (5cad158…c54bc22), full compare.

All commits in this build
  • c54bc2289b Merge pull request #505 from Mcm190/fix/polish-language
  • 551fa99a99 set: correct the Polish language code

Automatic build of nx2 at c54bc2289bfffda7fa3cc4c3a8cf522d84a10fd4.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

The Ooga Booga Update - Build 205 (5cad158)

build-205 nightly / pre-release
Release notes · 12 files

What's changed

Donkey Kong Bananza's purple screen, freezes and rubberbanding are fixed.

  • Freezes, crashes and rubberbanding (#506, #392) — a present waits for that frame's GPU fence so the game can't overwrite data the GPU thread hasn't read yet. Since 690f80e15f that wait was skipped as soon as a GPU channel was suspended on a semaphore, and Donkey Kong Bananza's channels suspend on each other every frame, so the game always ran a frame ahead and read back stale commands. Donkey Kong Bananza now waits for each of its frames; EDEN_NX2_FRAMES_AHEAD still overrides it and other games are unchanged (Mario Kart World keeps running a frame ahead).
  • Purple screen (#506, #459) — the game runs tensor-core shaders that are not part of DLSS, and Eglantine only emulated that math for a game's DLSS, so the image they feed was never written. Those programs are now always emulated for Donkey Kong Bananza, and only for it: upscaling networks (Kirby Air Riders, Fortune's Weave's DLSS) keep the quick bilinear stand-in.
  • Present stats — the stats line now counts how many of the last 600 presents returned before their frame was done.
  • Cost — waiting for each frame costs speed where the GPU thread is busy: in the mines a frame goes from ~19 ms to ~30 ms because game and GPU thread take turns instead of overlapping. Elsewhere it holds 60 fps.

Changes since build-204 (01dda0f…5cad158), full compare.

All commits in this build
  • 5cad158835 Merge pull request #506 from Duck912/dkb-frame-wait
  • fef7d2fc6c kepler_compute: emulate tensor programs only for Donkey Kong Bananza
  • 721b189bb7 kepler_compute: emulate all of Donkey Kong Bananza's tensor programs
  • 3944c47805 kepler_compute: emulate tensor programs that no upscale stands in for
  • 204ae115e4 nx2: count the presents that return before their frame is done
  • 6a22450d82 nx2: wait for each of Donkey Kong Bananza's frames

Automatic build of nx2 at 5cad1588350a6edef11f6302dcf747dc7dffa8df.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2 build 204 (01dda0f)

build-204 nightly / pre-release
Release notes · 12 files

What's changed

Mario Tennis Fever's controller glyphs render as icons instead of question marks.

  • ? controller glyphs fixed in Mario Tennis Fever (#481) — the game looks up the + and − icons (U+E0EF, U+E0F0) in the standard shared font, and the Open Sans stand-in has no button glyphs, so it drew ?. The 24 button glyphs from yuzu's stand-in extension font are now merged into the standard font, scaled to cap height.
  • The built-in font is now Open Sans (Apache 2.0) combined with yuzu's glyphs (GPL-2.0-or-later).
  • Needs the build 196 font fixes to be visible.

Changes since build-203 (179b5af…01dda0f), full compare.

All commits in this build
  • 01dda0f47d Merge pull request #481 from aidankinzett/nx2-mtf-button-glyphs
  • be2f49ed43 Fix ? controller glyphs

Automatic build of nx2 at 01dda0f47d86d791959f892b9b1dfac9721aaac8.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2 build 203 (179b5af)

build-203 nightly / pre-release
Release notes · 12 files

What's changed

One revert: the chunked-texture-upload change from build 202 device-lost Mario Kart World on AMD, so it is gone.

  • Mario Kart World on AMD no longer loses the device at the title screen (#496, #499) — texture_cache no longer finishes the scheduler in the middle of a chunked image upload. A bisect put that commit on the title-screen device loss, and a tester boots with it reverted. The cost is that staging memory is not reused between chunks of one upload.
  • Everything else from build 202 is unchanged.

Changes since build-202 (8615d8d…179b5af), full compare.

All commits in this build
  • 179b5afb50 Revert "texture_cache: finish between chunked uploads so staging memory is reused"

Automatic build of nx2 at 179b5afb50819945bdaadd739748d5f87633b0a5.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2 build 202 (8615d8d)

build-202 nightly / pre-release
Release notes · 12 files

What's changed

The Hyrule Warriors: Age of Imprisonment fix set, batched Vulkan submissions, a large batch of shader-recompiler lowerings, and the six-axis / Mii BuildRandom fixes ported from nx2-experimental.

  • Hyrule Warriors: Age of Imprisonment plays through its fights (#494) — command lists keep their submit-time copy across semaphore waits (dma_pusher), each pending fence download tracks its own ranges, GPU-written bytes on a page are downloaded before a CPU write claims it, draws with a garbage vertex or index count are skipped instead of losing the device, and an unmapped texture buffer gets a placeholder instead of aborting.
  • Faster fights on the split GPU thread (#494) — fences, command-list copies after compute dispatches and FlushCommands are batched within 500 µs (EDEN_NX2_FENCE_FLUSH_US), and a thread that needs a batched submission asks the GPU back thread for it. Queue submissions in Hyrule fights drop from ~22,000/s to ~1,100/s, and heavy stretches go from a 31–37 fps median to 46–49.
  • Shader recompiler (#494) — new lowerings for guarded USHF/UIADD3, LEA.HI with a constant, G+B TLD, 8/16-bit LDL/STL, STS with a uniform base, UMOV into any uniform register, UISETP with an accumulate predicate, FSETP with a uniform operand, I2F from signed 8/16-bit sources, IMNMX with an immediate wider than 20 bits and SHF.L.U32.HI without .W; plus more Switch 2 conversion/load forms and all generic attribute components.
  • AMD / RADV crash fix — pipeline creation no longer assumes VK_EXT_mesh_shader exists, which fixes crashes on RADV.
  • Donkey Kong Bananza — the terrain fixes and HMMA emulation are enabled by default again, and more of the game's indirect and native geometry forms are translated.
  • Mii — BuildRandom reads age, gender and race as 32-bit words and picks from the random table in the right order (#495).
  • HID — the six-axis IC information reports non-zero sensor ranges, so motion controllers are described correctly (#495).
  • Frontend stability — the game list stays disabled during the startup scan, and directory iteration no longer uses the throwing overloads, removing a class of scan crashes.

Changes since build-196 (0d86405…8615d8d), full compare.

All commits in this build
  • 8615d8d53e Merge pull request #494 from rdenno/pr/nx2-merged
  • 17ef7b09ea video_core: Rename shadowing geometry local in shader environment
  • 55274de6af vk_scheduler: keep waiting for a deferred submission instead of giving up
  • fc1c8fedff Merge pull request #495 from Djihads80/port/rdenno-296-297
  • e6a899a9c7 mii: Fix random table index order in BuildRandom
  • 512536d916 Address CodeRabbit review on the Hyrule Warriors fixes
  • 55cb3155ef Merge branch 'nx2' of github.com:Djihads80/Eglantine into nx2
  • c1c2a0a220 mii: read BuildRandom's age, gender and race as 32-bit words
  • e7fe1ddba5 hid: report non-zero sensor ranges in the six-axis IC information
  • 04727488a8 Merge nx2 into pr/nx2-merged
  • c5164776a3 Merge pull request #363 from Djihads80/exp/dkb-ground-fps-20261102
  • a2a398b5b5 tests: give the Mario Tennis Fever I2F case its own name
  • b01dba53e3 Merge nx2 into the Donkey Kong Bananza terrain fixes
  • b00481fcc6 renderer_vulkan: handle absence of VK_EXT_mesh_shader in pipeline creation (should fix crashes on RADV AMD GPUs)
  • cdb9172c27 Keep this PR to the Hyrule Warriors fixes
  • dd8b26a608 release-binaries: keep upstream's workflow on the PR branch
  • 1ab5f48bee Merge remote-tracking branch 'origin/nx2' into nx2-merged
  • c50fed12c1 Merge branch 'fix/nx2-command-snapshots' into nx2-merged
  • 9fea7d8379 dma_pusher: keep command list snapshots across semaphore waits
  • 5f0f96f6ed Merge branch 'fix/vk-batch-fence-flushes' into nx2-merged
  • 313463cd27 vk_scheduler: also batch command list copies and FlushCommands
  • 86aa9bde70 Merge branch 'fix/vk-batch-fence-flushes' into nx2-merged
  • 660e5f0039 vk_scheduler: batch fence submissions on the split GPU thread
  • 044bb10c45 nx2: enable the DK Bananza terrain fixes by default
  • 13e8298d82 nx2: emulate HMMA by default
  • 13767709db release-binaries: drop the macOS row from the notes; skip the Discord ping without a webhook
  • 75221d6932 Merge branch 'fix/buffer-stale-async-download' into test/hyrule-buffer-fixes2
  • 15126fbdc1 buffer_cache: track the ranges of each pending fence download separately
  • b7ef921c61 Merge branch 'fix/buffer-partial-page-cpu-write' into test/hyrule-buffer-fixes
  • 13f12cb90f Merge branch 'fix/split-first-gpu-written-args' into test/hyrule-buffer-fixes
  • 516858197a Merge branch 'fix/vk-skip-garbage-draw-counts' into test/hyrule-buffer-fixes
  • fc517e328e Merge branch 'fix/shader-shf-left-clamp' into test/hyrule-buffer-fixes
  • 982cab9b19 Merge branch 'fix/shader-uniform-sts-umov' into test/hyrule-buffer-fixes
  • a10e013d3c Merge branch 'fix/hw-scene-forms' into test/hyrule-buffer-fixes
  • d129f419b7 Merge remote-tracking branch 'origin/nx2' into test/hyrule-buffer-fixes
  • b13c4c1c0c buffer_cache: download GPU-written bytes on a page before a CPU write claims it
  • 9e330271ef video_core: wait for queued GPU writers before reading small entries on unmarked pages
  • b3c25ae85c Merge latest nx2 and refine Donkey Kong fixes
  • 55ad1b3279 diagnostics: measure indirect reset cost
  • 7abf1f9546 experiment: emulate indirect record reset shader
  • bcf8471dc5 shader: recognize all generic attribute components
  • c31a22ebe6 experiment: translate native geometry shader forms
  • 60bc4fa0c3 shader: support additional Switch 2 conversion and load forms
  • 461015ea5f shader: distinguish loaded pointers and NVN buffer slots
  • e2b4ab1b6f shader: lower UMOV URd, URs into any uniform register
  • 66d05284d9 shader: lower STS with a uniform base and UMOV into any uniform register
  • e4422115d6 shader: lower more forms Hyrule Warriors uses entering new areas
  • 92a1a0f703 vk_rasterizer: skip draws with a garbage vertex or index count
  • f06a81e329 release-binaries: drop the macOS build
  • 2de5ad950b release-binaries: publish what built when a platform fails
  • 85ec271c1a shader: lower SHF.L.U32.HI with an immediate high word without .W
  • 93006bcb6b Merge branch 'fix/shader-imnmx-wide-immediate' into nx2-merged
  • 225c1e290d Merge branch 'fix/texel-buffer-unmapped' into nx2-merged
  • 5300e75c0a Merge branch 'fix/hw-compute-lowering' into nx2-merged
  • 6a7a7c04f9 Merge remote-tracking branch 'origin/nx2' into nx2-merged
  • 915a30b77e shader: lower IMNMX with an immediate wider than 20 bits
  • 9598eadeb4 shader: lower guarded UIADD3 and 8/16-bit local loads and stores
  • 85ade4ba0e vk_buffer_cache: don't abort on an unmapped texture buffer
  • 855559a68e shader: lower guarded USHF, LEA.HI with a constant and G+B TLD
  • cd082124dc Merge remote-tracking branch 'fork/save-uid-align' into nx2-merged
  • 4ef0c736e2 Merge remote-tracking branch 'fork/pokopia-shaders' into nx2-merged
  • 58a98d6ddd Merge remote-tracking branch 'fork/fix/gamelist-scan-crashes' into nx2-merged
  • 9468a0beac Merge branch 'fix/hw-shader-lowering' into nx2
  • 491453e28b Merge remote-tracking branch 'fork/fix/mii-build-random-args' into nx2-merged
  • 52c6cbd5e9 Merge remote-tracking branch 'fork/fix/hid-sixaxis-ic-info' into nx2-merged
  • f4addaf6ef Merge remote-tracking branch 'fork/fix/texture-x8z24-components' into nx2-merged
  • 5daec6b8be Merge remote-tracking branch 'fork/fix/shader-i2f-signed' into nx2-merged
  • eb9e13abd3 Merge remote-tracking branch 'fork/fix/vk-framebuffer-layers' into nx2-merged
  • 4f86156a9b Merge remote-tracking branch 'fork/fix/nx2-hle-ipc-hold' into nx2-merged
  • 1d577141a7 Merge pull request #1 from Djihads80/nx2-experimental
  • cd9daa8d00 shader: lower I2F from signed 8- and 16-bit sources
  • 3d98eed7e6 mii: read BuildRandom's age, gender and race as 32-bit words
  • 7c36bf54bf hid: report non-zero sensor ranges in the six-axis IC information
  • 13eb28fd7a game_list: keep the list disabled during the startup scan
  • bf916f5411 fs: iterate directories without the throwing overloads
  • 9b130d4812 shader_recompiler: lower UISETP with an accumulate predicate and FSETP with a uniform operand

Automatic build of nx2 at 8615d8d53e8c584476254761c4883353e0731ba6.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2 build 196 (0d86405)

build-196 nightly / pre-release
Release notes · 12 files

What's changed

Switch 2 built-in font data is handed to titles correctly (which is what unblocks Mario Tennis Fever's missing text), thread startup no longer stalls on a single core, and Vulkan can honour the CPU inner-invalidation skip.

  • Mario Tennis Fever: missing text fixed (#393) — Switch 2 built-in font lookups now return each font's real offset inside the shared font memory, and a font that failed to load is reported as missing instead of as a bogus region. This is also the prerequisite for the +/− glyph fix in build 204.
  • Thread startup — svcStartThread takes the single-core path when multicore is disabled, and treats a thread already current on the target core as preempting itself. Starting a thread no longer yields for up to 5 ms waiting for a context switch that cannot happen.
  • Vulkan — RasterizerVulkan::InnerInvalidation now honours the skip_cpu_inner_invalidation setting instead of walking every sequence on each invalidation (#237).

Changes since build-194 (09e539a…0d86405), full compare.

All commits in this build
  • 0d86405bd1 Merge pull request #237 from ymatrix1/shader-cache-batch-invalidation
  • 36251b2191 Merge pull request #393 from aidankinzett/nx2-mtf-text
  • 0b8b33e068 merge nx2
  • 62f4afef42 fix merge conflicts
  • c10b82657b Coderabbit fixes
  • 795ea34b1e vulkan: honor skip_cpu_inner_invalidation in InnerInvalidation

Automatic build of nx2 at 0d86405bd1836f01d708abcdecc564465864a8cd.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2 build 194 (09e539a)

build-194 nightly / pre-release
Release notes · 12 files

What's new in this build

Build 194 of nx2 (09e539a) is a batch merge — 145 files, +6,843/−695, 40 merges — and four games move:

  • Fire Emblem: Fortune's Weave now runs its own DLSS network as translated shaders instead of the FSR 3.1 stand-in, with a health check that falls back the moment the output stops making sense.
  • Mario Tennis Fever gets its text back, stops hanging at boot, stops having its geometry shaders refused, and stops losing the device three seconds into its first court.
  • Fast Fusion gets its track floor, minimap and sky back, and stops hanging at 0 fps while a race loads.
  • Pokopia's sky renders on the Steam Deck.

Around them: two Mario Kart World frame-pacing options, a shipped nx2_switches.txt of tuned Switch 2 defaults, and a wide performance and correctness batch.

Builds 190–193 have no release: 190 and 191 failed, 192 and 193 were cancelled when a newer push arrived, and only this final run published.

In short

  • The game's own DLSS (Fire Emblem: Fortune's Weave): new Graphics setting Use the game's own DLSS, on by default. Its 13-pass network runs on your GPU; NVIDIA DLSS (if you turn it on) is tried first, then the game's own network, then AMD FSR 3.1. A status line under the checkbox says what is drawing right now and why.
  • Mario Tennis Fever: missing text and wrong font fixed, boot hang fixed, geometry shaders no longer refused, and a framebuffer created with the wrong layer count — which wrote ~2 MiB past its allocation and lost the device — fixed. The kernel also gives the client's core the run it needs before an HLE reply wakes it, which this game's boot depends on.
  • Fast Fusion: more Ampere instruction forms lowered (the floor's I2F.S16, TLD.SCR.LZ with a uniform handle, SHFL.DOWN, WARPSYNC, SUST.P.R and more), the sky's depth size query built after its descriptor is known, and G8R24 mapped to D24_UNORM_S8_UINT. The GPU-split hang while loading a race is fixed too: the front no longer reads command pages the back has not marked GPU-written yet.
  • Pokopia: the black sky on the Steam Deck is fixed (guarded ULEA, with #387's author credited), and more compute forms (LEA, SHF, UIADD3, DEPBAR, USHF) lower, so almost all of its shaders stop being rejected. Photographs in game are still black — separate issue.
  • Mario Kart World: 30 FPS mode and Mario Kart World: dynamic FPS (experimental) — two new checkboxes under Graphics → Advanced, off by default, applied only to that game, taking effect after restarting it. Dynamic FPS takes precedence, and EDEN_NX2_SWAP_INTERVAL still wins over both.
  • nx2_switches.txt ships with the build and is read when the GUI starts: EDEN_NX2_SPLIT=2 and EDEN_NX2_FENCE_BATCH=1 on, buffer downloads off (they cost 38–63% FPS), frame-ahead left commented out (it adds 1–2 frames of input latency), plus documented workarounds. Your own copy in the config dir wins over the shipped one.
  • Performance batch: descriptor reallocations eliminated, buffer-cache guards made cheap on the hot path, zero-copy chunked texture uploads, image downloads batched into one GPU wait, flat array lookups for image views and samplers, DMA fast-path batching, and 128-byte-aligned GPU split atomics.
  • Correctness: the page-table block id can no longer overflow and fake page contiguity (after 65,535 allocations), H.264 packet framing is detected per stream, audio in/out managers are no longer destroyed under their sessions, and newer AArch64 SIMD forms (SQDMULL, SQDMLAL, SQDMLSL, SQRSHRN, SQRSHL, …) are implemented.
  • Expect one shader-cache rebuild: the pipeline cache versions went up (Vulkan 20 → 21, OpenGL 17 → 18).

Fire Emblem: Fortune's Weave runs its own DLSS network

Fortune's Weave upscales with its own neural network on the console's tensor cores — 13 compute passes per frame from 13 dumped programs. Nine of those programs still failed to lower, so the network could not run and frames fell back to the FSR 3.1 replacement. All 13 lower now, and #478 added the network runner itself:

  • Setting: Graphics → Use the game's own DLSS (game_dlss_network), on by default, applied when a game starts. Order of preference: NVIDIA DLSS if you turned it on, then the game's own network, then AMD FSR 3.1.
  • Show, then check: the network's output is used once every pass has run in eight consecutive evaluations and the output has passed 30 health checks in a row (about a second). Until then FSR 3.1 draws over the output pass. Ten failed checks in a row drop the network for the session and the reason is logged.
  • The health check: a small compute pass compares the output's brightness against its input on a 32×18 grid of blocks and counts non-finite samples, read back through a ring of four host-visible buffers once the GPU is finished, so it never waits. A check fails if more than 3% of blocks are off by more than half, or if any sample is NaN or infinite. The thresholds come from the game: a working network mismatches at most 3 of 576 blocks, a frozen one 6–10%.
  • When it is not used: with resolution scaling (the game fixes its own image sizes), without Vulkan and compute shaders that can be made 32 threads wide (the network's matrix multiplies are emulated with subgroup shuffles), or on a GPU that rejects one of its passes. The reason is kept for the status line, which is refreshed every second.
  • Scope: matrix multiplies are only lowered for the passes of such an evaluation, so bigger networks in other titles are still rejected rather than compiled for minutes by the driver.

Measured by the author (RTX 5080, docked, 720p → 1440p): the title screen shows the network after 11 s and its 1,081 checks are all good; 95 s walking Kunlun Base gives 2,277 good checks, the worst with 3 of 576 blocks mismatched; a 150 s run into a battle shows it at 12 s with 995 good checks and no mismatched blocks. A deliberately frozen network is dropped and FSR 3.1 takes over, with the log saying why.

The lowering work behind it: HFMA2.RELU with a predicate operand, the packed-half HSET2 forms (0x233/0x433/0x633), LEA.HI.X with a high source, LDC.U8, LDSM with a uniform offset, MUFU.TANH through a new FPTanh operation, LDGSTS.E.BYPASS.128 as a synchronous LDG+STS, LDGDEPBAR/DEPBAR SB0 as MEMBAR.CTA, TRAP 0x95c, an EXIT whose trailing code is still called, and register pressure handled by copying native scratch registers (R246 and up) into an IR-only bank around each instruction that needs them (IR::NUM_REGS grows to 768). HMMA.1688/.16816 F16 now sums each product in f32 and rounds to half every eight products, checked against a CPU reference of the console's results. Offline, the game's 271-program corpus lowers 271/271 with matrix multiplies (was 262) and 261/271 without (was 259). Pragmata's DLSS programs lower 11/12; its TLD with a uniform handle (0xf66) is still missing.

Mario Tennis Fever: text, boot, and a lost device

Four separate causes, all fixed:

  • Missing text, wrong font (#393): the built-in font handling assumed every slot was available; when some were not, it reported the wrong font and loaded data from the wrong source. All the game's text renders again.
  • Boot hang: the game hung at launch; the fix is in #393 as well, and geometry shaders it needs are no longer refused.
  • Device lost three seconds after the title screen: the framebuffer took the largest layer count among its attachments, but Vulkan requires every attachment to have at least the framebuffer's layers. The game pairs a single-layer 512×335 colour target with a 4-layer 1024×1024 depth array when its first court loads, so the colour image was written as four layers, about 2 MiB past the end of its allocation. VK_EXT_device_fault reported an invalid write at the page right after its memory block. Framebuffers now use the fewest layers of their attachments.
  • The kernel window its boot depends on: early in boot its main thread starts six workers through a helper that captures its own stack frame, and the core-0 worker can only run while the main thread waits on IPC. HLE services answer almost instantly, so that worker was preempted before executing anything and read a reused stack frame. The client's core now runs its next ready thread before an HLE reply wakes the caller, as hardware does.

Fast Fusion: the track, the sky, and the loading hang

  • Missing ground and minimap: their shaders use I2F.S16, which the lowering rejected, so those draws were skipped. The auto-exposure chain and several others needed further Ampere forms — TLD.SCR.LZ with a uniform handle, BRA.CONV/.DIV, SHFL.DOWN, I2F/I2FP of immediates, WARPSYNC Rn, a call link set early, SUST.P.R, an EXIT a branch jumps over — all of which now lower.
  • Black tree-shaped blobs and washed-out exposure in the sky: the sky samples depth with texel coordinates, and texture_pass built the size query before the sample's descriptor was assigned, so it used descriptor 0's size — the sky panorama — and read the depth at the wrong scale. The query is now built once the descriptor is known, and G8R24, which the game samples its depth as, maps to D24_UNORM_S8_UINT.
  • 0 fps while a race loads: with the GPU thread split on (the default), the game's culling compute writes the arguments of its instanced draws into their own command entry. The split's back marks pages as GPU-written only when it runs that work, so the front, running ahead, read them as CPU-written and took stale words — an instance count of 0xbf800000 among them — which became about a million garbage draws and a lost device. Before reading an entry from a page not marked GPU-written, the front now waits for the compute and copy work still queued for the back and checks again: 700–900 waits a second in a race, with no measurable frame-rate cost.

Pokopia: the sky on the Steam Deck

The sky was black on Steam Deck because a guarded ULEA without .HI or a carry-out was not lowered; that part of #387 is now in, with its author credited as co-author. More compute forms (LEA, SHF, UIADD3, DEPBAR, USHF) lower as well, so nearly all of the game's shaders stop being rejected. In-game photographs still come out black — the author flags that as a separate issue and it is not fixed here.

Mario Kart World: 30 FPS and dynamic FPS

Two options under Graphics → Advanced, both off by default, both restricted to Mario Kart World and both taking effect after restarting the game:

  • Mario Kart World: 30 FPS mode — forces the game's native 30 FPS mode at normal game speed.
  • Mario Kart World: dynamic FPS (experimental) — enables the game's own switching between 30 and 60 FPS using whole-frame timing (including GPU wait) instead of CPU time, and adjusts VBlank pacing for this title. It does not force a fixed rate like 43 FPS; the game picks its mode. If both are ticked, dynamic FPS wins. EDEN_NX2_SWAP_INTERVAL still takes priority over both.

The patch is applied when Mario Kart World's main NSO program loads, by instruction pattern matching, and only when exactly one location matches — otherwise it is skipped with a warning in the log, which keeps a future game update from being patched at the wrong address. The author's own measurement: about 22 fps on a Ryzen 5 3600 with an RX 5700, unchanged in frame rate, but noticeably more playable because the game's internal timing follows the real frame time.

nx2_switches.txt: tuned Switch 2 defaults you can edit

A new file ships next to the executable and is read when the GUI starts, so EDEN_NX2_* switches apply to GUI launches without a shell:

  • On by default: EDEN_NX2_SPLIT=2 (offload method/macro execution to the back thread) and EDEN_NX2_FENCE_BATCH=1.
  • Off, with the reason written next to it: buffer downloads (copying back 90–220 MB/s of buffers the CPU never touches drops frame rate by 38–63%), and FRAMES_AHEAD (it adds 1–2 frames of input latency).
  • Documented workarounds: EDEN_NX2_RESETFIX for Donkey Kong Bananza's indirect draws, EDEN_NX2_NO_REACTIVE (now strictly opt-in — bypassing read traps measured 24 vs 29 fps in Mario Kart World), and EDEN_NX2_KEEP_ASTC, plus the tuning switches from earlier builds.
  • Precedence: a variable already in the environment wins; between files, your copy in %APPDATA%\eden\nx2_switches.txt or $XDG_CONFIG_HOME/eden/nx2_switches.txt wins over the shipped one, so updating never loses your edits.

Related: the BC3 recompression threshold for Switch 2 ASTC textures went from 12 to 20 GiB of VRAM (dense ASTC expands 16× when decoded to RGBA8), and reactive-flushing read-trap bypass is no longer automatic.

Performance and correctness batch

  • Descriptors and buffers: descriptor reallocations eliminated and stage texture buffer binding reworked; buffer synchronization, state transitions, stage bindings and pipeline key comparison fast-guarded on the hot path; consecutive non-execution DMA methods batched.
  • Textures: zero-copy chunked staging uploads for large 2D images, finishing between chunks so staging memory is reused; image downloads batched into a single GPU wait; diagnostic statistics skipped when debug logging is off; image views and samplers looked up in a flat array instead of hashing into an unordered_map dozens of times per draw; the environment read once instead of per call.
  • GPU split: ring atomics aligned to 128 bytes, and the diagnostic sorting gated.
  • Memory: the page-table block id (16 bits) could overflow after 65,535 allocations and make unrelated regions look contiguous; page contiguity is now validated; the previous backing is released when a GPU-only region is re-created.
  • Video: H.264 packet framing is detected per stream, so short NAL lengths are not mistaken for Annex-B start codes (#362); undecodable render-target formats are logged rather than guessed; the software blit refuses when either format is undecodable.
  • Audio: in/out managers are kept alive while their sessions are open and unregistered before destruction; libopus state stays on the host with fixed work-buffer sizes.
  • CPU (dynarmic): scalar SQDMLAL, SQDMLSL, SQDMULL, SQRSHRN, SQRSHRUN, UQRSHRN, SQRSHL and UQRSHL implemented, with register declarations fixed (they named general-purpose registers where vector ones were meant).
  • Smaller: the loader requires an update directory's name to be entirely numeric, says why a loose base dump with its data in an update cannot boot, macro position writes are bound-checked, constant buffer words past the end of the buffer are dropped, storage compare-and-swap loops are defined whenever they are used, the guest subgroup size is only forced for warp-level compute, and 0x59f is dropped from the lowering batch because it is SURED on Ampere.

Known issues and caveats

  • Pokopia's in-game photographs are still black; its sky is fixed.
  • Pragmata's DLSS programs lower 11 of 12 (TLD with a uniform handle is still missing).
  • The NVIDIA DLSS setting is still Windows-MSVC-only, as in build 187; the game's own network needs Vulkan and runs anywhere it can.
  • The socket and SSL compatibility changes in this build are labelled WIP by their author — pending review and testing — so treat LAN/network behaviour as unproven.

Coming from build 189?

Everything above. Nothing from 189 is missing: the two native-shader fixes are part of this batch.

Coming from build 183, 187 or 188?

Also new to you: NVIDIA DLSS in the Windows MSVC zip (187), the NUP tools (188), and the first build where Fortune's Weave's own network is usable.

How it works, for the technically curious

  • git diff build-189..build-194 is 145 files, +6,843/−695, with 40 merge commits in the batch — from #78 up to #478. The batch branch was merged with nx2 mid-way (903c86dc), which is where #465's tensor lowering met #443's geometry work and #413's DEPBAR.
  • src/video_core/game_dlss_status.{h,cpp}, vk_dlss_network_probe.{h,cpp} and dlss_network_probe.comp are the probe: VideoCore::GetGameDlssStatus is what the Graphics tab polls once a second.
  • 09e539a6 is the last commit: the LDGSTS barrier is only added to programs that actually issue async copies (uses_async_copy), which the merge had left unused and GCC's -Werror rejected — it broke the non-PGO Linux builds.
  • dist/nx2_switches.txt is installed next to the binary by src/yuzu/CMakeLists.txt and parsed in main.cpp (ParseSwitchFile), executable directory first, then the config directory.

Automatic build of nx2 at 09e539a65ccf8d16a2dc61ee37db0ba4ab20db69.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2 build 189 (7adcecc)

build-189 nightly / pre-release
Release notes · 12 files

What's new in this build

Build 189 of nx2 (7adcecc) is build 188 plus two fixes in the shader compiler for Switch 2 ("native") shaders — and they are what makes the NVIDIA DLSS path that build 187 enabled actually work in Fire Emblem: Fortune's Weave.

With DLSS on, that game's network used to produce NaN by its second frame: half of one layer's output was never written, the encoder's skip connections never reached the decoder, and the upscaled image and its history froze. Both causes are fixed here.

10 files, +216/−24. A shader that hits neither case compiles exactly as before, and with the network off (FSR 3.1) the same scenes measure identical.

In short

  • What was wrong: when a Switch 2 shader reads or writes a "native" global through a pointer taken from a constant buffer, the compiler rewrites the access into a storage-buffer access on the buffer it thinks the pointer names. Two ways that guess went wrong: an address assigned under a predicate is a phi of two pointers, and only the first was used, so the other path's stores fell outside the chosen buffer and were dropped; and a pointer sitting in an 8-byte slot (0x168, 0x188, 0x208, …) was matched against the NVN test, which only accepts 16-byte-aligned slots between 0x100 and 0x700, so it picked a different slot — an input to the address arithmetic, a dimension, a stride or a neighbouring pointer — and rebased the access onto that buffer.
  • In Fortune's Weave: four programs of its DLSS network had 50–58 of the second kind each. The encoder layers' skip-connection outputs never arrived, so the decoder layers read zeros, the recurrent state filled with NaN after the second frame, and the last pass kept showing the previous history — the title screen's clock stood still.
  • The fix: for native programs every candidate pointer the address can come from is collected (following additions, selects, phis and CompositeExtract). One candidate is used directly; with several, all of them are bound, the access stays global, and the SPIR-V global-memory functions pick the closest base at or below the address; with none, the old NVN search runs as before.
  • Measured by the author (720p → 1440p, RTX 5080, network on): the title clock now changes 5–15 between captures where it changed 0.01 before, and the network's output changes by 0.011 between the 30 s and 45 s captures where it changed 0.00003.
  • With the network off nothing changed: the title, Kunlun Base on foot and the battle-intro cutscenes at FSR 3.1 measured identical to before, with no new log messages.
  • Scope: the DLSS setting itself is still only in the Windows MSVC zip (see 187's notes); these two fixes ship in every download and apply to any Switch 2 title whose shaders hit either case.

The two bugs, one at a time

A predicated pointer assignment lost the other path's writes. An address register assigned under a predicate becomes a phi of the new address and its old value, and that old value can point into another buffer entirely. The pass took the first pointer it reached, rebased the access on that buffer, and the other path's stores fell outside it. One of Fortune's Weave's DLSS layers had exactly that, half its output unwritten — and an upscaler whose inputs are NaN produces NaN.

An 8-byte pointer slot was matched to the wrong slot. The NVN storage-buffer search accepts 16-byte-aligned slots in 0x100–0x700. Native programs keep their pointers as raw 8-byte arguments, so a pointer at 0x168 sent the search to 0x160, which holds something else — an input to the address arithmetic, a dimension, a stride, a neighbouring pointer — and the access was rebased onto whatever that looked like.

Both now go through the candidate walk described above, so the buffer a native access lands in is the buffer its pointer actually names.

What this does not change

Anything that is not a Switch 2 native program, and any native access where the address comes from one pointer at a 16-byte-aligned slot: those compile to the same code as in build 188. In Fortune's Weave with DLSS off, the scenes that were measured are indistinguishable from before — this is a fix for a path that was broken, not a change to the FSR 3.1 or hand-written paths.

Coming from build 188?

You keep the NUP tools (dump, metadata edit, icon search), and from 187 the NVIDIA DLSS setting, the Eglantine-trained -pgo builds and the AMD sparse-tile revert. This build adds only the two shader fixes.

Coming from build 183 or earlier?

Everything from builds 187 and 188 is new to you, including DLSS. If you want to try it in Fortune's Weave, this is the first build where the network does not fall apart after a frame.

How it works, for the technically curious

  • Environment gains IsNativeProgram() and IsCbufStorageBufferPointer(index, offset), so the compiler can ask whether a constant is a mapped GPU address at all — native argument tables mix pointers with sizes and strides. ShaderEnvironment answers from a new storage_pointer_types cache.
  • NativePointerCandidates walks GetCbufU32/GetCbufU32x2, IAdd32, Phi, SelectU32 and CompositeExtractU32x2 (element 0 only), requires 8-byte alignment and de-duplicates the results into a small inline vector. The result is memoised per IR instruction in StorageInfo::native_candidates.
  • With more than one candidate the pass inserts all of them in the descriptor set (and in writes for stores), sets Info::native_global_bounds, and leaves the access unrebased. Emitting that flag makes DefineGlobalMemoryFunctions compute each buffer's base once, pick the candidate with the smallest addr - base that is still >= 0, and dispatch to that buffer; bounds come from the binding rather than an NVN size word.
  • Info gained the native_global_bounds field, so the serialised shader caches were versioned up (Vulkan 19 → 20, OpenGL 16 → 17): an existing pipeline cache is rebuilt once after updating, which is normal and expected here.

Automatic build of nx2 at 7adcecc6d23b86d84e158572ea6ddd261fc1cd14.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

NUP Metadata Update - Build 188

build-188 nightly / pre-release
Release notes · 12 files

What's new in this build

Build 188 of nx2 (79c4f82) is build 187 plus the NUP editor: a .nup can now be unpacked back into a loose dump, and its metadata — name, icon, version, publisher and per-language names — can be edited in place, from the game list or from the command line. It fixes #385.

19 files, +2,593/−26, and none of it is emulation: games run exactly as they do in build 187. What changed is what you can do with the dumps themselves.

In short

  • Dump NUP… — right-click a .nup in the game list and it is extracted back into base/, updates/<version>/ and dlc/<titleid>/<n>/, with a progress window and a cancel button. The default output is a folder named after the archive, next to it.
  • Edit NUP Metadata… — change the title, publisher, version, icon and per-language names of an existing .nup in place, with a progress window. Only the fields you touch are rewritten; the packages' contents are copied untouched.
  • Find Icon Online — in the metadata editor, pulls a square icon from switchiconshowdown.com, with SteamGridDB as a fallback when you supply a free API key. The whole search has a 10-second deadline and can be cancelled.
  • Command line — --unpack-nup <file.nup> [<out_dir>] and --edit-nup <file.nup> --nup-name … --nup-icon … --nup-version … --nup-publisher … --clear-nup-name/--clear-nup-icon/--clear-nup-version/--clear-nup-publisher, both in --help.
  • Safer by default — an existing non-empty output folder is never overwritten or cleaned away, and a metadata edit replaces the archive atomically.
  • Menu order — Dump NUP… sits above Dump RomFS, and Edit NUP Metadata… above Configure Game.
  • Smaller thing you will notice: a .nup packed from a dump whose metadata was never filled in now shows the dump's name and icon in the list instead of an empty entry.

Dump NUP: unpacking back into a loose dump

Right-clicking a .nup in the game list now offers Dump NUP… (only for actual .nup archives — a loose dump has no such entry). It writes the same layout a .nup packs from:

  • a container with updates and DLC becomes base/, updates/<version>/ and dlc/<titleid>/<n>/;
  • a base-only container is written bare, without the base/ wrapper, so it round-trips into the layout it came from.

The extraction runs in a window with a progress bar, the byte and file counts, and a cancel button; Ctrl-C cancels the CLI version. An existing non-empty output folder is refused rather than merged into or wiped, which is also what the cleanup skip added in this build guards.

Returning to the list after a dump no longer freezes the window: it rescans once instead of twice and no longer re-reads the firmware on the UI thread.

Edit NUP Metadata: name, publisher, version, icon, per-language names

Edit NUP Metadata… opens on an existing .nup, prefilled from what is stored in it:

  • Name, and next to it a button that reveals one field per language for the localized titles;
  • Publisher (stored as the NACP's developer name);
  • Version;
  • Icon: the current one is shown, a new one can be dropped on it or picked from a file, and Find Icon Online searches for one;
  • every field can be cleared, which removes it. Language tags the console has no field for are kept as stored.

The rewrite touches only the target package's metadata TLVs — the base package, or the first package when there is no base. Extents are copied untouched, the table-of-contents hash and the file size are updated, and the replacement is atomic, so an interrupted edit cannot leave a half-written archive behind. A field you leave alone keeps its stored value, and if nothing changed the writer reports no change instead of rewriting the file.

Editing used to look like it did nothing, because the UI stayed in its "NUP running" state while the archive was rewritten; it now has the same progress window as extracting.

Find Icon Online

The icon panel's Find Icon Online replaces Use Current and asks switchiconshowdown.com first, matching on the title and the title id. If that finds nothing and a SteamGridDB API key is set, it searches SteamGridDB instead; several hits open a chooser. Without a key it explains what is missing and links the SteamGridDB API preferences page, where a free key is created; the key is saved as steamgriddb_api_key in the UI settings. The search shares one 10-second deadline between both sources, so the fallback always gets some of the time, and the whole search can be cancelled.

From the command line

eden-cli (and the GUI's --help) gained:

  • --unpack-nup <file.nup> [<out_dir>] — extracts and exits; the output directory defaults to the archive's name next to it.
  • --edit-nup <file.nup> [--nup-name NAME] [--nup-icon PATH] [--nup-version VER] [--nup-publisher NAME] [--clear-nup-name] [--clear-nup-icon] [--clear-nup-version] [--clear-nup-publisher] — rewrites the default-language metadata and exits.

Both print progress and errors on stderr and can be interrupted with Ctrl-C. The CLI edits the default language; per-language names are a GUI-only field for now.

Smaller fixes in this build

  • A .nup with no title stored now falls back to its dump's name, and its icon is used even when there is no NACP, so an unedited archive is no longer a blank row in the list.
  • The extraction cleanup no longer deletes the contents of a non-empty directory.
  • nup_writer.cpp no longer trips -Werror=maybe-uninitialized on the newest update index (GCC), which builds with the tests enabled.
  • Over 300 lines of new tests round-trip a packed dump through extract and repack, and cover the metadata edit paths.

Coming from build 187?

You keep everything 187 brought: NVIDIA DLSS in the Windows MSVC zip, the -pgo builds trained on Eglantine's own profile, and the AMD sparse-tile revert. This build adds only the NUP tools above.

Coming from build 181 or 177?

Build 187's notes cover what you gain there — DLSS is the big one — and build 181's the Wayland-capable AppImages.

How it works, for the technically curious

  • nup_writer.h gains ExtractNup, DefaultExtractPath, EditNupMetadata and ProbeNupMetadata, plus MetadataEdit (each field an optional: nullopt keeps, empty removes) and the ExtractResult / EditResult enums (Success, Cancelled, InvalidSource, IoError, NoChange).
  • Metadata gained publisher and localized_titles; NupContainer::PackageInfo gained publisher and source_dump, and GetPackageDir gives the extractor a per-package directory view.
  • loader/nup.cpp builds the NACP from the effective title (stored name, else dump name), writes the publisher into developer_name, and keeps the icon even when there is no NACP to hold it.
  • game_list.cpp only adds the two entries when the path ends in .nup and is not a dump root, and disables them while a NUP conversion is running; launch_params.cpp grew the eight new long options (0x100–0x107) and switched the switch to the raw int option value so they can be handled.
  • icon_search.cpp uses common/httplib.h against switchiconshowdown.com and steamgriddb.com/api/v2, with a host allow-list and the client's own cancel error mapped to Cancelled.

Automatic build of nx2 at 79c4f8215a5b5fa78d8b5885da72ae32c92745ab.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

DLSS Update - Build 187 (14d4c4e)

build-187 nightly / pre-release
Release notes · 12 files

What's new in this build

Build 187 of nx2 (14d4c4e) is build 181 plus five changes, and the headline is real this time: NVIDIA DLSS works in the Windows MSVC download. The Graphics tab has a new Use NVIDIA DLSS in place of a game's DLSS setting, which hands a game's DLSS evaluation to NVIDIA's upscaler on a GeForce RTX card instead of running Eglantine's FSR 3.1 replacement.

Also in: the -pgo downloads are trained on Eglantine's own profile instead of Eden's (the fix for "the PGO build is slower than the normal one" on Switch 2 titles), the AMD black-texture regression from the sparse-tile change is reverted, the AppImage carries its build number, and the README and PR template were cleaned up.

In short

  • NVIDIA DLSS — eglantine-windows-x86_64.zip (MSVC) only. Off by default. When on, a game's DLSS evaluation goes to NVIDIA DLSS with the same inputs (colour, depth, motion vectors, jitter); when DLSS cannot run, FSR 3.1 still takes over from the next frame.
  • Where it is not: the Windows -pgo zip is a MinGW build and does not have it (it has never been built with MinGW), and neither do the Linux or macOS downloads. In this build you cannot have both PGO and DLSS on Windows — the DLSS zip is the standard MSVC one.
  • First run: nothing of NVIDIA's is bundled. Open Graphics, tick the setting, and the panel under it reports whether the Streamline loader and DLSS were found. Download from NVIDIA fetches only the needed files out of NVIDIA's Streamline 2.14.16 release (about 1 MB for the loader, 32 MB with DLSS, out of a 276 MB zip) after showing the licence texts, checking each file's CRC and signature before saving it to the user folder's streamline folder.
  • PGO builds fixed: both -pgo builds now use this repository's eglantine.profdata instead of Eden's Switch 1 eden.profdata. On an RTX 4070 laptop, Mario Kart World's attract demo ran 17–24 fps in the old Windows PGO zip against ~47 in the standard build of the same commit; on the new profile the PGO build matches the standard one (30 vs 32 fps in the same pass).
  • AMD black textures: the sparse-tile change that backed a tiled image whole when InitSparseTiles failed is reverted. On AMD's aliased-tiles mode it created the image before the game's data was there, and Switch 2 fills sparse textures with remaps rather than writes, so nothing refreshed it — textures came out black.
  • Smaller: the AppImage now embeds build-<run>-<sha7> as its version metadata, the README has a star-history graph, and the pull request template asks for more of what maintenance needs.
  • Not here: the two fixes that only the experimental line has — Nintendo Switch Sports past 2162-0001 and random Miis with the gender and race asked for. They are in build 183, not in nx2 yet. Build 183 has the same DLSS code but not the CI change below, so its Windows zip has no DLSS either.
  • Still no Android APKs: the publishing was reverted in build 175.

NVIDIA DLSS in place of a game's DLSS (Windows, MSVC zip only)

A game that asks for DLSS gets its temporal upscale replaced by FSR 3.1 today. With Use NVIDIA DLSS in place of a game's DLSS (nvidia_dlss, off by default) ticked on a GeForce RTX card, that evaluation goes to NVIDIA DLSS through NVIDIA Streamline instead, with the game's own colour, depth, motion vectors and jitter.

Nothing of NVIDIA's is linked into Eglantine or shipped with it — only Streamline's MIT-licensed headers are compiled in, and they are downloaded at configure time through CPM from NVIDIA-RTX/Streamline v2.14.16 (hash-checked in cpmfile.json). At run time Eglantine looks for sl.interposer.dll in a streamline folder in the user folder, in EDEN_STREAMLINE_DIR, or in a streamline folder next to the executable, checks its Streamline signature, and starts Streamline with manual hooking. DLSS itself is nvngx_dlss.dll in the same folder, or the newest DLSS 310+ the NVIDIA app has downloaded — Authenticode-checked and copied in as streamline/nvidia-app/nvngx_dlss.dll.

  • Download panel: under the checkbox, the Streamline loader and DLSS are reported with their versions, next to Open Folder and a link to NVIDIA's releases. Download from NVIDIA pulls the missing files out of NVIDIA's Streamline 2.14.16 zip with HTTP range requests — about 1 MB for the loader and 32 MB with DLSS, of the 276 MB archive — after the Streamline and DLSS licence texts, and checks each file's CRC and signature before saving.
  • Preset K is used for every mode (EDEN_NX2_DLSS_PRESET overrides it): the default Performance model (M) and L draw thin dark horizontal lines in some frames at 2x resolution scale, K does not.
  • HDR input is handled with auto exposure, and the mode follows the render/output ratio.
  • Fallback: when Streamline rejects the options, gives no frame token or fails the evaluation, the output is cleared and FSR 3.1 takes over from the next frame — a black frame instead of the previous one or undefined memory.
  • Tested on one machine: Windows 11, RTX 5080, Fire Emblem: Fortune's Weave docked at 1x (720p → 1440p) and 2x (1440p → 2880p), CLI and GUI, stopping and restarting games with it on. Other GPUs and other games are untested.

The -pgo builds are trained on Eglantine's profile now

The PGO downloads used Eden's eden.profdata, which comes from Switch 1 games, and on Switch 2 titles it measured worse than no PGO at all: Mario Kart World's attract demo ran 17–24 fps in the build 96 Windows PGO zip against about 47 in the standard build of the same commit (the "regression since build 73" in #168). Both -pgo builds now download this repository's eglantine.profdata instead, and on the same RTX 4070 laptop the Windows PGO build matches the standard build (30 vs 32 fps in the same pass).

If you were avoiding the PGO builds because of that, they are worth another look — but remember the Windows -pgo zip is the MinGW build, so it is the one without DLSS.

AMD: the sparse-tile change that turned textures black is reverted

When InitSparseTiles failed — an unusual block shape, no memory for the zeroed block or the mip tail, a failed bind — the image was recreated as an ordinary backed image and created before the game's data was in it. On AMD's aliased-tiles mode that showed as black textures: the tile mappings that fill a sparse texture on Switch 2 are remaps, not writes, so nothing refreshed the image after its first, empty, upload. The earlier behaviour is back: an UnwrittenSparse image that the texture cache replaces with a backed, uploaded image once the game writes it.

Smaller changes

  • The AppImage is built with LDAI_VERSION=build-<run number>-<sha7>, embedded in its metadata, so the desktop entry inside it names the release it came from. The download file names are unchanged.
  • The README gained a star-history graph, and .github/PULL_REQUEST_TEMPLATE.md was rewritten for easier maintenance.

Coming from build 181?

You gain all of the above. Nothing from 181 is missing: the Wayland platform plugins in the Linux AppImages, the crash/game/visual/UI issue forms, the fixed tests target and the CI path filter are all still here.

Coming from build 177 or earlier?

Everything in build 181's notes is new to you as well — the Wayland-capable AppImages are the one most people will notice, since a Wayland-only desktop could not start the AppImage before.

How it works, for the technically curious

  • git diff build-181..build-187 is 28 files, +2,031/−73: 24 files of #434, cpmfile.json and src/video_core/CMakeLists.txt from #460, vk_texture_cache.cpp from the #458 revert, release-binaries.yml for the AppImage version, and README.md / .github/PULL_REQUEST_TEMPLATE.md.
  • src/video_core/CMakeLists.txt now has cmake_dependent_option(ENABLE_NVIDIA_DLSS ... ON "MSVC AND ARCHITECTURE_x86_64" OFF). With it on and no EGLANTINE_STREAMLINE_SDK, AddJsonPackage(NAME streamline DOWNLOAD_ONLY) fetches the headers; the SDK path still overrides the download. Only then is EGLANTINE_STREAMLINE defined, and configure_graphics.cpp skips the nvidia_dlss setting without it.
  • The revert restores Image::Image to calling MakeImage directly instead of the MakeHostImage helper that dropped the UnwrittenSparse flag.
  • b4c1815b0f replaces the eden.profdata download with the repository's own profile for both PGO jobs; the release footer's wording changed from Eden's profile to Eglantine's with it.

Automatic build of nx2 at 14d4c4ee66bc2a8101e25bd6057d3561b909afb1.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eglantine's profile); prefer them when your CPU supports it.

Eglantine nx2-experimental build 183 (1521742)

build-183 nightly / pre-release
Release notes · 12 files

What's new in this build

Build 183 of nx2-experimental (1521742) is the catch-up merge: nx2 is merged into the experimental line for the first time since build 130 (#455), so this is build 178's two fixes plus everything the nx2 line shipped in builds 135 through 181. Against build 178 that is 173 commits, 49 of them merges, 205 files, +26,166/−2,491.

It is the first release that is a superset of both lines: all of build 181, plus the two fixes from build 163 (Switch Sports and random Miis) that nx2 still does not have.

In short

  • Games, new on this line: the ja_JP UI translation; Hyrule Warriors: Age of Imprisonment drawing gameplay again; Splatoon Raiders' shadows, reticle and steam; Mario Tennis Fever's stadium; Donkey Kong Bananza through its cutscenes and without its startup crash; Pokopia's first frame and its render-pass splits on tiled GPUs; Mario Kart World's trees, its 1.8.0 NSP launch, its present stall and its stale command lists; Fire Emblem: Fortune's Weave with real AMD FSR 3.1 instead of the DLSS stand-in; GPU-decoded movies no longer green; LAN Play through a room; rumble in Switch 2 titles.
  • The two build-163 fixes are still here: Nintendo Switch Sports gets past "Play with a Single Controller" (error 2162-0001), and random Miis are built with the age, gender and race that were asked for.
  • Tooling, new on this line: the Convert to NUP… dialog with metadata and a progress window, faster loose-dump scanning and launching, Convert to NUP keeping the dump's folder layout, renamed downloads, eglantine-cli --help/--version exiting 0, the Arch eglantine-git PKGBUILD, the corrected contributing guide and PR template, the new issue forms, the Wayland plugins in the Linux AppImages, and the per-draw GPU-thread work in the descriptor table.
  • Hardware: Coffee Lake-era Intel CPUs that report no crystal frequency keep the OS clock instead of the measured TSC (the i5-9400F launch crash).
  • Defaults changed in build 158: ScaleForce with FXAA and handheld mode are on by default. If you carry a configuration from build 130, check those.
  • In the source but not in the downloads: NVIDIA DLSS through Streamline (#434, below). The release workflow is configured without EGLANTINE_STREAMLINE_SDK, so the setting is compiled out of the published binaries and a game's DLSS still goes to FSR 3.1.
  • Compared with build 181 (the newest nx2 release): this build adds the two build-163 fixes, #434's source, and the FSR 3.1 output-blit fix below. Nothing else differs.
  • No Android APKs: the publishing was added in build 171 and reverted in build 175.

What nx2 shipped, build by build

Everything below is new if you are coming from build 178:

  • 135 — Mario Kart World's trees stay drawn and the frame rate that fix cost comes back; Convert to NUP gets a metadata dialog and a progress window; a folder of loose dumps is scanned without walking every RomFS and launching one no longer freezes the window; Donkey Kong Bananza reports its version; the amiibo dialog stops appearing mid-race.
  • 142 — the Japanese UI is fully translated and the downloads are renamed and listed in tables.
  • 158 — Hyrule Warriors: Age of Imprisonment draws gameplay, Splatoon Raiders gets its shadows and steam back, Mario Tennis Fever draws its stadium, Donkey Kong Bananza stops crashing, Pokopia gets past its first frame, Mario Kart World stops stalling on present; ScaleForce/FXAA and handheld become the defaults.
  • 167 — Fortune's Weave's DLSS stand-in becomes real AMD FSR 3.1, GPU-decoded movies stop being green, Donkey Kong Bananza gets through its cutscenes, LAN Play through a room works, video-decoder end-of-stream and socket-lifetime fixes.
  • 168 — rumble works in Switch 2 titles.
  • 169, 170 — a case-colliding macOS icon file removed; eglantine-cli --help and --version exit 0.
  • 171, 175 — Android APKs published, then the publishing reverted. Neither is here.
  • 174 — Mario Kart World 1.8.0 boots from its NSP, Pokopia loses ~50 render-pass splits a frame on tiled GPUs, a lost GPU says so in the log, Coffee Lake CPUs keep the OS clock.
  • 177 — the Arch eglantine-git PKGBUILD, a contributing guide that points at this repository, and less per-draw work on the GPU back thread.
  • 181 — Wayland platform plugins bundled in the Linux AppImages, crash/game/visual/UI issue forms with automatic labelling, the tests target building again, test-only pushes skipped in CI.

NVIDIA DLSS through Streamline lands in the source (#434)

A new Graphics setting, Use NVIDIA DLSS in place of a game's DLSS (nvidia_dlss, off by default), sends the evaluation Eglantine already replaces with FSR 3.1 to real NVIDIA DLSS on GeForce RTX cards, with the same inputs: colour, depth, motion vectors and jitter. When DLSS cannot run, FSR 3.1 runs as before, from the next frame.

It needs no NVIDIA download at build time. Only Streamline's MIT-licensed headers are compiled in and nothing of NVIDIA's is linked or shipped; at run time Eglantine looks for sl.interposer.dll in a streamline folder in the user folder, in EDEN_STREAMLINE_DIR, or next to the executable, checks its signature and starts Streamline with manual hooking. DLSS itself is nvngx_dlss.dll in the same folder, or the newest DLSS 310+ the NVIDIA app has downloaded (Authenticode-checked and copied in as streamline/nvidia-app/nvngx_dlss.dll).

Under the checkbox, a panel reports whether the Streamline loader and DLSS were found and their versions, with Open Folder and a link to NVIDIA's releases. Download from NVIDIA shows the Streamline and DLSS licence texts for acceptance and then pulls only the needed files out of NVIDIA's Streamline 2.14.16 zip with HTTP range requests — about 1 MB for the loader and 32 MB with DLSS, out of a 276 MB archive — checking each file's CRC and signature before saving it.

Preset K is used for every mode (EDEN_NX2_DLSS_PRESET overrides it): the default Performance model and L draw thin dark horizontal lines at 2x scale in some frames, K does not. HDR input is handled with auto exposure, and the mode follows the render/output ratio.

It is not in these downloads. EGLANTINE_STREAMLINE_SDK defaults to empty and the release workflow does not set it, so EGLANTINE_STREAMLINE is not defined, the setting is hidden, and the code is not compiled. To use it, build with -DEGLANTINE_STREAMLINE_SDK=<path to Streamline's include directory> on Windows. Testing was on one machine — Windows 11, RTX 5080, Fortune's Weave at 1x and 2x — and no other GPU or game.

Shipped fix: the FSR 3.1 output blit reads its framebuffer on the calling thread

BlitColor(VkImageView, VkImage, ...) draws the upscaler's output into the game's image. It captured the Framebuffer* and read its render pass, handle and size on the worker thread, but that pointer lives in the texture cache's framebuffer slots, which can be reallocated before the worker records the command. The render pass could then begin with a stale or null framebuffer. FSR 3.1 records quickly enough that this rarely showed; a slower first evaluation crashed in vkCmdBeginRenderPass every time.

The three values are now read on the calling thread and captured by value. This one is in your build whether or not Streamline exists.

The two fixes from build 163 are kept

The merge keeps the experimental side's mii.cpp and six_axis.h: Switch Sports reports non-zero six-axis sensor ranges (2000 dps, 8 g), so nn::imu's gesture detector no longer aborts with 2162-0001 after controller selection, and IDatabaseService::BuildRandom reads age, gender and race as three 32-bit words instead of bytes, so random Miis get the values asked for. nx2 still does not have either fix.

Coming from build 178?

Everything in the list above is new, and so is every nx2 download in this release. Nothing from build 178 is missing: it was build 130 plus these two fixes, and this build has both.

Coming from an nx2 build (181 or earlier)?

You gain the two build-163 fixes (Switch Sports, random Miis) and the FSR 3.1 blit fix. If you were waiting for NVIDIA DLSS, it is in the source of this build but not in its binaries — see above.

Still not in this build

  • #458, the AMD sparse-tile revert (merged after this build): the change that backs a sparse tiled image whole when InitSparseTiles fails is still present here, and on AMD's aliased-tiles mode that case produced black textures. It is reverted in the next nx2 build.
  • #332, the PGO profile (also after this build): both -pgo downloads of this release still use Eden's Switch 1 eden.profdata, which measured 17–24 fps on Mario Kart World where the standard build ran at ~47 on the same RTX 4070 laptop. If a Switch 2 title feels slow on a -pgo build, use the standard one — the next build trains on the repository's own profile.
  • The AppImage build number in the file name, and a few documentation commits.

How it works, for the technically curious

  • 1521742968 has parents ec667e25f9 (build 178) and 05e3b9d8b0 (#434 on nx2). git diff 05e3b9d8b0 build-183 is two files, +18/−6 — src/core/hle/service/mii/mii.cpp and src/hid_core/resources/six_axis/six_axis.h — so the merge is "take nx2, keep the experimental fixes" and nothing else was resolved by hand.
  • git diff build-181..build-183 is 26 files, +1,950/−30: #434's 24 files plus those two.
  • git log --oneline build-183..origin/nx2 lists the nine commits this build does not have, all merged after it: #458 and its revert commit, #332 and its two CI commits, the docs commits, the AppImage build-number commit, and #265 (whose content is already identical here — only its merge commit differs).
  • src/video_core/CMakeLists.txt compiles vk_streamline_dlss.cpp, vulkan_common/streamline*.cpp and links version, wintrust and crypt32 only when EGLANTINE_STREAMLINE_SDK is set and the platform is Windows; configure_graphics.cpp skips the nvidia_dlss setting entirely without EGLANTINE_STREAMLINE.

Automatic build of nx2-experimental at 1521742968665c171e19243331c5e2822f9d2420.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eden's profile); prefer them when your CPU supports it.

Eglantine nx2 build 181 (f347ae0)

build-181 nightly / pre-release
Release notes · 12 files

What's new in this build

Build 181 of nx2 (f347ae0) is build 177 plus four changes: the Linux AppImages now carry Qt's Wayland platform plugins, so they start on a Wayland-only desktop (#298); the repository has real issue forms; the tests target builds again; and a push that only touches src/tests no longer queues a seven-platform release build.

No emulator code changed, so no game behaves differently from build 177 and there is nothing to retest.

In short

  • Linux AppImage — Wayland: libqwayland-egl.so and libqwayland-generic.so, with their client graphics and shell integrations, are bundled in all four Linux AppImages. On a Wayland-only system the AppImage used to abort with Could not find the Qt platform plugin "wayland" and Available platform plugins are: xcb (#447, addresses #298).
  • Issue forms: the single bug report is replaced by crash, game bug, visual bug and UI bug forms, and a workflow labels each new issue by game, GPU vendor and operating system (#433).
  • Tests build again: two src/tests fixes — a sign-compare error in the socket proxy test and the GetPointer hook the descriptor table test's mocks were missing.
  • CI: src/tests/** is now excluded from the release workflow's path filter. This is the change that made up the withdrawn build 179, and it is in this build.
  • Not here: Android APKs (the publishing was reverted in build 175) and the NVIDIA DLSS work — that landed after this build, and it is not in these binaries either.

Linux AppImage: Qt's Wayland plugins are bundled now

An AppImage built before this one shipped Qt's xcb platform plugin only, so on a desktop with no X server — pure Wayland, no XWayland — Qt had no platform to start on:

qt.qpa.plugin: Could not find the Qt platform plugin "wayland" in ""
This application failed to start because no Qt platform plugin could be initialized.
Available platform plugins are: xcb.
Aborted (core dumped)

linuxdeploy's Qt plugin is now asked for the Wayland platform plugins and their client graphics and shell integrations (EXTRA_QT_MODULES=waylandcompositor, EXTRA_PLATFORM_PLUGINS='libqwayland-egl.so;libqwayland-generic.so'). The Qt installation the build already uses contains them, so the AppImage grows by their size and nothing else is downloaded or linked.

Issue #298 is still open, so if you reported it, please confirm on the AppImage — on a Wayland session the app should now start without XWayland, and QT_QPA_PLATFORM=wayland or xcb selects the backend explicitly.

Issue forms instead of one bug template

.github/ISSUE_TEMPLATE/ now has crash.yml, game_bug.yml, visual_bug.yml and ui_bug.yml alongside a trimmed bug_report.yml and feature_request.yml, plus blank.yml (renamed from blank_issue_template.yml). label-issues.yml reads the submitted form and labels the issue: the game becomes its own label (Mario Kart, DKB, Fire Emblem, Splatoon Raiders, Pokopia, Hyrule Warriors, Welcome Tour), the graphics card sets NVIDIA, AMD or INTEL, and the operating system sets windows, linux or MacOS. "No response" fields are ignored.

The tests target builds again

Neither of these is compiled into the release binaries — BUILD_TESTING=OFF and YUZU_TESTS=OFF — but the tests target had stopped building on nx2:

  • socket_proxy.cpp compared Recv's signed count against payload.size(), a size_t, which is -Werror=sign-compare.
  • descriptor_table.cpp's two MemoryManager mocks had no GetPointer, which DescriptorTable::Read now calls for entries inside one page, so the template failed to instantiate. Both return nullptr, which keeps the tests on the generic ReadBlockUnsafe path they are written for.

Coming from build 177?

Nothing has changed in the emulator. Everything in 177's notes still applies: the Arch eglantine-git PKGBUILD, the corrected contributing guide and PR template, and the per-draw GPU-thread work in DescriptorTable::Read. Install this one if you run the AppImage on Wayland; otherwise 177 and 181 are the same program.

Note on builds 179 and 180

Build 179 was published and then withdrawn — it carried only the CI path change above, so its release and tag were removed. Build 180 was a workflow_dispatch run on fix/amd-crashes that was cancelled. Neither is a missing release.

How it works, for the technically curious

  • .github/workflows/release-binaries.yml, AppImage step: export EXTRA_QT_MODULES=waylandcompositor and export EXTRA_PLATFORM_PLUGINS='libqwayland-egl.so;libqwayland-generic.so' before linuxdeploy. The step runs for linux-x86_64, linux-x86_64-pgo, linux-aarch64 and linux-aarch64-pgo, so all four AppImages get the plugins.
  • on.push.paths gains - "!src/tests/**" after src/**; a push that also matches a later entry (CMakeLists.txt, CMakeModules/**, externals/**, dist/**, tools/**, .patch/**, cpmfile.json, the workflow itself) still builds.
  • label-issues.yml parses the ### Field sections of the issue body with body.split(/^### /m), then maps the game, GPU vendor and OS answers to labels through actions/github-script.
  • git diff build-177..build-181 touches 11 files, +489/−83, none of them in src/ outside src/tests/.

Automatic build of nx2 at f347ae083af5595083a5706ff857462ed8c11596.

Linux

Linux packages come as an AppImage (self-contained, needs glibc 2.39 or newer: Ubuntu 24.04, Fedora 40, Debian 13, Arch) and a tar.gz (uses your system libraries, so Qt 6 and the usual libraries must be installed).

Build Type Standard PGO (Recommended) Notes
amd64 AppImage · tar.gz AppImage · tar.gz Make the AppImage executable (chmod +x) and run it
ARM (aarch64) AppImage · tar.gz AppImage · tar.gz

Windows

Windows packages are in-place zip files: extract and run eglantine.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 (MSVC) MSVC zip Use if you run into graphical issues on other builds
amd64 / x86_64 (MinGW) PGO zip Built with MinGW clang; bundles its own DLLs, no Visual C++ redistributable needed

macOS

Build Type Standard PGO (Recommended) Notes
arm64 (Apple Silicon) zip macOS 15 or newer. Not notarized: right-click and choose Open the first time, or run xattr -dr com.apple.quarantine eglantine.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization (clang plus Eden's profile); prefer them when your CPU supports it.