Skip to content

Releases: jreinach-alt/hakuX

hakuX 0.5.2

Choose a tag to compare

@jreinach-alt jreinach-alt released this 17 Oct 23:32

v0.5.2

Performance fixes for Halo: Combat Evolved and Mortal Kombat: Shaolin Monks. This page also records the work since the official line's latest release, v0.3.1: this fork's v0.3.3-j1, v0.4.0-j1, v0.4.1-j1, v0.5.0 and v0.5.1.

GPU driver. hakuX is tested only with the Turnip Adreno Driver T30
(@Mr_Purple_666). The handheld's own driver and other Turnip builds are
untested and draw some games wrongly.
Which driver, and how to install it.

Before installing: it needs an Android handheld on Android 13 or later with an ARMv8.2 CPU with LSE atomics
(Snapdragon 845 / 865 class or newer). It installs over 0.5.1 as an ordinary update, and installs alongside an official hakuX build rather than
replacing it. Launching from ES-DE still needs the two files in
docs/es-de/.

What is new in 0.5.2

  • Halo: Combat Evolved's opening cinematic runs much faster. It held 17 fps through the hangar briefing on a
    Retroid Pocket Nova; it now runs at about 29 fps there. Three things were slowing it down: a slower texture path the
    cinematic's colour surfaces took every frame, the game waiting on the GPU to confirm each occlusion (visibility) test
    before moving on, and the CPU translator recompiling around one floating-point instruction more often than it needed
    to. One fix answers an occlusion test as soon as it is queued, using the previous frame's result; that can make a
    visual effect such as a flare show up a frame late at a camera cut. Some stretches still run under 30 fps. Tracked in
    #1018.
  • Mortal Kombat: Shaolin Monks' Goro's Lair cutscene runs about twice as fast. It ran at 27.5 to 29 fps before and now
    holds about 54 fps on the Nova. The same change (16-bit render targets that a game samples as textures are
    now converted on the GPU instead of being downloaded to the CPU each frame) is on for every title.

Everything since v0.3.1

Each version below lists its title-specific work first.

v0.5.1 (2026-10-16)

Fixes carried forward from X1 BOX. hakuX descends from X1 BOX by izzy2lost,
which brought xemu to Android. X1 BOX kept fixing bugs after hakuX forked from it, and this release pulls those forward:

  • Bad audio data from a game no longer closes the emulator; the voice is skipped. Out-of-range ADPCM audio plays
    instead of producing noise, and a missing audio device is no longer fatal.
  • A texture pointing outside video memory draws blank instead of aborting the emulator or reading past the end of
    memory.
  • A corrupt pipeline cache is discarded and rebuilt instead of crashing the app at start.
  • The setup wizard rejects a flash BIOS file that is not 256 KB, 512 KB or 1 MB.
  • Renderer fixes: a staging buffer flushed before its copy, a uniform-buffer barrier that reaches the fragment stage, a refused null GPU command, and a vertex-array change that was not noticed after a DMA change.

Thank you to izzy2lost for the repository these came from.

Titles

  • Halo: Combat Evolved: the main menu's ring no longer jumps back in bursts. Float-to-integer stores now round the
    way the Xbox does.

Everything else

  • A new adaptive app icon with a themed layer; the app is now named hakuX CE (Community Edition).
  • Launcher setup guides for ES-DE, Daijisho, Pegasus and the stock launcher.
  • The compatibility list now covers 98 titles: 72 Playable, 15 that run but fall below 30 fps, and 11 that do not yet play.
  • Needs Android 13 or later (0.5.0 needed Android 10).

v0.5.0 (2026-10-12)

The first release rated by play rather than by pixel counts alone: 52 titles reach gameplay and hold it (a timed run
with no crash, hang, audio dropout or hitch, at 30 fps or better for at least 90% of it) on a Retroid Pocket Nova or an
AYN Thor. Frame rates were measured on 175 titles.

