Skip to content

Releases

X9 (pre-release): frame generation, 30 fps shown at 60 (includes X2-X8)

Choose a tag to compare

@cheemu21 cheemu21 released this 10 Nov 16:28

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

X2 to X8 were test builds made along the way; their changes are all in this source, listed by the build that brought them.

In this build (X9) and X6 to X8: frame generation

  • Frame generation (launcher, offered when Frame rate is 30 fps; off by default). The game draws 30 frames a second and the screen shows 60. MetalFX makes the frame halfway between each two of the game's frames from the picture alone, so it needs nothing game-specific. Motion looks like 60 for about the work of 30; it adds a little input delay compared with real 60 fps.
    • X7: in-between frames are made at the size the picture is shown at. The game passes a crop with every frame, which X6 missed. Frame generation also pauses while frames drop, so the picture doesn't flicker.
    • X8: only the cropped picture is copied: the game draws 2352×1080 into a 3136×1440 texture. That's 44% less work for frame generation, which had caused frame drops in X7.
    • X9: it pauses only for real drops. One frame waiting is normal with Frame buffering on, and X8 paused for it on 37% of frames.
  • log.txt now shows what frame generation costs on the GPU, how often it paused, and any display update that took 50 ms or more.

X5

  • DM_PSO_CAPTURE (off unless set): one run writes the setup of every pipeline the phone builds, toward a future offline archive that also holds the ones built during play.

X4

  • The first start prepares the pipelines an iPhone 18 Pro Max recorded in Kokiri Forest, Hyrule Field, Castle Town and Hyrule Castle, so those areas don't stall on them in play.

X3

  • The pipeline archive is made offline for the iPhone 18 Pro's GPU, so draws start from ready pipelines instead of freezing 0.3–2.9 s at new areas. It's packed so LiveContainer can sign it.
  • Two shader fixes from nxnative:
    • foliage no longer flashes white for single frames in Hyrule Field;
    • faster multiplies in translated shaders.

X2

  • The game's big memory pools stay in files instead of plain memory, so the footprint no longer grows to 7.4 GB over a long session.

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59
DM_NVN_GPUPROF=every:600
DM_METAL_HUD=0
DM_POOL_ANON_MAX_MB=512
DM_NVN_GMEM_NOBIG=1

Status

  • X8 on the iPhone (log 80: 30 fps with frame generation, render scale 0.60, Wide view, Real-time presenting and Deadline boost on): 0–1 of 300 frames dropped, also after the phone warmed. X9's fix for the extra pauses has not been played on a phone yet.
  • Keep Real-time presenting and Deadline boost on. With them off, a warm phone moves the game to the slow cores and frames drop (logs 73 and 75).
  • The game pauses while Notification Center or Control Center is down, as a Switch game does at the HOME menu.
  • In heavy areas, the game and frame generation together can use most of a frame's 33 ms of GPU time. Turn off Wide view or lower the render scale for headroom.
  • Keep at least 15 GB free on the phone: the game stops itself under 5 GB free.

Not affiliated with Nintendo.

X1 (pre-release): Wide view, the save crash fixed, render-target recycling

Choose a tag to compare

@cheemu21 cheemu21 released this 10 Nov 16:28

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

In this build (X1)

  • Fixes the crash right after a save: V23 could stop with -[NvPkg buffer]: unrecognized selector (from nxnative).
  • Wide view (launcher, off by default): the game renders the screen's shape instead of 16:9 with black bars. Nothing is stretched.
  • Render targets are recycled: a change of render scale or dynamic resolution reuses freed GPU memory instead of taking new memory each time (from nxnative).
  • Up to 16 command allocators in flight instead of 8: the CPU no longer waits for a free one.
  • More fixes from nxnative:
    • a stopped Core Haptics engine no longer closes the app;
    • each audio renderer plays from its own blocks;
    • cube textures in array slots read every face.
  • Includes V23: no more magenta textures.

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59
DM_NVN_GPUPROF=every:600
DM_METAL_HUD=0

Status

  • Played 47 minutes on an iPhone 18 Pro (30 fps, render scale 0.60). Memory stayed at 5.5 GB for 32 minutes, then grew with the areas to a 7.4 GB footprint, and iOS ended the app. X2 fixes this.
  • Keep at least 15 GB free on the phone: the game stops itself under 5 GB free.

Not affiliated with Nintendo.

V22 (pre-release): GPU savings from the oot2 branch

Choose a tag to compare

@cheemu21 cheemu21 released this 09 Nov 17:39

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

