Files
nxnative-easy/dm/games/0100535012974000/README.md
T
seedds 3a993fa3fe Subsystem references and a symptom index: the failure catalogue of docs/agents/03-bringup.md and the per-title material of docs/agents/04-graphics.md (section 1's container list, section 6 and its "Seen in <game>" subsections) move into docs/reference/, one heading per mechanism: rewriter.md, memory.md, threads.md, services.md, movies.md, audio.md, frame-rate.md, nvn-objects.md, rendering.md (with the Vulkan and OpenGL layers), shaders.md and game-state.md, indexed by docs/reference/README.md. Each entry gives the symptom, the cause, the fix (file and function), the games it was found on (linked to their notes in dm/games/<id>/README.md) and any check, caveat or later change; one mechanism met on several games is one entry. docs/agents/symptoms.md lists every entry's symptom (an assertion, a [RED] line, an abort or crash site, a visible result) with a link to it, 350 lines, generated from the Symptom bullets. 03 keeps the loop and reading the log, and its Failure catalogue section now points to the references, the index and where a new finding goes; 04 keeps sections 1-5 and 7 (the container list is shaders.md's Containers by engine), and section 6 says where each kind of finding is. Facts in the old sections about one game only were checked against that game's note, where they already were. Statements the code no longer matches are marked as history beside the current value (movie output slots: MD_NOUT 64, MD_NOUT_AAC 32, MD_NOUT_VIDEO 16; APP_POOL is the profile key app_pool; Engage's layout is 5 / 4.375 GB; inline uniform updates are deferred by default; scaled copies are drawn), and Tears of the Kingdom joins the node-area entry's build list (issue #70). The game notes, docs/agents/README.md, 02 and 05 link to the exact entries, and so do the comments in nvn_mtl.m (nvnTextureCompare) and hle_audio.c (the RemoteIO buffer) and the provisional-profile note in profile_guess.py. 03 goes from 29,600 to 470 words, 04 from 34,400 to 3,500. Checked: every backticked span, module address, issue / PR number and 16-digit hash of AGENTS.md, development.md, dm/games/README.md and docs/agents/01-05 at 6a06877 (4,600 items) still appears in the repository's Markdown (the same five file patterns as before appear as the full names they stood for), every relative link and heading anchor in the repository's Markdown resolves, and the tool tests pass (the four that need capstone or lz4 in the T7 venv)
2026-10-25 12:31:58 +08:00

4.7 KiB

Hades (0100535012974000)

Update 1.0.38233 (v589824), SDK 9.3.0. Supergiant Games' engine on The Forge renderer, on Vulkan, not NVN: main imports 100 vk* functions from subsdk0 (the Vulkan loader), which sits on NVIDIA's driver in subsdk1 (NVN, OpenGL, Vulkan). The host implements those functions on Metal itself (dm/gfx/vk/hle_vk.m), so only main and sdk are loaded. Plays on the iPhone.

What it needs

Setting Where Why
modules main sdk game.tsv subsdk0 / subsdk1 (Vulkan loader, NVIDIA driver) are replaced by the host's Vulkan layer and not loaded
4 GB layout: mem_reserve 0x100000000, mem_alias 0x10000000, mem_stack 0x10000000, app_pool 0xCD500000 game.tsv the NPDM declares no system resource (META +0x14 = 0), so the game uses SetHeapSize. Link's Awakening's partition, not measured for this game
pad_layout full game.tsv the 3D gamepad layout: the right stick aims the cast
Vulkan shaders through vk_shaders.py NSP script the game has no NVN shaders (shader_note); see Files and shaders

Vulkan layer

The layer was written for this game (Super Mario Galaxy extended it later: 010099C022B96000).

  • Current: one Tegra X1-like device (Vulkan 1.1). Device memory is a shared MTLBuffer made on first use; images are their own textures.
  • Current: command buffers are recorded and replayed into one Metal command buffer per submit on the layer's own queue. Swapchain images are shown through the NVN layer's present path once their frame's GPU work is done.
  • Current: names the game asks for through vkGet*ProcAddr are logged once each.
  • How the host tells the API apart: a main that imports Vulkan functions and not nvnBootstrapLoader renders with Vulkan. profile_guess.py leaves vkGetInstanceProcAddr (SDL's Vulkan loader in other games) out of its Vulkan count; Hades and both Galaxies import 99 or 100 Vulkan functions, vkCreateInstance among them.

Files and shaders

  • 74 SPIR-V files in Content/EffectsForgeSwitch (.vert / .frag; the .shader files list each program's pair). romfs_marker is Content/EffectsForgeSwitch/Default.vert.
  • dm/gfx/tools/vk_shaders.py <RomFS> <shader dir> [--ios <dir>] translates them with SPIRV-Cross into <dir>/vk/: one library, and a table of the Metal slot each (set, binding) moved to. The game hands the same words to vkCreateShaderModule, so the host finds each shader by the hash of its SPIR-V.
  • Packing: for a Vulkan game the NSP script runs vk_shaders.py (Mac and iOS libraries in <id>_build/shader/vk and shader/ios/vk) in place of the NVN shader split and chain build, and build_ipa.sh ships $MSL_IOS/vk instead of the NVN chain libraries (GFXAPI). The NVN shader tables stay empty.

Services

  • Resolved: the notification event. The game polls oe::GetNotificationMessageEvent every frame. The SDK's own event was never created (the host's oe::Initialize is a no-op), so the host now hands out an event of its own, signalled while a notification is queued.
  • Current: offline. main imports EOS_* functions (Epic Online Services, from /nro/EOSSDK-Switch-Shipping.nro, loaded through nn::ro); they stay offline. main imports only EOS Auth, Connect and PlayerDataStorage (Epic-account cross-save, which the host cannot serve). Since the host loads NROs, it refuses online SDKs: an NRR that registers only such modules fails RegisterModuleInfo, and Hades never asks for the module (checked on 1.0.38233: refused an NRR that registers only online SDKs (1 hashes), no LoadModule, its frames as before).

Rewriter

  • Under the spin-wait search with the lock, test and store rules, Hades' modules rewrite byte for byte as before (development.md, Power).

Mac routes

  • DM_KEYS="f800:A,f1000:A,f1200:A,f1500:A,f1900:A" goes through the title and the intro into Tartarus.

Found on this game

General host changes first needed here; each applies to every game:

Open

  • The memory partition is Link's Awakening's, not measured for this game (game.tsv).
  • Online SDKs in NROs: always load them, refuse them (as now) or decide per profile is an open question for the maintainer (Online SDKs in NROs are never loaded).