Titles

  • Need for Speed: Most Wanted: stuttering and repeated audio in movies and speech are fixed (the audio unit's
    bursts outran the game's writer; they are now paced). The first race after loading now starts at 29.8 fps, up from 26.4 fps.
    The warm race-start countdown now takes 34.22 ms a frame, down from 44.23 ms. The race start renders through the driver's
    system-memory path, which cuts GPU time per frame by about a quarter there.
  • GTA San Andreas: hard-edged white polygons in the sky are fixed. About 5% less emulated-CPU work per frame.
  • RalliSport Challenge: rival cars no longer vanish on alternate frames during the countdown and close passes.
  • Forza Motorsport no longer slows down over the course of a race.
  • 50 Cent: Bulletproof: pre-rendered movies ran at 10 to 16 fps of their 30 and now play at full speed.
  • NBA Live 07: the median frame rate rose from 23 fps to 47 fps.
  • 007: Agent Under Fire: gameplay rose from 17 fps to 26 fps. Dead or Alive Ultimate also renders through the
    system-memory path.
  • Crimson Skies: the slowest tenth of frames rose from 23 fps to 26 fps (fewer wipes of the CPU's jump cache).
  • Galleon and other titles that set their clock from VBLANK ran slow (Galleon's clock rose from 56.587 Hz to 59.816 Hz); fixed.
    Separately, a 720p or 1080i title was detected as PAL and timed at 50 Hz.
  • Conker, Blinx 2 and Forza no longer empty the CPU's address-translation cache each time the GPU watches a surface
    (Conker: 145 full flushes a second down to 1).
  • Kabuki Warriors, Dead or Alive 3, Tron 2.0: the ubershader removes the multi-second to minute-long freezes while
    an exact shader compiles on first play.
  • Arctic Thunder: pipelines pre-built from a previous play avoid 4,661 ms of pipeline creation on a cold start.

Everything else

  • Save states: ten slots per game plus an auto slot, undo for the last save and load, optional auto-save on quit.
  • Multiple games folders now supported, shown together in the library.
  • Fast renderer paths and GPU surface reuse, each a Graphics setting with a per-game override.
  • The AYN Thor's bottom screen fills with a game instead of a 640x480 corner.
  • Fixed: several crashes and hangs, including a translation-cache race with disc DMA and an overflow in the inline
    vertex path.
  • Rendering accuracy, measured against a real Xbox's framebuffers: wide lines (47.82% to 99.58% match), YUV and DXT
    textures, signed blend equations, shadow-map comparisons, fog, blits, geometry clipping.
  • Box art lookup is now off until you turn it on; the app tells you exactly what it sends.
  • Needs Android 10 and an ARMv8.2 CPU with LSE atomics. (0.5.1 and later need Android 13.)

v0.4.1-j1 (2026-09-26)

Titles

  • Grabbed by the Ghoulies, RalliSport Challenge 2, Conker: the frame rate no longer collapses to 1-3 fps after a few
    minutes (Ghoulies now holds a median 29 fps on both devices).
  • Dead or Alive 3: the frame rate rose from 2 fps to 52 fps. Jet Set Radio Future: from 27 fps to 57 fps.

v0.4.0-j1 (2026-09-10)

Titles

  • Crimson Skies: High Road to Revenge: skipping the intro video no longer closes the emulator. The game writes a
    texture description the hardware cannot decode while the video shuts down; the renderer now binds a blank texture
    instead. Skipping the opening movie and mission cutscenes was checked on a Retroid Pocket Nova.

Everything else

A rendering-accuracy release, every change measured against framebuffers captured from a real Xbox 1.0 (the
nxdk_pgraph_tests golden results): texture borders, border colour, cylinder wrap, signed texture channels, cube maps,
texture formats, depth, fog, fixed-function lighting, bump mapping, clipping, and a long list of crashes in the
renderer that no longer happen.

v0.3.3-j1

The first release of this fork. No title-specific changes. It installs alongside an official hakuX build under its own
application id, adds an EEPROM export, and fixes launching a game from an external frontend such as ES-DE, which did
not work in any released build. Full history:
CHANGELOG.md.

Known issues and reporting

Many titles boot with visible graphical faults and many have not been tried. See
KNOWN_ISSUES.md, the
compatibility list, and
how to report a bug.

hakuX 0.5.1

Choose a tag to compare

@jreinach-alt jreinach-alt released this 17 Oct 06:00

v0.5.1

A signing, naming and launcher-compatibility release, plus a handful of
stability fixes carried over from X1 BOX.

Three things to know before installing:

  • The release key is rotated. This build is signed with a new key, but
    the old one is kept in the signing lineage, so it installs as an in-place
    update over an official 0.5.0 build: adb install -r keeps your saves, settings and hard disk image. You do not
    need to uninstall first.
  • It needs Android 13 or later now, up from Android 10. If your device
    is on an older Android version, stay on 0.5.0 until you can update it.
  • The app's display name changes to hakuX CE (Community Edition), from
    "hakuX (fork)". The package name (com.jreinach.hakux) is unchanged, so
    this is an in-place update, not a new install; a frontend already wired up
    to launch the old name's activity still finds it, since that is keyed by
    package and activity, not the label shown in a launcher.

New

  • A new app icon. An adaptive icon with a themed (monochrome) layer, so
    it follows your launcher's icon theme on Android 13 and later.
  • Launching from a frontend, confirmed on a real device. ES-DE, Daijisho,
    Pegasus and the stock Android launcher (tested as both the AYN
    odinlauncher and the Retroid launcher) all launch and relaunch a game. Daijisho and Pegasus list hakuX CE directly through their own
    installed-app views; ES-DE needs the two configuration files it always
    has. See docs/frontends/
    for the tested write-up of each.

Fixed

  • Halo's menu ring no longer jumps back in bursts. Float-to-integer stores
    now round the way the Xbox does.

Carried over from X1 BOX, the project this one is ported from:

  • A game with corrupt or out-of-range audio data no longer closes the
    emulator.
    A bad voice is skipped instead, and out-of-range ADPCM audio
    plays instead of producing noise.
  • A texture pointing outside video memory draws blank instead of
    aborting the emulator or reading past the end of memory.
  • A corrupt pipeline cache is discarded and rebuilt instead of crashing
    the app at start.
  • Missing audio device is no longer fatal.
  • The setup wizard rejects a flash BIOS file that is not 256 KB, 512 KB or
    1 MB
    , instead of accepting one that will not work.

Reporting a bug

See docs/reporting-bugs.md.

Known residuals

See KNOWN_ISSUES.md
and the issue tracker. Nothing
in this release changes a game's rating on the
compatibility page.

hakuX 0.5.0

Choose a tag to compare

@jreinach-alt jreinach-alt released this 13 Oct 04:45

v0.5.0

The first release rated by play rather than by pixel counts alone. 52 titles
reach gameplay and hold it — a timed run with no crash, hang, audio dropout or
hitch, at 30 fps or better for at least 90% of it — on a Retroid Pocket Nova
or an AYN Thor. They are listed, with exactly what the rating means, in
docs/COMPATIBILITY.md.
It also brings save states, several games folders, a settings page for the
renderer's faster paths, and the rendering-accuracy work begun in
v0.4.0-j1.

Three things to know before installing:

  • It needs Android 10 or later and an ARMv8.2 CPU with LSE atomics
    (Snapdragon 845 / 865 class or newer). v0.4.x installed on Android 8. On an
    older ARMv8.0 part such as the Snapdragon 835, 660, 665 or 460, the app now
    shows an "Unsupported CPU" message and exits instead of crashing.
  • It installs alongside an official hakuX build rather than replacing it,
    and upgrades v0.4.1-j1 or any earlier fork build in place. Nothing is
    uninstalled and no saves are at risk;
    android/MIGRATING.md
    covers moving saves across. The version number is this fork's own: 0.5.0
    follows the fork's v0.4.1-j1 and is not an official hakuX release (the
    official line's latest is 0.3.1).
  • Launching it from ES-DE still needs the two configuration files in
    docs/es-de/.

Box art lookup is now opt-in

The library's Cover Grid shows cover art from izzy2lost's
X1_Covers collection on GitHub.
Earlier builds fetched it without asking. From this release it is off until
you turn it on:

  • New installs are asked on a Box Art page during setup. The switch
    starts off.
  • If you set up an earlier build, hakuX asks once, the first time the
    library shows the Cover Grid: Keep it on or Turn it off. If you had
    already changed the setting yourself, your choice stands and nothing is
    asked.
  • To change it later, use Look up box art online in the library's
    Cover Grid view.

With it on, each cover is a request to raw.githubusercontent.com naming that
game's cover image, so GitHub sees your device's address and which titles you
look up. The cover is chosen by matching the game's file name against a list
bundled in the app, and that matching never leaves the device. With it off,
the grid shows a placeholder for each game and the app makes no request for
art; the List view never fetches art at all.
PRIVACY.md
lists everything the app sends.

New

  • Save states. Ten slots per game (0 to 9) and an auto slot, saved and
    loaded from the pause menu, with undo for the last save and the last load.
    Optional auto-save on quit, auto-load at launch, and compression (about
    10 MB a state instead of 42 MB) are under Settings, then Save States. States
    are files on the device, outside the Xbox hard disk image. The default
    folder is removed when the app is uninstalled; choose a folder there to keep
    them.
  • Several games folders. Add the SD card and internal storage, or any
    other folder, in Settings; the library shows all of them together.
  • Ubershader (Settings, then Graphics; on by default, with a per-game
    override). A new scene draws at once with a general shader while its exact
    shader compiles, instead of freezing until it is ready (Kabuki Warriors,
    Dead or Alive 3, Tron 2.0). It can cost frame rate in some games: ToeJam &
    Earl III ran at 54 fps instead of 60 in testing. A banner says so when it is
    off.
  • Pipelines pre-built from a previous play. A game you have played before
    no longer freezes the first time a scene loads: the pipelines it built last
    time are pre-built on a compile pool, and the pipeline cache is saved and
    reloaded. (Arctic Thunder's 43 pipeline creates had cost 4,661 ms on a
    cold start.)
  • Fast renderer paths (Settings, then Graphics; on by default, with a
    per-game override). Faster report queries, texture scans, draw recording,
    shader uniform updates, and hand-off of GPU commands from the emulated CPU.
    (Need for Speed: Most Wanted's warm race-start countdown: 44.23 → 34.22 ms a
    frame, with no correctness regression across 37 Playable titles screened.)
  • GPU surface reuse (Settings, then Graphics; on by default, with a
    per-game override). A render surface that is reused is rebound on the GPU
    instead of recreated. (NBA Live 07: 23 → 47 fps median.)
  • The AYN Thor's bottom screen. A game started on a screen smaller than
    1280×720, such as the Thor's bottom screen, fills it instead of a 640×480
    corner.

Fixed

  • Need for Speed: Most Wanted. Stuttering and repeated audio in movies
    and speech. The first race after loading starts at 29.8 fps instead of
    26.4, and the race start renders through the driver's system-memory path,
    which cuts GPU time a frame by about a quarter there.
  • GTA San Andreas. Hard-edged white polygons in the sky.
  • RalliSport Challenge. Rival cars vanished on alternate frames during the
    countdown and close passes. A title that gates its draws on occlusion
    queries now reads this frame's result.
  • Forza Motorsport no longer slows down over the course of a race.
  • 50 Cent: Bulletproof. Pre-rendered movies ran at 10 to 16 fps of their
    30 and now play at full speed (the 97-second teaser took 111 s; it now
    takes 98).
  • 007: Agent Under Fire and Dead or Alive Ultimate render through the
    system-memory path too. (Agent Under Fire: 17 → 26 fps.)
  • Titles that set their clock from VBLANK ran slow. A deferred VBLANK
    reset the timing grid instead of holding it, and the game clock lost
    several seconds a minute (Galleon: 56.587 → 59.816 Hz). Separately, a 720p
    or 1080i title was detected as PAL and timed at 50 Hz; PAL detection now
    applies to 481 to 576 lines only.
  • Crashes and hangs.
    • A translation-cache bug that could hang or crash the emulator when a
      disc DMA thread raced code recompilation.
    • A crash on the first texture bind after the texture cache filled up.
    • A crash when a game sent a very large draw through the inline vertex
      path; the buffer now grows instead of overflowing.
    • An assertion, and so a crash, when a vertex program wrote to its own
      constant registers.
  • x87 floating point. FRNDINT and FIST honour the game's rounding
    mode instead of the host's, and a float-to-integer conversion out of range
    saturates as the hardware does.

Speed

  • The emulated CPU no longer empties its whole address-translation cache each
    time the GPU starts or stops watching a surface, only the pages concerned
    (Conker: 145 full flushes a second down to 1).
  • Fewer wipes of the emulated CPU's jump cache. (Crimson Skies: the wipes
    took 8.6% of guest CPU time and now take none; the slowest tenth of frames
    went from 23 to 26 fps.)
  • A memory-read shortcut that never engaged in gameplay is gone, and with it
    a check on every read (GTA San Andreas: about 5% less emulated-CPU work a
    frame).
  • The frame limiter sleeps until the next frame is due instead of spinning a
    CPU core.
  • The fixed-function lighting shaders compile about twice as fast: on the
    Nova, creating the same set of pipelines took 12.0 s instead of 25.8 s,
    which shortens the pause the first time a lit scene appears.
  • The native library is built for ARMv8.2: native thread-local storage,
    inline atomics, and direct calls within the library (atomics: 3.42% →
    0.41% of the emulated CPU's samples). This is the reason for the new CPU
    and Android requirements above.

On 30 fps-capped titles several of these changes do not show as frame rate;
they leave more headroom.

Rendering

Measured, as in v0.4.0-j1, against framebuffers captured from a real Xbox
(the nxdk_pgraph_tests golden results). Three of v0.4.0-j1's known
residuals are closed: the YUV-to-RGB rule, DXT1 decode rounding and the
signed blend equations.

  • Wide lines are drawn with the hardware's footprint (47.82% → 99.58%
    match against the hardware captures).
  • Signed blend equations apply their blend factors, and colour
    surfaces without an alpha channel
    blend with the hardware's pad alpha.
  • YUV textures (YUY2, UYVY) round each colour term separately, as the
    hardware does (TexFmt_YUY2_L and TexFmt_UYVY_L: 136,900 px each → 0).
  • DXT textures widen colour endpoints by bit replication and round the
    interpolated colours (Texture_DXT: 1,053,357 → 586,700 differing px; all
    six colour-only DXT3 and DXT5 tests exact). DXT1's ordered dither saturates
    at both ends.
  • A render target sampled as a texture of another format is read in the
    right channel order (Blend tests: 5,893,287 → 3,562,479 differing px), is
    detected reliably when a texture shares its address and size, and gets its
    barrier back when a later draw writes it.
  • Shadow-map comparisons quantise the reference to the depth texture's
    precision (Texture_shadow_comparator: 236 → 260 of 288 exact; 41,716 →
    8,776 px).
  • State that was silently dropped is now honoured: the clip rectangle a
    blit is bounded by (Blit clip tests: 558,808 → 467,545 px), and polygon
    stipple patterns.
  • Geometry. A triangle with one vertex behind the camera clips as the
    hardware clips it (271,518 → 746 px); screen-space depth rounds toward zero
    (165,447 → 0 px); a vertex array the GPU has just rendered into is fetched
    again (DynamicUpdateLoop: 96,000 → 0 px); wireframe polygons emit their
    edges in the hardware's order.
  • Fog. A vertex program that writes no fog coordinate inherits the last
    one written (CoordNotSet: 30,570 → 3 px), and the RADIAL fog coordinate...
Read more

hakuX nightly 2026-10-12 (00fde8afb3)

Pre-release

Choose a tag to compare

@jreinach-alt jreinach-alt released this 12 Oct 07:45

Automated nightly. Built from 00fde8afb3 on master (the tip of origin/master).

Performance

  • NFS Most Wanted's first race now starts at 29.8 fps (from 26.4), and Submit frame buffering now applies its Triple default.
  • "Fast renderer paths" graphics setting, on by default with a per-game override -- NFS Most Wanted's warm race-start countdown drops from a mean 44.23 ms to 34.22 ms (about 23% faster) with no correctness regression across 37 screened Playable titles.

Other

  • GTA San Andreas: fixed hard-edged white polygons in the sky. Need for Speed Most Wanted: fixed stuttering and repeated audio in movies and speech.

Plus internal test-harness work.

Installs alongside an official hakuX build and upgrades a previous fork build in place.
Launching from ES-DE needs the two files in docs/es-de/.

Notes updated 2026-10-12 07:30 UTC.

hakuX nightly 2026-10-11 (7f986f73f6)

Pre-release

Choose a tag to compare

@jreinach-alt jreinach-alt released this 11 Oct 07:45

Automated nightly. Built from 7f986f73f6 on master (the tip of origin/master).

Performance

  • Need for Speed: Most Wanted's race-start rendering now uses the driver's sysmem path instead of GMEM tiling, cutting measured GPU time per frame by roughly a quarter at the race start; no visible frame-time change yet on this build, since the GPU is not the limiting stage for this title today.

Plus internal test-harness work.

Installs alongside an official hakuX build and upgrades a previous fork build in place.
Launching from ES-DE needs the two files in docs/es-de/.

Notes updated 2026-10-11 07:30 UTC.

hakuX nightly 2026-10-10 (7d574ece8b)

Pre-release

Choose a tag to compare

@jreinach-alt jreinach-alt released this 10 Oct 09:15

Automated nightly. Built from 7d574ece8b on master (the tip of origin/master).

Performance

  • New "GPU surface reuse" graphics setting, on by default, with a per-game override.

Plus internal test-harness work.

Installs alongside an official hakuX build and upgrades a previous fork build in place.
Launching from ES-DE needs the two files in docs/es-de/.

Notes updated 2026-10-10 09:06 UTC.

hakuX nightly 2026-10-05 (d32c35d3ce)

Pre-release

Choose a tag to compare

@jreinach-alt jreinach-alt released this 06 Oct 04:06

Automated nightly. Built from d32c35d3ce on master.

Rendering fixes

  • RalliSport's rival cars no longer vanish on alternate frames (the countdown and close passes); titles that gate draws on occlusion queries read this frame's result.
  • A game started on a screen smaller than 1280x720 in either dimension, such as the Ayn Thor's bottom screen, now fills the screen instead of a 640x480 corner.

Other

  • You can add several games folders (for example the SD card and internal storage) in Settings; the library shows all of them together.

Plus internal test-harness work.

Installs alongside an official hakuX build and upgrades a previous fork build in place.
Launching from ES-DE needs the two files in docs/es-de/.

Notes updated 2026-10-10 02:43 UTC.

hakuX nightly 2026-10-04 (4991143fde)

Pre-release

Choose a tag to compare

@jreinach-alt jreinach-alt released this 06 Oct 04:06

Automated nightly. Built from 4991143fde on master.

Performance

  • Conker, Blinx 2 and Forza no longer empty the emulated CPU's address-translation cache each time the GPU starts or stops watching a surface (Conker: 145 full flushes a second down to 1); no fps or battery change was measured, as these titles run at their 30 fps cap.

Other

  • A game's CPU no longer waits for the GPU to finish a frame before it can read the GPU's command-queue position. No frame-rate change was measured: Tron 2.0's intro and gameplay run as before.

Plus internal test-harness work.

Installs alongside an official hakuX build and upgrades a previous fork build in place.
Launching from ES-DE needs the two files in docs/es-de/.

Notes updated 2026-10-10 02:43 UTC.

hakuX nightly 2026-10-03 (9d1155f919)

Pre-release

Choose a tag to compare

@jreinach-alt jreinach-alt released this 06 Oct 04:06

Automated nightly. Built from 9d1155f919 on master.

Performance

  • Guest code runs a little faster on every title. A memory-read shortcut that never engaged in gameplay no longer costs a check on every block and every read.
  • Games no longer freeze to compile shaders the first time a scene appears. A general "ubershader" draws it at once while the exact shader builds, which removes multi-second to minute-long stalls on first play (Kabuki Warriors, Dead or Alive 3, Tron 2.0). In some games it can lower the frame rate (ToeJam & Earl III ran at 54 fps instead of 60 in testing). It can be turned off in Settings > Graphics > Ubershader, globally or per game.

Plus internal test-harness work.

Installs alongside an official hakuX build and upgrades a previous fork build in place.
Launching from ES-DE needs the two files in docs/es-de/.

Notes updated 2026-10-10 02:43 UTC.

hakuX nightly 2026-10-01 (5014d808b0)

Pre-release

Choose a tag to compare

@jreinach-alt jreinach-alt released this 06 Oct 04:06

Automated nightly. Built from 5014d808b0 on master.

Performance

  • A game you have played before no longer freezes the first time a scene loads.
  • Forza Motorsport no longer slows down over a race (a surface list grew without bound)

Plus internal test-harness work.

Installs alongside an official hakuX build and upgrades a previous fork build in place.
Launching from ES-DE needs the two files in docs/es-de/.

Notes updated 2026-10-10 02:43 UTC.