In this build (V22)

  • Mesh shader byte stores as one store instead of a retry loop (from the oot2 branch): Ocarina's foliage mesh shaders spent 8.3-8.6 ms of GPU a frame in that loop on an M3 Pro.
  • Raw reads keep their last pool range (oot2): most of the game's memory reads skip the pool table; about 7 ms of a frame in Hyrule Castle Town's skinned characters.
  • Occlusion checks read once their result is in (oot2): hidden objects are skipped; GPU 13.3 to 12.2 ms on an M4 Pro.
  • Includes V18-V21. The first start takes longer while the new shaders are prepared.

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59
DM_NVN_GPUPROF=every:600
DM_METAL_HUD=0

Status

  • Not yet tested by the owner on an iPhone; a member's first minute on an iPhone 15 Pro with Potato mode on held 30 fps.
  • Known: the game closes at the first ocarina note (Impa, Zelda's Lullaby), which blocks the main quest. Fixed in nxnative main; the fix is not in this build yet.
  • Keep at least 15 GB free on the phone: the game stops itself under 5 GB free.
  • At 60 fps the phone heats up within one to two minutes and iOS lowers the clocks; 30 fps holds for long sessions.

Not affiliated with Nintendo.

V21 (pre-release): Cheaper frames from nxnative main

Choose a tag to compare

@cheemu21 cheemu21 released this 09 Nov 17:39

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

In this build (V21)

  • Vector loads in the shader translator (from nxnative main, seedds): the game's 128-bit memory reads become one load instead of four; measured on an M4 Pro, Ocarina's GPU time from 16.3 to 12.6 ms. The shaders take about 1 GB less.
  • Native float atomic adds (nxnative PR seedds#1930): the two costliest compute shaders in the iPhone's profile no longer retry.
  • Frame step (nxnative PR seedds#1942): no more getting stuck at 20 fps after a long shader preparation.
  • Smaller command buffers (from nxnative main): they no longer grow to 36-80 MB each in scenes of about 150 passes.
  • Includes V18-V20. The first start takes longer while the new shaders are prepared.

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59
DM_NVN_GPUPROF=every:600
DM_METAL_HUD=0

Status

  • Not yet tested on an iPhone.
  • Known: the game closes at the first ocarina note (Impa, Zelda's Lullaby), which blocks the main quest. Fixed in nxnative main; the fix is not in this build yet.
  • Keep at least 15 GB free on the phone: the game stops itself under 5 GB free.
  • At 60 fps the phone heats up within one to two minutes and iOS lowers the clocks; 30 fps holds for long sessions.

Not affiliated with Nintendo.

V20 (pre-release): Real-time presenting toggle

Choose a tag to compare

@cheemu21 cheemu21 released this 09 Nov 17:38

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

In this build (V20)

  • Real-time presenting (launcher, Performance, on by default): on tells iOS how much of each frame the presenting thread needs, which keeps it fast; off may use less power, with a risk of more stutter. For comparing power on the phone.
  • The GPU profile keeps one frame in 600 without the per-dispatch timing.
  • Includes V18 and V19.

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59
DM_NVN_GPUPROF=every:600
DM_METAL_HUD=0

Status

  • Tested on an iPhone 18 Pro with the toggle on (render scale 0.60, 60 fps).
  • Known: the game closes at the first ocarina note (Impa, Zelda's Lullaby), which blocks the main quest. Fixed in nxnative main; the fix is not in this build yet.
  • Keep at least 15 GB free on the phone: the game stops itself under 5 GB free.
  • At 60 fps the phone heats up within one to two minutes and iOS lowers the clocks; 30 fps holds for long sessions.

Not affiliated with Nintendo.

V19 (pre-release): MetalFX at render scale 0.25, GPU profile

Choose a tag to compare

@cheemu21 cheemu21 released this 09 Nov 17:38

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

In this build (V19)

  • MetalFX at render scale 0.25: at 0.25 the game picks another upscaler network, which the port did not count as the end of its upscaler chain, so the game's own heavier upscaler ran. MetalFX now takes it too. On an iPhone 18 Pro the GPU time fell from 12-13 ms to about 10-11.7 ms a frame.
  • GPU profile built in: one frame in 600 is timed pass by pass and dispatch by dispatch ([gpuprof] lines in log.txt; the profiled frame runs a little slower).
  • Includes V18.

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59
DM_NVN_GPUPROF=every:600
DM_NVN_GPUPROF_CS=1
DM_METAL_HUD=0

Status

  • Tested on an iPhone 18 Pro (render scale 0.25, 60 fps).
  • Known: the game closes at the first ocarina note (Impa, Zelda's Lullaby), which blocks the main quest. Fixed in nxnative main; the fix is not in this build yet.
  • Keep at least 15 GB free on the phone: the game stops itself under 5 GB free.
  • At 60 fps the phone heats up within one to two minutes and iOS lowers the clocks; 30 fps holds for long sessions.

Not affiliated with Nintendo.

V18 (pre-release): Potato mode for iPhones with less memory

Choose a tag to compare

@cheemu21 cheemu21 released this 09 Nov 17:38

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

In this build (V18)

  • Potato mode (launcher, off by default): for iPhones with less memory, such as an iPhone 15 Pro, which gives the game about 6 GB. It turns on memory savers ported from the A builds: a GPU memory guard that lets go of idle memory from 4,400 MB, a 64 MB texture recycle bin, a sweep of shared textures nothing uses, a shader warm-up that keeps nothing in memory, large memory pools kept in files, and render targets made only when a draw needs them.
  • With Potato mode off, nothing of it runs: the build plays as V17.
  • The commits from other authors keep their authorship (Pedro Nascimento's GPU memory guard, the recycle bin) or credit them with Co-authored-by.

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59

Status

  • Not yet tested on an iPhone with Potato mode on.
  • Known: the game closes at the first ocarina note (Impa, Zelda's Lullaby), which blocks the main quest. Fixed in nxnative main; the fix is not in this build yet.
  • Keep at least 15 GB free on the phone: the game stops itself under 5 GB free.
  • At 60 fps the phone heats up within one to two minutes and iOS lowers the clocks; 30 fps holds for long sessions.

Not affiliated with Nintendo.

V17 (pre-release): a steady 30 fps on the iPhone

Choose a tag to compare

@cheemu21 cheemu21 released this 08 Nov 19:50

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

In this build (V17): a steady 30 fps

At 30 fps an iPhone lowers the GPU clock until the work fills most of the frame. On an iPhone 18 Pro at render scale 0.25 the GPU took 12 ms a frame at 60 fps but 29–30 ms at 30, with spikes of 33–38 ms. So most frames missed their refresh (log 60: 195 of 300 over 33.3 ms), and the frame step's catch-up jumps juddered about three times a second.

  • Frame buffering on by default: the CPU and the GPU work at the same time instead of taking turns. The launcher's Frame buffering row starts on.
  • Two frames for the GPU at 30 fps: 66 ms from submission to display instead of 33, so a 34–38 ms frame no longer drops. This adds about 33 ms of input lag, at 30 fps only.
  • No catch-up jumps: a late frame slows the game for a moment, as on a console, instead of a jump in motion on the next frame.
  • The GPU profile and Metal HUD lines from V16 are not baked in.

Since V13

  • Render scale slider (V15-touch2): one slider from 0.25 (marked Potato) to 1.0, default 0.667 (1280×720 handheld), in place of the Resolution preset.
  • Touch controls (V15-touch): the Zelda layout from the A builds: icons, ZL lock, D-pad.
  • LDSM fix (V15): no more white flashes from the game's upscaler networks (upstream PR seedds#1376).
  • Deadline boost off by default (V14), a jump icon on X.
  • V16: a GPU profile build (for measurement only).

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59

Status

  • V17 is not yet tested on the iPhone. The frame-step unit tests pass.
  • At 60 fps the phone holds 60 for about a minute, then iOS lowers the clocks once it warms up (thermal state 1) and it falls to 37–43 fps.
  • Known: magenta or black textures can appear after some area changes.

Not affiliated with Nintendo.

V16 (pre-release): Render scale slider down to 0.25, A's touch controls, GPU profile build

Choose a tag to compare

@cheemu21 cheemu21 released this 08 Nov 18:52

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (the v1 dump: base game + update v131072) with the steps in docs/games/kid-with-sword-remake.md, with an env file holding the lines under "Build settings" below.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone and Mac app, on top of nxnative.

In this build (V16)

  • GPU profile build: every GPU pass of one frame in every 600 is timed and written to log.txt ([gpuprof] lines; dm/tools/gpuprof.py sums them). It costs next to nothing and is there to find the GPU work that holds frames at about 13 ms whatever the render scale.
  • Metal performance HUD off by default.
  • Otherwise the same as V15-touch2.

Since V13

  • Render scale slider (V15-touch2): one slider from 0.25 (marked Potato) to 1.0 in steps of 0.05, default 0.667 (1280×720 handheld). It replaces the Resolution preset.
  • Touch controls (V15-touch): the Zelda layout from the A builds: icons, ZL lock, D-pad.
  • Launcher (V15-touch): a row set by an env file starts at that value and can still be changed.
  • LDSM fix (V15): a subgroup barrier before shared-memory reads, so the game's upscaler networks no longer read rows other lanes haven't stored yet (white flashes, the picture whiting out; upstream PR seedds#1376).
  • Deadline boost off by default (V14): with it on, iOS put every thread on the efficiency cores once the phone warmed up. The launcher can still turn it on. A jump icon on X.

Build settings

DM_UPSCALER=metalfx
DM_FPS_HOLD=off
DM_THERMAL_CAP=0
DM_QOS_MAP=1
DM_QOS_EDGES=45,59
DM_NVN_GPUPROF=every:600
DM_METAL_HUD=0

Status

  • V16 is not yet tested on the iPhone. V15-touch2 on an iPhone 18 Pro at render scale 0.25 holds 60 fps for about a minute. At thermal state 1 (62 s), iOS cuts the CPU clock from 4.2 to about 1.7 GHz and the GPU slows (13 → 16–21 ms a frame): 37–43 fps. 30 fps holds steady.
  • Known: the GPU time barely changes between render scale 0.6 and 0.25, so most of it doesn't scale with the 3D view. MetalFX doesn't actually replace the game's upscaler in any phone log so far; the game's own upscaler runs.
  • Known: magenta or black textures can appear after some area changes.

Not affiliated with Nintendo.

A12 (pre-release): no first-visit pipeline freezes, the game's own touch controls, steady 30 on Standard

Choose a tag to compare

@cheemu21 cheemu21 released this 08 Nov 09:25

Pre-release: source code only. No IPA and nothing from the game are attached or in the repository. Build your own from your own dump of the game (base game + update v131072) with the steps in docs/games/kid-with-sword-remake-a.md.

The Legend of Zelda: Ocarina of Time (Switch 2) as a native iPhone app, on Aznracer's Mighty Green Kokiri Kid v3 with this fork's touch controls and launcher on top (nxnative). The A builds are on the a6 and a2 branches.

In this build (A12)

  • Fewer first-visit freezes, no RAM cost: the app ships a list of every pipeline the game's playthroughs reached (40,156 lines, from Aznracer's v3). While you play, one low-priority thread builds them only to fill iOS's shader cache, and keeps none. Pipelines never built on the phone cost about 300 ms each (compute 0.5–1.8 s) and froze the game on entering new areas; from the cache they take under a millisecond.
  • Touch controls follow the game's own Basic Controls: Y attacks (the large key), A actions, B put away, X jump, ZL target, ZR use item (new), R quick select. The game has no shield button: holding ZL raises the shield, and a quick tap on ZL locks it held. Earlier A builds had the sword on B and a "shield" on R, which did nothing.
  • Steady 30 fps on Standard (from A10 and A11): with Render scale 1.0 the game's own dynamic resolution runs with the right GPU timings, a 30 fps budget, and headroom (it steps down at about 28 ms, before frames go late). DM_DRS_BUDGET in Documents/env.txt tunes it. The log reports the 3D scale it picks.
  • Potato is locked at render scale 0.5 (1280×720 3D).

Earlier A builds

  • A9–A10: Standard's memory down from 6.85 to 5.43 GB peak on an iPhone with an A20 Pro (the pool cap and large pools by chunk, Potato's memory housekeeping); foliage textures always made (no popping); the game's own upscaler instead of MetalFX (less grass shimmer).
  • A8: grass and leaves no longer move 20× too fast (nxnative PR seedds#1714); the GPU gets new work only when it has run out.
  • A7: Zelda icons, the ZL target lock, a D-pad (← ocarina, → Navi, ↓ boots, ↑ accessory).
  • A4–A6: the launcher's Standard / Potato presets; Potato under 5 GB.

Status

  • A8–A12 are not yet tested on the iPhone. A8 on Potato ran 10.6 minutes at 4.1–4.9 GB (log 45). A10 on Standard at 30 fps held 33 ms except where the GPU needed 29–37 ms, which A11's headroom targets.
  • The first launch after an install builds the pipeline list from scratch in the background; until it has passed an area, that area still builds its pipelines as before.
  • Do not run it with LiveContainer's RAM donor ("Guest memory boost"): it redirects the app's own large allocations and crashed it.

Not affiliated with Nintendo.