github Djihads80/Eglantine build-109
Performance Update (nx2-experimental)

What's new in this build

Games that are able to boot

Donkey Kong Bananza (Boots to warning screen)
Pokopia (Goes in game now with graphic inaccuracies)
Nintendo Switch Sports Resort (Goes to Title Screen and Sports Select)
Kirby Air Riders (Goes to Title Screen)

This build is a merge of the latest nx2 work (nx2 plus the test/linux-all-prs topic branches). Compared with build 104 it is mostly Switch 2 graphics and service progress, plus another round of Vulkan memory and pipeline work.

Task and mesh shaders (Switch 2)

Switch 2 titles draw some geometry with NVN task + mesh programs, which Eden used to reject and skip.

  • Task and mesh programs are now translated in the shader recompiler (ISBERD/ISBEWR are kept as a pseudo instruction through the Ampere lowering, with an emulated stage buffer for the task payload and workgroup memory) and drawn as native Vulkan mesh pipelines through VK_EXT_mesh_shader.
  • The pipelines are keyed by SET_MESH_SHADER_A/B and SET_MESH_INIT_SHADER and are deliberately kept out of the disk pipeline cache.
  • Practically: high-detail LODs and other task/mesh-drawn geometry now render instead of popping in and out at low quality.
  • EDEN_NX2_NO_MESH and EDEN_NX2_NO_MESH_FILE disable task/mesh at run time, if you want to compare or bisect a problem.

Switch 2 GPU ISA coverage

A large batch of Ampere instructions now lowers instead of being rejected:

  • Textures: TEX.B/TLD.B with an explicit LOD, TLD.SCR/TLD.SCR.LL with texel offsets, TLD4 with texel offsets and with a uniform handle, TMML (including .B, 1D/3D/cube and uniform handles), TXQ/TXQ.B with three or four outputs and on any descriptor buffer, bindless TEX.
  • ALU and control: LEA (with carry out and with a uniform addend), IADD3.X, IMAD.WIDE.U32/UIMAD.WIDE.U32 with immediate multipliers, ISETP.EX, FSETP on uniform registers, USHF above UR15, FRND from a constant buffer, MUFU from a uniform register, UPRMT, I2F.U8, REDUX.MIN/OR/XOR, MATCH.ALL (32-bit and .ALL), CSMTEST, jump tables with instructions between the clamp and BRX.
  • Memory: all ATOMS operations and ATOMS.POPC.INC, SULD.P.3D, SURED.ADD on 2D surfaces, LDC.IS, 128-bit and register-addressed local spills, local load/store size read from bits 73-75, more special registers through S2R.
  • Uniform registers above UR27 are mirrored below R216, and SR_VARIABLE_RATE reads as 1x1 shading.

Switch 2 display, GPU and services

  • gsv: image commands in the feature groups now reach the real image handlers, commands games call get their real behavior, decoder output images are freed on gsv 912, later-SDK video decoder commands are handled, and the area of a present the game says it drew is reported.
  • vi2: full replies to display queries, vi2 212 answers with the layer's ready buffer slots, each event slot has its own source, SDR output is reported on vi2 104, and the TIPC 0 handshake is echoed on the gpu and vi2 sessions.
  • nvdrv/GPU: guest GPU memory is mapped on the GPU thread, GPU-only regions are backed as they are written, the graphics server pool is down to 2 GiB, graphics device ids are handed out for gpu 41/42, nvhost-prof-gpu can be opened, syncpoint signals past the table are ignored, 2D/3D/compute/I2M/ZBC support is reported in the Switch 2 GPU flags, and frame pacing also waits for the presented frame when the GPU is behind.
  • HLE: placeholder handlers for known-but-unimplemented commands, auto-stubbed commands return zeroed replies and are reported only once; bsd command 36 (client registration), hid 213 and 220, audio device notification events, real objects for auddmg:u/audsmx:u, audio renderer revision 16, ssl:s CreateContext and three reply shapes, nsd reply sizes 15/21, am IApplicationFunctions 320/321 and a 12-byte GetCurrentGraphicsScale, ro NRR hash lists read in place, built-in Switch 2 fonts on their own shared memory, and an empty archive served when Switch 2 system data is missing.

Vulkan renderer

  • Memory: 16 MiB and 32 MiB blocks with best-fit placement for images, sparse pages and device-local buffers kept out of the image blocks, images collected in the emptiest blocks first, device memory collected from 5 GiB on every GPU, and a stream buffer that stays inside a small iGPU heap.
  • Pipeline cache: the disk cache is left to NVIDIA's and AMD's drivers, only the pipelines recent sessions used are built at boot, graphics pipelines unused for 9000 frames are destroyed, shader modules are dropped once their pipeline is built, and boot builds are capped when there is no used list yet.
  • Streaming and blits: 128 MiB stream buffer everywhere, ASTC transcode decode images are reused, software blits keep scratch buffers up to 2 MiB, touch only the rows they cover, and release buffers grown for huge surfaces.
  • Guest memory uploads are hinted as cold, clearing is skipped when the memory is still zero, big pages are copied without per-page host work, and the memory manager notifies the caches once per changed range.
  • A failing shader's dump no longer takes the process down with it.

Texture cache

  • Deleted allocations and framebuffers release their slots; deleting an image no longer walks every channel's tables, finds view entries without a scan, and waits for the GPU to be past the image; images still waiting to be destroyed are not counted.
  • Sparse images get no device memory over unwritten blocks and their guest memory is cold-hinted; large ASTC arrays are decoded only for the written layers.
  • Huge ASTC arrays are trimmed harder on small GPUs, and the ASTC opaque check uses a table of block modes.
  • Default ASTC recompression is now BC3 instead of uncompressed, which keeps VRAM use in check on GPUs without ASTC support.

CPU (Dynarmic)

  • Compact per-block tables, untouched locations skipped at the end of an IR instruction, the x64 code cache committed as code is emitted, and the cached code page dropped when a range is invalidated.
  • Faster register allocation.

Filesystem, loader and UI

  • vfs_real keeps only the path in a real file and forgets a path when its file is gone; a RomFS build's nodes no longer own each other; a loose RomFS is built once and only when it is read; a loose dump's display version is read from its own files.
  • Qt no longer asks for decryption keys at startup.
  • Fixed the nix shell script.

Full Changelog: build-104...build-109


Automatic build of nx2-experimental at 350c647.

Windows: extract the zip and run eglantine.exe, or eden-cli.exe from a terminal.
Linux (AppImage): make it executable (chmod +x) and run it; it bundles its libraries and needs glibc 2.39 or newer (Ubuntu 24.04, Fedora 40, Debian 13, Arch).
Linux (tar.gz): extract it and run ./eglantine or ./eden-cli; it uses your system libraries, so Qt 6 and the usual libraries must be installed.
macOS: Apple Silicon and macOS 15 or newer. Unzip and move eglantine.app to Applications; eden-cli is inside it, in Contents/MacOS. The app is not notarized, so the first time right-click it and choose Open (or run xattr -dr com.apple.quarantine eglantine.app).
The -pgo builds are the same programs compiled with profile-guided optimization (clang plus Eden's profile); prefer them when your CPU supports it. The Windows PGO build is a MinGW build, so it carries its own DLLs and needs no Visual C++ redistributable.

Don't miss a new Eglantine release

NewReleases is sending notifications on new releases.