DWG NO. HS-2011-03 // スプリットアトラス リポジトリ設計図
UPSTREAM: NotRexed/Hookshot (v2.0.11)クリーンルーム AOT パイプライン // 10大サブシステム

NotRexed/Hookshot GitHub 内部構造とソースビルド

NotRexed/Hookshot は、『ゼルダの伝説 Ocarina of Time』(タイトル ID 0400486024DEC000 v131072)の Nintendo Switch 2 リメイクをネイティブ x86_64 実行可能ファイルへと変換する、5層構造の静的リコンパイルパイプラインとして設計されています。nx2/ AArch64-to-C リフター、ネイティブ Horizon OS SDK 22.2.8 ランタイム(host/)、NVN2 API 231.40 コマンドストリームレコーダー、および Eden SM86-to-SPIR-V シェーダー変換(gpu/vk/)を備えた Vulkan 1.3 メッシュシェーダー再生エンジンを組み合わせることで、Hookshot は仮想マシンを介さずにゲームコードをネイティブ実行します。

FIG 3.0 // MODULE CUTAWAYNotRexed/Hookshot · v2.0.14
nx2/lift.py AArch64のリフティングからCシャードへの変換、host/ Horizon OS HLE、およびgpu/vk/ NVN2からVulkan 1.3 SPIR-Vへのシェーダーパイプラインを示すNotRexed/Hookshot GitHubリポジトリのアーキテクチャ図。
図 3.0 — NotRexed/Hookshot エンドツーエンド静的リコンパイル断面図:nx2/lift.py → work/sa/gen/*.c → hookshot.exe + hookshot_vk.dll
スプリットアトラス // リポジトリ サブシステム ディレクトリ

5モジュール リポジトリマップ&パーツリストテーブル(全10サブシステム)

左側のモジュールレールを使用して、検証済みの10個のリポジトリサブシステムをアーキテクチャレイヤー(AOT Lifter、ダンプ取り込み、Build&Link System、OS&サービスランタイム、グラフィックスAPIフロントエンド、Vulkan 1.3 Renderer、Shader Recompiler、テンポラルアップスケーリング、Builder UI、ツール類)ごとにフィルタリングするか、以下のパーツリスト一覧テーブルをご確認ください。

サブシステム&階層リポジトリパス開発言語&アップストリーム系譜生成出力アセット開発担当機能&連携関係
nx2/ 静的リコンパイル & AArch64 LifterAOT Lifter
nx2/lift.py, nx2/insn.py, nx2/nso2.py, nx2/image.py
Python 3 (Capstone, Unicorn 2.1, LZ4, Zstandard)mkw-recomp (7336f0a) + Rexcomp a64-kit
work/sa/gen/*.c(57個のCチャンク全体で約1.4 GB、294,450関数)
Switch 2のNSOモジュールをDT_RELR再配置付きで0x80000000にロードし、ジャンプテーブル(1,475テーブル)を解決して、17,668,191命令のARMv8.2+(UDOTを含む)をCに変換。
nx2/nup.py&nx2/unpack.pyダンプ抽出ツールダンプ取り込み
nx2/nup.py, nx2/unpack.py, nx2/dump.py, third_party/zbic
Python 3 + C(Atmosphere ZBICデコーダー)Hookshot / mkw-recomp
work/dump/exefs + work/dump/romfs(抽出後 26.2 GB)
0400486024DEC000 v131072向けのSwitch 2ダンプにおける7つの整合性シグナルを検証し、.nupアーカイブを展開して、ファームウェア22.0.0+のZBICエンコードされたメインNSOバイナリを伸長。
nx2/build.py & nx2/make_game.py Native コンパイラー DriverBuild & Link System
nx2/build.py, nx2/make_game.py, nx2/split_hot.py, nx2/pgo_pieces.py
Python 3 + Clang / LLD (llvm-mingw ucrt-x86_64)mkw-recomp + Hookshot split_hot PGOパイプライン
hookshot.exe (426 MB) / hookshot + image.bin
高負荷なリフト済みコードを8つの並行翻訳ユニットに分割し、LLVM rawフォーマット11のPGO分岐プロファイルを適用して、コールドチャンクを-O1、ホットチャンクを-O2でコンパイルしてネイティブ実行ファイルをリンク。
host/ Native Horizon OS&SDK 22.2.8 HLEランタイムOS&サービスランタイム
host/hos_main.c, host/hos_setjmp.c, host/nn_hid.c, host/nn_applet.c, host/posix/
C11 / Win32およびPOSIX Threads / AssemblyTOTKPort hos/(mkw-recomp経由で適合)
hookshot.exe / hookshotに直接リンク
実行時に485 nn:: SDK境界を置換し、512 GBのゲスト仮想アドレス空間を確保し、nn::osのファイバーをネイティブファイバーにマッピングして、ファイルシステム、オーディオ(libopus)、HIDコントローラーを処理します。
host/nvn_native.c NVN2(API 231.40)コマンドレコーダーグラフィックスAPIフロントエンド
host/nvn_native.c, host/nvn2.c, gpu/render/rx_nvn.h
C11mkw-recomp NVN2レイヤー
gpu/vk/向けインメモリNVN2命令ストリーム
ゲストメモリ上で直接Switch 2 NVN2 API 231.40プロシージャを実装し、サブミット時にメモリプールをキャプチャして、コマンドバッファのサブミッションをVulkanバックエンドへストリーミング。
gpu/vk/ Vulkan 1.3 BackendおよびQueue Replay EngineVulkan 1.3 Renderer
gpu/vk/vk_main.cpp, gpu/vk/vk_replay.cpp, gpu/vk/vk_memory.cpp, gpu/vk/vk_draw.cpp, gpu/vk/vk_coopmat.cpp
C++20 (Vulkan 1.3, VMA, Dear ImGui)mkw-recomp gpu/vk + Hookshot OoT修正
hookshot_vk.dll (Windows) / hookshot_vk.so (Linux)
NVN2コマンドストリームをVulkan 1.3上でVK_EXT_mesh_shaderを用いてリプレイし、キュー間WaitEvent同期を遵守し、TAAU/動画アップスケーリング用にHMMA f16コオペラティブマトリックスを実行し、Write-Back差分処理によりVRAMプールミラーを管理。
gpu/vk/eden/ Ampere SM86からMaxwellへの低水準化&SPIR-V RecompilerShader Recompiler
gpu/vk/eden/, lower_to_maxwell.h, structured_control_flow.cpp
C++20(Edenシェーダーリコンパイラー + sirit)Eden(Eglantine ビルド181)+ Lichii制御フロー修正
hookshot_programs.bin, hookshot_programs.idx, hookshot_pipelines.bin
10,154本のSwitch 2 Nin_Ounce_NVN2 Ampere SASS(SM86)シェーダー(249-GPR REGMAP_nx2頂点/メッシュプログラムおよびタスクシェーダーを含む)をMaxwell IRへと低水準化し、Vulkan SPIR-Vを出力。
gpu/vk/vk_dlss.cpp NVIDIA DLSS&内蔵AMD FSR 3.1アップスケーラー時間軸アップスケーリング&フレーム生成
gpu/vk/vk_dlss.cpp, gpu/vk/vk_menu.cpp
C++20 (NVIDIA NGX SDK 310.9.16, AMD FidelityFX SDK 1.1.4)Hookshotネイティブ統合
内蔵FSR 3.1 + ランタイムnvngx_dlss.dllローダー
OoTの動的解像度ジッター、モーションベクトル、深度バッファをインターセプトし、全GPUで動作する内蔵AMD FSR 3.1、またはnvngx_dlss.dllが存在する場合はオプションのNVIDIA DLSS超解像(Transformerプリセット K/M/L)を駆動します。
builder/ Hookshot Builder GUI(Windows WPFおよびLinux AppImage)プレイヤーLauncherおよびBuilder UI
builder/HookshotBuilder.sln, scripts/linux/appimage.sh
C#(Windows上の.NET 8 WPF)/ Linux上のシェル&PythonHookshot 公式ビルダー
HookshotBuilder.exe / Hookshot-x86_64.AppImage
ユーザーが用意した.nupまたはromfs+exefsダンプを検証し、著作権保護アセットを含まないローカルでの1回限り(10〜45分)のCビルドを統括し、プレイ/Update操作を提供します。
scripts/&tests/セーブ移行ユーティリティ、プロファイラー&リグレッションテスト群ツール群&検証系
scripts/oot_saves.py, scripts/prof.py, scripts/framelog.py, tests/run_all.py
Python 3およびPowerShellHookshot 公式ツール群
oot-save-backups/、CI用ゲームデータ不要リグレッションゲート
HookshotとSwitch 2エミュレーター群(Lichii、Eglantine、Orchid、NX2navi)間の双方向セーブ移行、1 msスタックサンプリング解析、およびゲームデータ不要のソースリグレッションテストを提供。
KPI-GH-01 // AOT LIFTER
17,668,191
リフト済みARMv8.2+命令数
アクティブなゲーム関数160,641件(57個のCチャンク全体で合計294,450件)
KPI-GH-02 // SHADER PIPELINE
10,154本 → 8,243本
NVN2 SM86からSPIR-V Shadersへ
gpu/vk/eden/経由で低水準化(249-GPR REGMAP_nx2 + メッシュ/タスクステージ)
KPI-GH-03 // HLE BOUNDARIES
485 nn::
Horizon SDK 22.2.8 インターセプト
512 GBゲスト仮想アドレス空間+ネイティブWin32/POSIXファイバーマッピング
KPI-GH-04 // PGO NATIVE LINK
426 MB
コンパイル済み hookshot.exe バイナリ
8つのホットな翻訳ユニットに分割(-O2 + LLVMフォーマット11 PGO)
ソースコンパイル設計書 // DEVELOPMENT.MD

ソースからNotRexed/HookshotをBuildする方法(Windows&Linux)

リフトされたCチャンクのデバッグやgpu/vk/内のVulkan 1.3レンダラーの変更を行うコントリビューターは、git cloneから直接4段階の開発者向けビルドパイプラインを実行できます。

ステージ 01 // DUMP展開&ZBICデコード

Switch 2ダンプの取り込み&検証(nx2/unpack.py)

タイトルID 0400486024DEC000 v131072(ExeFSメインNSO SHA-1接頭辞e0f3ccfa)の7つのダンプ整合性シグナルを検証し、26.2 GBのRomFSアーカイブを展開し、ファームウェア22.0.0+のZBICエンコードされたNSOセクションをthird_party/zbic経由で解凍します。

python nx2/unpack.py --input <path-to-0400486024DEC000-v131072> --out work/dump
ステージ 02 // AARCH64からCへの静的リフティング

1,766万命令のARMv8.2+命令をリフト(nx2/lift.py)

ゲストベース0x80000000にSwitch 2 NSOイメージをマッピングし、DT_RELR相対リロケーションを適用し、1,475個のジャンプテーブルを解決して、57個のチャンク(ホット/コールドPGO分離を伴う399個のコンパイルシャードに分割)にわたる約1.4 GBのCコードを出力します。

python nx2/lift.py --dump work/dump --out work/sa/gen
STAGE 03 // ネイティブ CLANG + PGO コンパイル

リフトされたシャードとLinkホストランタイムのコンパイル(nx2/make_game.py)

コールドCシャードを-O1で、8個のsplit_hot.py翻訳単位をLLVM rawフォーマット11の分岐プロファイル重み付きの-O2でコンパイルし、LLDを使用してhost/hos_main.cとリンクしてhookshot.exe(426 MB)およびimage.binを生成します。

python nx2/make_game.py --jobs 8 --pgo
STAGE 04 // VULKAN 1.3 バックエンド & リグレッションスイート

hookshot_vkのBuildとゲーム不要テストの実行(tests/run_all.py)

gpu/vk/(EdenのSM86からMaxwellへのシェーダー低水準化処理、sirit SPIR-Vエミッター、VMAメモリープール、FSR 3.1 / DLSSフックを含む)をhookshot_vk.dll / hookshot_vk.soにコンパイルし、すべてのソースリグレッションゲートを検証します。

cmake -B build -G Ninja -DCMAKE_BUILD_TYPE=Release && cmake --build build && python tests/run_all.py
技術仕様 // ARM64 リフター・HLE・SPIR-V 変換

nx2/ AArch64 Lifterおよびhost/ Horizon OS SDK 22.2.8ランタイムの内部構造

NotRexed/Hookshotリフターはmkw-recomp(コミット7336f0a)およびRexcompのa64-kitから派生し、Nintendo SDK 22.2.8およびファームウェア22.0.0+向けにコンパイルされたSwitch 2 Ocarina of Timeリメイクバイナリ専用に拡張されています。ファームウェア22.0.0+はNSOセグメントをZBICで圧縮するため、nx2/unpack.pyはゲストアドレス0x80000000にイメージをロードする前にAtmosphereのZBICデコーダーを統合しています。リフターはUDOTなどのSIMDドット積命令を含む17,668,191個のARMv8.2+命令をC関数へと変換し、nx2/split_hot.pyはLLVMフォーマット11のPGOプロファイルを利用して最もホットな実行パスを8個の-O2翻訳単位に分離することで、フルマルチコアビルドが10〜45分で完了するようにします。

実行時、host/hos_main.cは連続した512 GBの仮想アドレス領域を確保し、ゲストの64ビットポインターを最小限のオーバーヘッドで逆参照できるようにします。Horizon OSカーネルをエミュレートする代わりに、Hookshotは485 nn:: SDKシンボル境界を直接インターセプトします。これにより、nn::osファイバーをネイティブのWin32ファイバーまたはPOSIXのsetjmp/ucontextコルーチンにマッピングし、nn::fsの読み取りを展開済みのwork/dump/romfsディレクトリへルーティングし、環境音やカットシーンのオーディオストリームをlibopusでデコードし、SDL3のゲームパッド/ジャイロスコープイベントをnn::hidコントローラー状態へと変換します。

NVN2(API 231.40)コマンドReplayおよびEden SM86からSPIR-V Shaderへの低水準化

Switch 2タイトルは、独自のNin_Ounce_NVN2シェーダーヘッダーと249-GPR REGMAP_nx2レジスタファイルを備えたNVIDIA Ampere SM86ハードウェアをターゲットとするNVN2(APIバージョン231.40)を通じてレンダリングを行います。Hookshotのhost/nvn_native.cはゲストメモリ上で直接NVN2コマンド記録を実装し、hookshot_vk.dll / hookshot_vk.soへの送信をストリーミングします。gpu/vk/eden/内では、HookshotがEdenシェーダーリコンパイラー(Lichii構造化制御フロー修正を含むEglantineビルド181)を適合させて、タスクおよびメッシュシェーダーステージを含む10,154個のAmpere SM86 SASSバイナリをMaxwell IRに低水準化し、標準のVulkan 1.3 SPIR-Vモジュール(hookshot_programs.binにキャッシュされる8,243個のアクティブなランタイムパイプラインプログラム)を出力します。

さらに、このリメイクエンジンはテンポラルアンチエイリアシングアップスケーリング(TAAU)およびプリレンダリングされたカットシーンのデコードのために、コンピュートシェーダー内でAmpere HMMA.1688.F16テンソル命令に依存しています。Hookshotのgpu/vk/vk_coopmat.cppは、ホストGPUでサポートされている場合にそれらの操作をVK_KHR_cooperative_matrixに変換し、gpu/vk/vk_dlss.cppでエンジンのジッターとモーションベクトルをインターセプトして、内蔵のAMD FSR 3.1(FidelityFX SDK 1.1.4)またはオプションのNVIDIA DLSS超解像(NGX SDK 310.9.16)を駆動します。

技術 FAQ // 検証済み回答

GitHubアーキテクチャ&ソースBuild FAQ

NotRexed/Hookshot のアップストリーム系統はどうなっていますか?

Hookshotは、AArch64からCへの静的リフティングのためにmkw-recomp(コミット7336f0a)およびRexcompのa64-kitを、Horizon OS HLEランタイムシムのためにTOTKPortのhos/レイヤーを、そしてSwitch 2のAmpere SM86シェーダーをVulkan 1.3 SPIR-Vへ低水準化するためにEden(Eglantineビルド181)+ Lichiiシェーダーリコンパイラーをベースに構築されています。

Switch 2 のゲームダンプがなくても NotRexed/Hookshot のテストスイートを実行できますか?

はい。python tests/run_all.py を実行するとゲーム不要の CI リグレッションスイートが走ります。著作権で保護された RomFS や ExeFS ファイルを必要とせずに、リフター命令セマンティクス、ホストヘッダーパッケージング (#990)、および Vulkan バックエンドの初期化を検証できます。

なぜコンパイル時にCコードをコールド(-O1)チャンクとホット(-O2)チャンクに分割するのですか?

リフトされた全294,450個の関数(57チャンクにわたる約1.4 GBの生成C)をすべて-O2でコンパイルすると、数時間かかりシステムのRAMを使い果たしてしまいます。Hookshotのnx2/split_hot.pyは、最も頻繁に実行される関数を8個のホット翻訳単位に分離してLLVM PGOの重み付き-O2でコンパイルし、残りのコールドチャンクは-O1でコンパイルします。

公式リポジトリによる根拠

公式アーキテクチャ & 開発ドキュメント情報源