Skip to content

feat(dread): Metroid Dread 2.1.0, with its shaders and pipelines prepared on the Mac, the movie Stop fix and the end-of-stream audio fix - #2144

Merged
ly05010419 merged 2 commits into
ly05010419:mainfrom
Legend-of-Link-27:feat/dread-210
Nov 14, 2026
Merged

ly05010419 merged 2 commits into
ly05010419:mainfrom
Legend-of-Link-27:feat/dread-210

Conversation

@Legend-of-Link-27

Copy link
Copy Markdown
Contributor

Moves games/dread from 1.0.0 to the latest update, 2.1.0, and closes what playing it showed.

2.1.0

  • build.py takes the update NSP (--update, required): the code comes from its ExeFS (scripts/extract_code.py), the RomFS is the base's merged with the update's BKTR image (scripts/merge_romfs.py, all six IVFC levels verified). Both scripts come from Echoes of Wisdom.
  • assets/expected-v2.1.0.json replaces the 1.0.0 pins (9,774 files, 5.3 GB). Only main changes in 2.1.0; sdk, subsdk0 and the 1,010 shaders are byte-identical to 1.0.0's.
  • Rewrite: structck.py OK and equiv.py 0 divergent on all three modules; make probe maps rewritten/v210.

Shaders and pipelines on the Mac

  • The Mac build prepares the shader seed (make shader-seed) and compiles it into Metal libraries (make shader-libs, scripts/build_shader_libs.py, Echoes of Wisdom's). No shader is translated and no library is compiled while playing the opening.
  • The 128 render pipelines the opening builds are R rows in assets/shader_list.tsv. The seed's warm-up builds them in the background. On the route to Artaria (A/B, two runs per arm), synchronous pipeline builds in play go from 128 to 0; both arms recorded 47 frames over 50 ms.
  • scripts/shader_list.py keeps Dread's pipeline keys as recorded: this runtime has no pso_key_norm.

Movie Stop / Reset

  • runtime/movie_host.c clears the held frames when it frees them (Echoes of Wisdom's and Kirby's fix). A late GetOutputBuffer now answers ST_ERROR instead of reading a freed frame.
  • tests/movie_stop (in make test, AddressSanitizer) covers Stop and Reset in buffer and texture mode, and checks that the decoder works again afterwards. The earlier movie crashes listed in the CHANGELOG stay open.

The audio tick

  • Dread streams its music and movie audio in DSP-ADPCM buffers of 14,336 samples at 44.1 kHz, and marks every buffer end of stream with more queued. The renderer stopped the voice for the rest of the 5 ms frame after each one, leaving a gap every 325 ms.
  • It now plays on into the next queued buffer, as the DSP does and as Breath of the Wild already does upstream (AUDIO_EOS_PLAYS_ON).
  • probe-audio checks both the cursor (Breath of the Wild's probe) and the mixed output (new). On a capture of the movie and the title, the steps 325 ms apart went from 73 to 0, and the player heard the noise gone.

Builds without Homebrew

  • opus and libvpx come from tools/deps, and build.py no longer searches Homebrew prefixes for git and make.
  • prebuilt/macos-arm64/totk_xlate is byte-identical to the Astral Chain, Bayonetta 3 and Echoes of Wisdom copies (SHA-256 6dd53d6486c96e3a95ae5fd49fdc35f75f6e603ff8ededa3d7250fd2e4fe1220).

Checked on macOS

  • build.py from scratch with base and update NSPs, on a PATH without Homebrew.
  • make probe and make test.
  • probe-audio (46,835 checks).
  • tests/test_no_homebrew.py, test_dread_shader_seed.py, test_packaging_standard.py and test_dread_romfs_paths.
  • The generated app reached Artaria (HUD, 15/15 missiles) with a fresh profile.
  • iPhone / iPad: the build scripts are updated for 2.1.0, but no iOS package was built; 2.1.0 was validated on macOS only.

Anonymous added 2 commits November 13, 2026 13:14
…ared on the Mac, the movie Stop fix and the end-of-stream audio fix

- 2.1.0: build.py takes the update NSP (--update); the code comes from its ExeFS (scripts/extract_code.py), the
  RomFS is the base's merged with the update's BKTR image (scripts/merge_romfs.py); assets/expected-v2.1.0.json
  replaces the 1.0.0 pins; make probe maps rewritten/v210.
- Mac shaders: the build prepares the seed (make shader-seed) and its Metal libraries (make shader-libs); the 128
  render pipelines of the opening are R rows of assets/shader_list.tsv, warmed before play (128 -> 0 synchronous
  builds on the route to Artaria; both A/B arms recorded 47 frames over 50 ms). shader_list.py keeps Dread's keys
  as recorded (no pso_key_norm in this runtime).
- Movie Stop / Reset: movie_host.c clears the held frames when it frees them; tests/movie_stop covers buffer and
  texture mode.
- Audio: every streamed buffer is end of stream with more queued; the voice now plays on into the next one in the
  same frame (AUDIO_EOS_PLAYS_ON), as the DSP does. probe-audio checks the cursor and the mixed output.
- No Homebrew: opus and libvpx from tools/deps, build.py searches no Homebrew prefix; the prebuilt totk_xlate is
  byte-identical to the alc, by3 and eow copies (SHA-256 6dd53d64...).
- Validated on macOS (clean build from scratch, probe, tests, the app to Artaria); the iOS scripts are updated for
  2.1.0 but no iOS package was built.
…he suite's earlier TOTK one does not stand in

In the whole suite test_ns2_key_rule and test_shader_contrib import Tears of the Kingdom's shader_list.py first; it
normalizes pipeline keys and Dread's does not, so prepare_shader_seed got the wrong module and the warm pipeline test
failed in CI (Source tests (core)). The build is not affected: each script runs in its own process.
@ly05010419
ly05010419 merged commit 5d1ca3b into ly05010419:main Nov 14, 2026
1 of 4 checks passed

Copy link
Copy Markdown
Owner

已合并并推送,并补充统一打包和更新路径:5b3b359a。

恢复 1.0.0 与 2.1.0 各自的输入身份校验;接入 MNG 构建/更新、共享依赖、独立签名 ShaderData、App 外并行管线存档及新进程验证、标题前完整预热、准确清单核对、按输入复用和保留 App 目录。RomFS 复用检查实际字节,修改后的数据不能凭旧索引通过。

本机电影/纹理区域原生测试、Dread Python 测试、打包与 MNG 路由回归通过,共享图形代码 iOS 编译检查通过。游戏数据仍采用原有外部 work 布局,须保留该目录;该后端贡献格式尚无网站 schema,保持本地人工合并,不冒用其他游戏身份。

未做这条新打包链的完整游戏构建、游玩或 iPad 验收,文档已注明。谢谢贡献。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants