github zortos293/Lichii build-177
Lichii nx2 build 177 (87d84d5)

47 minutes ago

Changes since build 160

Built from nx2 87d84d5. Build 160 was 2eb5f08. That's 86 merged changes.

The yuzu name is gone. The build system, source folders, Qt frontend, translations, emulator libraries and docs now say Lichii instead of the name inherited from yuzu. Your settings, saves and shader caches are kept: config keys, data folders and cache formats don't change, and the few on-disk names that still carry the old name (the shader cache's file magic, the save-size file inside saves, the import path for yuzu data) stay as they are. The program files are still called lichii, eden-cli and eden-room. On macOS the app's bundle id changed, so macOS asks for camera and input permission again (#1541, #1550, #1551, #1552, #1553, #1544, #1582).

Big fixes

  • Ocarina of Time: the far forest no longer floats, and Hyrule Field's frame rate is back. In test builds after build 160, the far pine forest in Hyrule Field and in Kakariko at night was drawn unculled and partly above the ridge, and a spot that ran at 40 fps dropped to 27 fps (RTX 3080). An upstream change that came in with the Eglantine sync (#1462) generated the shader helpers for these foliage programs in a form NVIDIA's compiler mishandles. They're generated the previous way again, which also gives up the cold-compile time upstream saved on them (#1539).
  • Orbitals no longer freezes after the Unreal logo. It froze at 0 fps on every Lichii build so far, because vi2 command 53, which Unreal uses to see which frames were shown, had no handler. This covers Orbitals and the Global Friends Pass. Ported from ghzeni's #742 (#1590).
  • Booting a second game without restarting Lichii no longer crashes. A GPU channel still waiting on a semaphore when a game stopped left a stale entry behind, and the next game's GPU thread read the stopped game's freed memory. It was seen when booting Donkey Kong Bananza after stopping Ocarina of Time (#1592).
  • Stopping a game no longer ends in a "Userspace PANIC". Guest threads kept running while services stopped replying, so about half of all stopped Ocarina of Time sessions logged a panic (2010-0212) that looked like a crash. Guest threads are now suspended before the system powers off (#1450).
  • Ocarina of Time: the dark grid over water is gone. Boxy dark squares followed Link over water whenever a light such as Navi, an enemy or a rupee was near. Shadow maps from the game's light table are now bound through descriptor arrays. Testers on an RX 7800 XT, RTX 4090 and RTX 5080 confirmed it. Port of jpkto's #354, with his commits kept (#1485).
  • Ocarina of Time: a likely fix for the GPU hang after long play. 38 OoT sessions from 28 players ended in a device loss after long play, on AMD, RADV and NVIDIA. A native task shader could launch a leftover, huge number of mesh workgroups; it now sets that count to zero first. Ported from SethRamey's upstream fix. It can't be confirmed yet: the hang shows up about 0.05 to 0.2 times per hour of play (#1492).
  • Mario Kart World: the hang while loading is fixed. Two GPU threads and a guest core deadlocked. The GPU threads no longer wait on kernel locks for sparse memory: a background thread prepares memory ahead of time, and writes are kept until it's ready. The memory reserve follows godpow's upstream design (#1413).
  • Yoshi and the Mysterious Book (demo): no more memory runaway. The demo remaps the same memory every frame, each remap got a new device address, and one buffer kept growing until the process ran out of memory. Freed device ranges of the same size are now reused. In a 150 s run the buffer cache peaked at 308 MiB instead of 2,025 MiB, and the process at 4.7 GB instead of 14.7 GB (#1528). A follow-up gives the kept ranges back when device space runs out, so allocations of other sizes don't fail (#1532).
  • Games no longer vanish from the list when keys are missing. Switch 1 NSP, NSZ, XCI and XCZ files that can't be decrypted are listed with "Decryption keys missing" and a tooltip that says how to install keys. Keys that your key file can produce (master keys, key area keys and titlekeks for newer generations) are now derived, ported from MeownsterHunter's Eden PR 4607 (#1503). A missing key now gives an error that names the key and tells you to install keys, instead of "bad header, please redump" (#1457).
  • Switch 1 games packed as .nx run as Switch 1 again. Every .nx archive was treated as a Switch 2 title, so a Switch 1 game in one got the Switch 2 memory layout and a guest clock 1.63x too fast (#1456).

New features

  • NVIDIA DLSS Frame Generation for Ocarina of Time. It's a new Frame generation type and includes Multi Frame Generation: up to 2x on RTX 40 and up to 4x on RTX 50. It needs "Use NVIDIA DLSS" on, and the NVIDIA DLSS panel downloads NVIDIA's Streamline files; nothing of NVIDIA's ships with Lichii. Other games and GPUs fall back to FSR3 frame generation, and the log says why. Windows only, and not yet tested on RTX 40 or RTX 50 hardware. Built on Dankann's #1348 (based on Frizti's Fritchii#38), with Multi Frame Generation from Revens2's #1291 (#1508).
  • DualSense HD haptics over USB. A wired DualSense plays Switch HD rumble on its voice coils, with each side on its own coil, instead of plain rumble. Turn it on under Controls → Vibration → "Enable DualSense HD Haptics"; it's on by default on Windows. Bluetooth still uses normal rumble. Not tested on hardware yet. Ported from pentalex's Eglantine-Community #624, whose synthesis is adapted from Three-Dola's RenHDrum (#1497).
  • Better rumble on two-motor controllers. On one controller, left and right rumble no longer overwrite each other: each motor plays the stronger side. A new "Frequency-aware rumble" option (off by default) sends each band to the motor that matches its frequency, so a low thud lands on the heavy motor (#1499).

Performance

  • Guest reads skip the GPU cache locks on pages nothing on the GPU touched. In Mario Kart World on Mario Circuit this went from 30.1 to 33.5 fps, with p50 frame time down from 32.7 to 29.4 ms. Read half of Stephen Jayakar's fast path, compared against Frizti's version (#1479).
  • Faster x86-64 guest code. The JIT now uses host call and return, live host flags, address folding and a separate region for cold code. Mario Kart World went from 32.0 to 34.2 fps, and the guest threads spend about a quarter less time on a core. Ocarina of Time in Hyrule Field at night ran at 32.6/32.8 fps against 31.3/32.1, measured with two other candidates on. ARM and Paranoid CPU accuracy keep their old code generation. From Julius Bairaktaris's #831, with Stephen Jayakar's back-edge halt checks from #717 (#1531).
  • Faster JIT compiles. The register allocator tracks its slots in bitmasks instead of scanning all 102 after every instruction. The generated code is identical. liomaroliveira measured 27.9% less JIT compile time in Ocarina of Time and the title-logo frame spike dropping from 60-67 ms to 49-50 ms. Ported from liomaroliveira's fork (#1517).
  • Guest cores wait for work in hardware instead of spinning. In Mario Kart World the old yield loop took 20% of the guest cores' CPU time, about 0.8 of a host core. Idle cores now wait with MONITORX/MWAITX on AMD or UMONITOR/UMWAIT on Intel, for a time that adapts per core (#1373).
  • The GPU thread is woken instead of polling suspended channels. Polling cost about 10 ms of GPU-thread CPU per frame in Mario Kart World. The frame rate doesn't change, but together with #1373 Lichii uses about 0.43 of a CPU core less. The idea comes from Serki's Eglantine-mkw60 and upstream (#1376).
  • Cheaper constant buffer writes. Constant buffer data cost Mario Kart World about 6 ms of the GPU back thread per frame. Each bind is translated once, writes are merged into one invalidation, and small uniform buffers are kept across draws until something writes them (#1441).
  • Data the GPU's engines write keeps its pages tracked, which saves two page-protection changes per page on every write cycle. From lucastaonline's #1161 (#1436).
  • Ocarina of Time water work from #1161. lucastaonline's Kokiri water work is ported in parts, each with his commits kept and without its test switches:
    • Cheaper query cache lookups, frees and locks (#1515).
    • Cheaper reports and fences on the GPU back thread (#1516).
    • Guest writes change page protection after the buffer cache lock is released, so the GPU back thread no longer waits for it. A hazard in the original that could lose an invalidation after a remap is fixed (#1518).
    • Fast draws for pipelines with computed texture handles, word-exact handle checks, and vertex formats as draw parameters with dynamic vertex input (#1519).
    • Command list copies come from a pool, and re-copies at resumes move off the GPU thread. He measured 62.4 to 63.8 fps at the OoT water. A race in the original when the copy queue was full is fixed (#1520).
    • Fast draws copy only the parts of the draw state in use, and kept uniform buffers end at every write and submit they used to miss (#1521).
  • Uploaded guest memory is pushed out of RAM only when RAM is short. Lichii used to drop it from memory every 600 frames and then fault it back in. In Mario Kart World the 1% low went from 15.1/14.3 to 17.1/16.6 fps. It uses more RAM while there's plenty: 6.8-7.0 GB resident instead of 4.9-5.0 GB. Ported from Julius Bairaktaris's change in ThatGuyMcd/Lichii-TGM, based on Frizti's Fritchii idea (#1581).
  • The Windows zero-page pass reads less and runs less often. It stops at the first non-zero line of a page, waits out bulk mapping, and backs off to 5 minutes when it frees little. A pass in Ocarina of Time went from 1,405 ms to about 1,080 ms, and Mario Kart World's 1% low went from 15.1/14.3 to 16.7/17.0 fps. Ported from Frizti (#1580).

Mario Kart World

  • Races went from about 30 to about 38 fps on Mario Circuit across this release, on the owner's Ryzen 9 5900X and RTX 3080. The steps were the cache-read fast path (#1479) and the faster JIT code (#1531) above, then two back-thread changes measured together: 3D state writes sent to the back as register blocks (#1585) and five small cuts from forks (#1586). The last two went from 36.5/36.8 to 37.8/38.8 fps, close to the run-to-run spread, and the owner found the run with both on the best. #1585 is ported from Damfortx with stephenjayakar's encoding; #1586 takes cuts from jpkto, DahBard, skolvolt and lucastaonline and fixes a GPU write that crossed a page and was never collected.
  • Groundwork for higher frame rates. A compute macro that feeds grid sizes from GPU-written command lists is now taken without the GPU thread waiting for those words. By its own estimate this saves nothing at today's 30 fps but removes 4-7 ms of round trips per frame at 60 fps. It builds on DjouWish's #1336 and jpkto's #805 (#1486).
  • No more launches stuck at about 17 fps. Some launches ran at 17.5 fps instead of 28 because the texture cache deleted images the race was still using. Images used in the last 150 frames are now kept while the GPU has room: the slow launches went from 13.7-18.0 fps to 26.4-29.9 fps on a 10 GB RTX 3080 (#1435).
  • The local multiplayer crash is fixed. A process whose program failed to load stayed linked in the kernel's object list, and the next object created at that address crashed. LAN play reaches this path. Ported from Dan Chamberlain's fix, diagnosed by twobasb (#1574).
  • No hang with asynchronous GPU emulation off. Map and run requests are queued without waiting, as they already were with it on. Ported from kraibse (#1575).
  • Particle effects are precompiled. Mario Kart World's .esetb effect sets and Fire Emblem: Fortune's Weave's .ptcl particle files are now read by the shader precache, so their compute programs no longer build mid-race. Upstream measured 66 of 168 compute pipelines missing from MKW's precache before and all 168 covered after. An existing precache file is rebuilt once at the next launch. Ported from kraibse (#1577).

Ocarina of Time

  • No more "boiling" noise on a shader cache from an older build. A pipeline cached while the light-table pointer was empty bound a random texture as a shadow map. It now binds none, and such cache records are rebuilt live (#1523).
  • Fewer one-frame white flashes of the ground, moss and wood. A deleted buffer is now cleared from every GPU channel's bindings, not just the current one. Ported from AManWithAPlan's upstream change and godpow's upstream PR 503 (#1459).
  • A likely fix for device losses on GTX 970-class cards. Mesh-emulation buffers could be reused while the GPU was still writing them. The players affected still have to confirm it (#1452).
  • No more silent exits on PCs near their Windows commit limit. A failed memory-trim pass ended the emulator; it's now skipped, and the log shows the commit numbers (#1451).

Donkey Kong Bananza

  • Faster on the same scene: 17.5 fps against 15.5 with the cache-read fast path (#1479) and another candidate on, and p99 down from about 81 to 69 ms. Most of the gain is probably #1479.

Hyrule Warriors: Age of Imprisonment

  • 30 FPS mode and dynamic FPS. Below 60 fps in single player the game runs in slow motion. "30 FPS mode" runs it at 30 fps at normal speed, and dynamic FPS switches to that only while the game can't hold about 50 fps. Both are off by default, in Graphics → Advanced, and can be set per game. Ported from Rhys Denno's upstream #844 (#1513).
  • The boot hang is fixed. Storage reads with no delay made the game hang at its first loading screen on some PCs; its reads are now throttled at 100 MB/s. Other titles keep their load speed. Ported from Rhys Denno (#1500).
  • Invisible enemies fixed. A shader form the game uses was rejected; upstream also reports invisible roads in Mario Kart World from it. Ported from Rhys Denno, with Hydro74000's test (#1511).
  • Old installed updates no longer stop it from booting. A NUP or tree .nx game used the program of an installed update left in the data folder, with the container's own data. It now ignores the update and logs that it did, and enabled mods are logged (#1504).

Yoshi and the Mysterious Book

  • No more movie abort (2162-0001). It came after 1-4 minutes of movies, and now and then in Age of Imprisonment. A woken client now always reads the current syncpoint value. Ported from Rhys Denno (#1512).

Other games

  • Star Fox: Switch 2 vibration through commands 213 and 220. Titles that rumble through those had none. It's not confirmed in game yet. The 220 handler is ported from Takoroka (#1491).

Crashes and stability

  • Windows: crashes now leave a "Host crash" line and a minidump. Before, a host crash left a log that just stopped, often missing its last lines. The line names the exception, thread and stack, and eden_crash.dmp is written next to the log (#1453).
  • A forced stop no longer hangs Lichii on Windows at "Closing software...". Ported from Quixomatic (#1449).
  • A slow stop is waited out instead of killed. Writing the pipeline cache and destroying tens of thousands of pipelines can take more than 10 s. Lichii now keeps waiting as long as the teardown makes progress, for up to 3 minutes, so it no longer freezes with unsaved caches. Ported from Frizti and Quincy Forbes (#1576).
  • A boot that crashed while building cached shaders doesn't crash every boot. If the last boot never finished loading the shader cache, the next one builds nothing from it at boot and builds pipelines as the game draws. This was one cause of games not starting after reusing an old data folder (#1505).
  • Long sessions no longer run out of SMMU space (invisible geometry). Releasing memory frees every device range inside it. Ported from Ca1nM's upstream PR 824 (#1458).
  • Game writes are no longer lost when several land on one page. Ported from AmateurWizrd's #1328 (#1460).
  • No crash from freed shader programs after a remap. Ported from Anthony Loukinas (#1573).
  • The JIT no longer fails on SM4 instructions in Windows and position-independent builds. From Julius Bairaktaris's #831 (#1570).
  • A leftover EDEN_NX2_TC_MIN_AGE no longer fills GPU memory. It's ignored while memory is short; this was the #1290 crash. Based on RomainROCH's #1311 (#1439).

Upscaling and frame generation

  • Ocarina of Time: the DLSS quality setting now works. It used to run at Quality with a 2560x1440 input whatever you chose. Balanced, Performance and Ultra Performance now lower the game's render resolution (2276x1280, 1920x1080, 1280x720) and DLSS upscales that to 4K. It needs docked mode, applies at the next game start, and uses FSR 3.1 if DLSS turns out to be unavailable. Ported from ProfessorTee's #903 and QuincyForbes/Lichii (#1589).
  • Frame generation works with HDR, and 2x actually looks like 2x. HDR used to switch frame generation off without saying so; FSR3 and LSFG now generate HDR10 and scRGB frames. Generated frames are spaced evenly instead of going out right before the real frame. The log says whether frame generation runs and why not. Includes Zarigis's #783 and ne1i's #1224 (45.9 to 57.3 fps in their OoT test), and the HDR store from felt-mx/fritchii (#1493).

Linux

  • FSR 4 in the x86-64 packages through fsr4-vk by Astyyyyy, a community Vulkan port of FSR 4.1.1. It is not AMD's official FSR 4. It's offered for RDNA 2 or newer Radeons on RADV and replaces FSR 3.1 in Ocarina of Time; when it can't run, the log says why and FSR 3.1 is used. It hasn't upscaled a frame on AMD hardware yet, so it needs RDNA 3 or RDNA 4 testers. The aarch64 packages don't include it (#1496).

macOS

  • The arm64 builds compile again after type and shadowing errors (#1502, #1569, #1591).
  • New bundle id io.github.zortos293.lichii, so macOS asks for camera and input permission again (#1551).

Settings and UI

  • "Use recommended settings" also resets per-game overrides of those settings, and Help → Restore My Previous Settings puts them back. Other per-game settings stay as they are (#1536).
  • A warning before booting a Switch 2 game with less than 16 GB of RAM, with "Continue anyway" and "Don't show this again". The CLI prints it too, and the log marks it (#1478).
  • Custom RTC Date works again, globally and per game, including dates before today. Ported from Amnesia1000's upstream PR 808 (#1465).

From upstream Eglantine

  • Upstream nx2 merged up to 6be10b5 (184 upstream commits reviewed, 16 taken). It brings (#1462):
    • More shader forms: ULDC with 8 and 16-bit loads, I2F.S16 from a uniform register and F2I with constant-buffer abs and neg (Duck912), and HSETP2 with a constant buffer (rdenno).
    • Intel Arc fixes from SethRamey: the guest warp size for compute pipelines that lost a barrier (Mario Kart World banding on Intel's Windows driver), no driver pipeline cache reads during builds on Intel's Windows driver, and channel state cleared on teardown. Plus kraibse's matching warp check.
    • A buffer cache fix: GPU writes on some pages weren't downloaded for a guest read (Jonas).
    • Switch 2 games release their guest RAM (up to 12 GiB) when they stop (SmileyTatsu).
    • The font service Super Mario Bros. Wonder - Nintendo Switch 2 Edition needs (Alleexxi).
    • A loose dump without control data is named after its folder, and rich presence can show the game's name, cover and version (MushyMeow). Presence stays off in Lichii's release builds.
    • Readable colours in the "Closing software..." dialog (PastaLaPate).
    • The split check reports on Linux, offline shader tools, upstream's tests for the lowering it brings, and small fixes to the debug server scripts.
    • Its global-memory helper change was rolled back by #1539 (see Big fixes).
  • Three shader precache fixes: precache files from compatible older cache versions load again, loose dumps can be precached, and .zst shader archives are read. From kraibse and Aidan Kinzett (#1463).
  • ARM64 native execution fixes: register 31 reads as zero in the fallback interpreter (which hung Paper Mario: The Thousand-Year Door upstream), and an illegal instruction in guest code stops the guest thread instead of the emulator. From linyesh (#1464).
  • Two AMD fixes: Mario Tennis Fever no longer closes at the start of a match on AMD, and a bogus sparse block size reported for Mario Kart World's terrain is rejected. From MythosOfs (#1466).
  • Faster shader translation. The SSA pass creates phis only when needed and drops unused identities. Upstream measured 19-23% less translation time on Mario Kart World with identical output. From Wael3rd (#1468).
  • Module names for Switch 2 programs, so debugger library lists and backtraces of Switch 2 games are symbolized. From quixomatic (#1469).

Other upstream and fork ports are listed with their game or topic above: #1413, #1458, #1459, #1492, #1500, #1511, #1512, #1513, #1574, #1575, #1577.

Codebase

  • yuzu name removal. A rename codemod (tools/rename) applies the rules per area and reports any yuzu name an upstream sync brings back. The build system, CMake targets and LICHII_* options (old YUZU_* options still carry over), CI, packaging and source folders are renamed (#1541). Then the emulator libraries (#1550), the Qt frontend and translations (#1551), the Android frontend's package (io.github.zortos293.lichii; Lichii ships no Android build) (#1552) and the docs (#1553). The yuzu SPDX copyright lines are removed (#1544), and so are the Android help links to the yuzu quickstart guide (#1582).
  • Diagnostics, all off unless their variable is set:
    • Present fence, GPU back-thread idle and draw reuse traces (#1437).
    • A trace of GPU-written command lists and the native macros they feed (#1446).
    • Per-guest-thread, JIT and GPU front wait stats (#1472).
    • The list macro trace follows data RAM words to their readers, and its verify mode no longer runs loops to the step limit (#1482).
    • A buffer cache growth trace, the one that found the Yoshi demo runaway (#1530).
    • A log line when a game asks for a socket type other than IPv4, plus new program ids in the developer notes (#1352).

Known issues

  • Ocarina of Time: purple speckles on AMD GPUs. Being investigated.
  • Donkey Kong Bananza: black stripes on distant landscape on some AMD Linux setups.
  • Ocarina of Time: can run out of memory while decoding one very large texture.
  • Fire Emblem: Fortune's Weave: crashes on Linux with RDNA 3 GPUs (RADV).

Downloads

Automatic build of nx2 at 87d84d5.

Linux

Linux packages come as an AppImage and a tar.gz. Both are self-contained and need glibc 2.39 or newer (Ubuntu 24.04, Fedora 40, Debian 13, Arch). The tar.gz holds the same files unpacked, for systems without FUSE: extract it and run lichii/lichii.

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 lichii.exe, or eden-cli.exe from a terminal.

Build Type Standard PGO (Recommended) Notes
amd64 / x86_64 zip PGO zip Both built with clang-cl and ThinLTO; the PGO zip adds a profile trained on Ocarina of Time

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 lichii.app. eden-cli is inside the app, in Contents/MacOS

The PGO builds are the same programs compiled with profile-guided optimization. Linux uses clang with Eglantine's profile; Windows uses clang-cl and ThinLTO with a profile trained in Lichii on Ocarina of Time, so other games gain less. Prefer them when your CPU supports it.

Don't miss a new Lichii release

NewReleases is sending notifications on new releases.